From 5f1019d9fd37b4647c484f34f74fec5a6c569f81 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 1 Dec 2022 13:42:56 +0000 Subject: [PATCH 001/386] Creating pure BB-CouchDB image. --- hosting/bbcouch/Dockerfile | 31 ++++++++++++++++++++++ hosting/bbcouch/clouseau/clouseau | 12 +++++++++ hosting/bbcouch/clouseau/clouseau.ini | 13 +++++++++ hosting/bbcouch/clouseau/log4j.properties | 4 +++ hosting/bbcouch/couch/local.ini | 5 ++++ hosting/bbcouch/couch/vm.args | 32 +++++++++++++++++++++++ hosting/bbcouch/runner.sh | 7 +++++ 7 files changed, 104 insertions(+) create mode 100644 hosting/bbcouch/Dockerfile create mode 100644 hosting/bbcouch/clouseau/clouseau create mode 100644 hosting/bbcouch/clouseau/clouseau.ini create mode 100644 hosting/bbcouch/clouseau/log4j.properties create mode 100644 hosting/bbcouch/couch/local.ini create mode 100644 hosting/bbcouch/couch/vm.args create mode 100644 hosting/bbcouch/runner.sh diff --git a/hosting/bbcouch/Dockerfile b/hosting/bbcouch/Dockerfile new file mode 100644 index 0000000000..7f2f4815d5 --- /dev/null +++ b/hosting/bbcouch/Dockerfile @@ -0,0 +1,31 @@ +FROM couchdb:3.2.1 + +ENV COUCHDB_USER admin +ENV COUCHDB_PASSWORD admin +EXPOSE 5984 + +RUN apt-get update && apt-get install -y software-properties-common wget unzip curl && \ + apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && \ + apt-get update && apt-get install -y openjdk-8-jdk + +# setup clouseau +WORKDIR / +RUN wget https://github.com/cloudant-labs/clouseau/releases/download/2.21.0/clouseau-2.21.0-dist.zip && \ + unzip clouseau-2.21.0-dist.zip && \ + mv clouseau-2.21.0 /opt/clouseau && \ + rm clouseau-2.21.0-dist.zip + +WORKDIR /opt/clouseau +RUN mkdir ./bin +ADD clouseau/clouseau ./bin/ +ADD clouseau/log4j.properties clouseau/clouseau.ini ./ +RUN chmod +x ./bin/clouseau + +# setup CouchDB +WORKDIR /opt/couchdb +ADD couch/vm.args couch/local.ini ./etc/ + +WORKDIR / +ADD runner.sh ./bbcouch-runner.sh +RUN chmod +x ./bbcouch-runner.sh +ENTRYPOINT ["./bbcouch-runner.sh"] diff --git a/hosting/bbcouch/clouseau/clouseau b/hosting/bbcouch/clouseau/clouseau new file mode 100644 index 0000000000..1095ea24cb --- /dev/null +++ b/hosting/bbcouch/clouseau/clouseau @@ -0,0 +1,12 @@ +#!/bin/sh +/usr/bin/java -server \ + -Xmx2G \ + -Dsun.net.inetaddr.ttl=30 \ + -Dsun.net.inetaddr.negative.ttl=30 \ + -Dlog4j.configuration=file:/opt/clouseau/log4j.properties \ + -XX:OnOutOfMemoryError="kill -9 %p" \ + -XX:+UseConcMarkSweepGC \ + -XX:+CMSParallelRemarkEnabled \ + -classpath '/opt/clouseau/*' \ + com.cloudant.clouseau.Main \ + /opt/clouseau/clouseau.ini \ No newline at end of file diff --git a/hosting/bbcouch/clouseau/clouseau.ini b/hosting/bbcouch/clouseau/clouseau.ini new file mode 100644 index 0000000000..578a5acafa --- /dev/null +++ b/hosting/bbcouch/clouseau/clouseau.ini @@ -0,0 +1,13 @@ +[clouseau] + +; the name of the Erlang node created by the service, leave this unchanged +name=clouseau@127.0.0.1 + +; set this to the same distributed Erlang cookie used by the CouchDB nodes +cookie=monster + +; the path where you would like to store the search index files +dir=DATA_DIR/search + +; the number of search indexes that can be open simultaneously +max_indexes_open=500 diff --git a/hosting/bbcouch/clouseau/log4j.properties b/hosting/bbcouch/clouseau/log4j.properties new file mode 100644 index 0000000000..9d4d9311bc --- /dev/null +++ b/hosting/bbcouch/clouseau/log4j.properties @@ -0,0 +1,4 @@ +log4j.rootLogger=debug, CONSOLE +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %c [%p] %m%n \ No newline at end of file diff --git a/hosting/bbcouch/couch/local.ini b/hosting/bbcouch/couch/local.ini new file mode 100644 index 0000000000..266c0d4b60 --- /dev/null +++ b/hosting/bbcouch/couch/local.ini @@ -0,0 +1,5 @@ +; CouchDB Configuration Settings + +[couchdb] +database_dir = DATA_DIR/couch/dbs +view_index_dir = DATA_DIR/couch/views diff --git a/hosting/bbcouch/couch/vm.args b/hosting/bbcouch/couch/vm.args new file mode 100644 index 0000000000..e9e4416863 --- /dev/null +++ b/hosting/bbcouch/couch/vm.args @@ -0,0 +1,32 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# erlang cookie for clouseau security +-name couchdb@127.0.0.1 +-setcookie monster + +# Ensure that the Erlang VM listens on a known port +-kernel inet_dist_listen_min 9100 +-kernel inet_dist_listen_max 9100 + +# Tell kernel and SASL not to log anything +-kernel error_logger silent +-sasl sasl_error_logger false + +# Use kernel poll functionality if supported by emulator ++K true + +# Start a pool of asynchronous IO threads ++A 16 + +# Comment this line out to enable the interactive Erlang shell on startup ++Bd -noinput diff --git a/hosting/bbcouch/runner.sh b/hosting/bbcouch/runner.sh new file mode 100644 index 0000000000..01b4aee3dc --- /dev/null +++ b/hosting/bbcouch/runner.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +/docker-entrypoint.sh /opt/couchdb/bin/couchdb & +sleep 10 +curl -X PUT http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@localhost:5984/_users +curl -X PUT http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@localhost:5984/_replicator +sleep infinity \ No newline at end of file From 9b144f61f74fd0318a4fa2f3f5898733db482fe6 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 1 Dec 2022 17:08:49 +0000 Subject: [PATCH 002/386] Updating single image, break out couchdb config into its own image. --- hosting/{bbcouch => couchdb}/Dockerfile | 11 ++--- hosting/couchdb/build-target-paths.sh | 24 +++++++++++ .../{bbcouch => couchdb}/clouseau/clouseau | 0 .../clouseau/clouseau.ini | 0 .../clouseau/log4j.properties | 0 hosting/{bbcouch => couchdb}/couch/local.ini | 0 hosting/{bbcouch => couchdb}/couch/vm.args | 0 hosting/{bbcouch => couchdb}/runner.sh | 6 +++ hosting/single/Dockerfile | 40 ++----------------- hosting/single/clouseau/clouseau | 12 ------ hosting/single/clouseau/clouseau.ini | 13 ------ hosting/single/clouseau/log4j.properties | 4 -- hosting/single/couch/local.ini | 5 --- hosting/single/couch/vm.args | 32 --------------- hosting/single/runner.sh | 12 ++---- package.json | 1 + 16 files changed, 44 insertions(+), 116 deletions(-) rename hosting/{bbcouch => couchdb}/Dockerfile (64%) create mode 100644 hosting/couchdb/build-target-paths.sh rename hosting/{bbcouch => couchdb}/clouseau/clouseau (100%) rename hosting/{bbcouch => couchdb}/clouseau/clouseau.ini (100%) rename hosting/{bbcouch => couchdb}/clouseau/log4j.properties (100%) rename hosting/{bbcouch => couchdb}/couch/local.ini (100%) rename hosting/{bbcouch => couchdb}/couch/vm.args (100%) rename hosting/{bbcouch => couchdb}/runner.sh (53%) delete mode 100644 hosting/single/clouseau/clouseau delete mode 100644 hosting/single/clouseau/clouseau.ini delete mode 100644 hosting/single/clouseau/log4j.properties delete mode 100644 hosting/single/couch/local.ini delete mode 100644 hosting/single/couch/vm.args diff --git a/hosting/bbcouch/Dockerfile b/hosting/couchdb/Dockerfile similarity index 64% rename from hosting/bbcouch/Dockerfile rename to hosting/couchdb/Dockerfile index 7f2f4815d5..11fab7129f 100644 --- a/hosting/bbcouch/Dockerfile +++ b/hosting/couchdb/Dockerfile @@ -4,9 +4,10 @@ ENV COUCHDB_USER admin ENV COUCHDB_PASSWORD admin EXPOSE 5984 -RUN apt-get update && apt-get install -y software-properties-common wget unzip curl && \ +RUN apt-get update && apt-get install -y --no-install-recommends software-properties-common wget unzip curl && \ apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && \ - apt-get update && apt-get install -y openjdk-8-jdk + apt-get update && apt-get install -y --no-install-recommends openjdk-8-jre && \ + rm -rf /var/lib/apt/lists/ # setup clouseau WORKDIR / @@ -19,13 +20,13 @@ WORKDIR /opt/clouseau RUN mkdir ./bin ADD clouseau/clouseau ./bin/ ADD clouseau/log4j.properties clouseau/clouseau.ini ./ -RUN chmod +x ./bin/clouseau # setup CouchDB WORKDIR /opt/couchdb ADD couch/vm.args couch/local.ini ./etc/ WORKDIR / +ADD build-target-paths.sh . ADD runner.sh ./bbcouch-runner.sh -RUN chmod +x ./bbcouch-runner.sh -ENTRYPOINT ["./bbcouch-runner.sh"] +RUN chmod +x ./bbcouch-runner.sh /opt/clouseau/bin/clouseau ./build-target-paths.sh +CMD ["./bbcouch-runner.sh"] diff --git a/hosting/couchdb/build-target-paths.sh b/hosting/couchdb/build-target-paths.sh new file mode 100644 index 0000000000..67e1765ca8 --- /dev/null +++ b/hosting/couchdb/build-target-paths.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +echo ${TARGETBUILD} > /buildtarget.txt +if [[ "${TARGETBUILD}" = "aas" ]]; then + # Azure AppService uses /home for persisent data & SSH on port 2222 + DATA_DIR=/home + WEBSITES_ENABLE_APP_SERVICE_STORAGE=true + mkdir -p $DATA_DIR/{search,minio,couch} + mkdir -p $DATA_DIR/couch/{dbs,views} + chown -R couchdb:couchdb $DATA_DIR/couch/ + apt update + apt-get install -y openssh-server + echo "root:Docker!" | chpasswd + mkdir -p /tmp + chmod +x /tmp/ssh_setup.sh \ + && (sleep 1;/tmp/ssh_setup.sh 2>&1 > /dev/null) + cp /etc/sshd_config /etc/ssh/sshd_config + /etc/init.d/ssh restart + sed -i "s#DATA_DIR#/home#g" /opt/clouseau/clouseau.ini + sed -i "s#DATA_DIR#/home#g" /opt/couchdb/etc/local.ini +else + sed -i "s#DATA_DIR#/data#g" /opt/clouseau/clouseau.ini + sed -i "s#DATA_DIR#/data#g" /opt/couchdb/etc/local.ini +fi \ No newline at end of file diff --git a/hosting/bbcouch/clouseau/clouseau b/hosting/couchdb/clouseau/clouseau similarity index 100% rename from hosting/bbcouch/clouseau/clouseau rename to hosting/couchdb/clouseau/clouseau diff --git a/hosting/bbcouch/clouseau/clouseau.ini b/hosting/couchdb/clouseau/clouseau.ini similarity index 100% rename from hosting/bbcouch/clouseau/clouseau.ini rename to hosting/couchdb/clouseau/clouseau.ini diff --git a/hosting/bbcouch/clouseau/log4j.properties b/hosting/couchdb/clouseau/log4j.properties similarity index 100% rename from hosting/bbcouch/clouseau/log4j.properties rename to hosting/couchdb/clouseau/log4j.properties diff --git a/hosting/bbcouch/couch/local.ini b/hosting/couchdb/couch/local.ini similarity index 100% rename from hosting/bbcouch/couch/local.ini rename to hosting/couchdb/couch/local.ini diff --git a/hosting/bbcouch/couch/vm.args b/hosting/couchdb/couch/vm.args similarity index 100% rename from hosting/bbcouch/couch/vm.args rename to hosting/couchdb/couch/vm.args diff --git a/hosting/bbcouch/runner.sh b/hosting/couchdb/runner.sh similarity index 53% rename from hosting/bbcouch/runner.sh rename to hosting/couchdb/runner.sh index 01b4aee3dc..ad366ccb3d 100644 --- a/hosting/bbcouch/runner.sh +++ b/hosting/couchdb/runner.sh @@ -1,5 +1,11 @@ #!/bin/bash +DATA_DIR=${DATA_DIR:-/data} +mkdir -p ${DATA_DIR} +mkdir -p ${DATA_DIR}/couch/{dbs,views} +mkdir -p ${DATA_DIR}/search +chown -R couchdb:couchdb ${DATA_DIR}/couch +/build-target-paths.sh /docker-entrypoint.sh /opt/couchdb/bin/couchdb & sleep 10 curl -X PUT http://${COUCHDB_USER}:${COUCHDB_PASSWORD}@localhost:5984/_users diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index 58796f0362..eef5dab077 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -18,7 +18,7 @@ WORKDIR /worker ADD packages/worker . RUN node /pinVersions.js && yarn && yarn build && /cleanup.sh -FROM couchdb:3.2.1 +FROM budibase-couchdb ARG TARGETARCH ENV TARGETARCH $TARGETARCH #TARGETBUILD can be set to single (for single docker image) or aas (for azure app service) @@ -29,23 +29,9 @@ ENV TARGETBUILD $TARGETBUILD COPY --from=build /app /app COPY --from=build /worker /worker -# ENV CUSTOM_DOMAIN=budi001.custom.com \ -# See runner.sh for Env Vars -# These secret env variables are generated by the runner at startup -# their values can be overriden by the user, they will be written -# to the .env file in the /data directory for use later on -# REDIS_PASSWORD=budibase \ -# COUCHDB_PASSWORD=budibase \ -# COUCHDB_USER=budibase \ -# COUCH_DB_URL=http://budibase:budibase@localhost:5984 \ -# INTERNAL_API_KEY=budibase \ -# JWT_SECRET=testsecret \ -# MINIO_ACCESS_KEY=budibase \ -# MINIO_SECRET_KEY=budibase \ - # install base dependencies RUN apt-get update && \ - apt-get install -y software-properties-common wget nginx uuid-runtime && \ + apt-get install -y --no-install-recommends software-properties-common nginx uuid-runtime redis-server && \ apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && \ apt-get update @@ -53,7 +39,7 @@ RUN apt-get update && \ WORKDIR /nodejs RUN curl -sL https://deb.nodesource.com/setup_16.x -o /tmp/nodesource_setup.sh && \ bash /tmp/nodesource_setup.sh && \ - apt-get install -y libaio1 nodejs nginx openjdk-8-jdk redis-server unzip && \ + apt-get install -y --no-install-recommends libaio1 nodejs && \ npm install --global yarn pm2 # setup nginx @@ -68,23 +54,6 @@ RUN mkdir -p scripts/integrations/oracle ADD packages/server/scripts/integrations/oracle scripts/integrations/oracle RUN /bin/bash -e ./scripts/integrations/oracle/instantclient/linux/install.sh -# setup clouseau -WORKDIR / -RUN wget https://github.com/cloudant-labs/clouseau/releases/download/2.21.0/clouseau-2.21.0-dist.zip && \ - unzip clouseau-2.21.0-dist.zip && \ - mv clouseau-2.21.0 /opt/clouseau && \ - rm clouseau-2.21.0-dist.zip - -WORKDIR /opt/clouseau -RUN mkdir ./bin -ADD hosting/single/clouseau/clouseau ./bin/ -ADD hosting/single/clouseau/log4j.properties hosting/single/clouseau/clouseau.ini ./ -RUN chmod +x ./bin/clouseau - -# setup CouchDB -WORKDIR /opt/couchdb -ADD hosting/single/couch/vm.args hosting/single/couch/local.ini ./etc/ - # setup minio WORKDIR /minio ADD scripts/install-minio.sh ./install.sh @@ -97,9 +66,6 @@ RUN chmod +x ./runner.sh ADD hosting/single/healthcheck.sh . RUN chmod +x ./healthcheck.sh -ADD hosting/scripts/build-target-paths.sh . -RUN chmod +x ./build-target-paths.sh - # Script below sets the path for storing data based on $DATA_DIR # For Azure App Service install SSH & point data locations to /home ADD hosting/single/ssh/sshd_config /etc/ diff --git a/hosting/single/clouseau/clouseau b/hosting/single/clouseau/clouseau deleted file mode 100644 index 1095ea24cb..0000000000 --- a/hosting/single/clouseau/clouseau +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -/usr/bin/java -server \ - -Xmx2G \ - -Dsun.net.inetaddr.ttl=30 \ - -Dsun.net.inetaddr.negative.ttl=30 \ - -Dlog4j.configuration=file:/opt/clouseau/log4j.properties \ - -XX:OnOutOfMemoryError="kill -9 %p" \ - -XX:+UseConcMarkSweepGC \ - -XX:+CMSParallelRemarkEnabled \ - -classpath '/opt/clouseau/*' \ - com.cloudant.clouseau.Main \ - /opt/clouseau/clouseau.ini \ No newline at end of file diff --git a/hosting/single/clouseau/clouseau.ini b/hosting/single/clouseau/clouseau.ini deleted file mode 100644 index 578a5acafa..0000000000 --- a/hosting/single/clouseau/clouseau.ini +++ /dev/null @@ -1,13 +0,0 @@ -[clouseau] - -; the name of the Erlang node created by the service, leave this unchanged -name=clouseau@127.0.0.1 - -; set this to the same distributed Erlang cookie used by the CouchDB nodes -cookie=monster - -; the path where you would like to store the search index files -dir=DATA_DIR/search - -; the number of search indexes that can be open simultaneously -max_indexes_open=500 diff --git a/hosting/single/clouseau/log4j.properties b/hosting/single/clouseau/log4j.properties deleted file mode 100644 index 9d4d9311bc..0000000000 --- a/hosting/single/clouseau/log4j.properties +++ /dev/null @@ -1,4 +0,0 @@ -log4j.rootLogger=debug, CONSOLE -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %c [%p] %m%n \ No newline at end of file diff --git a/hosting/single/couch/local.ini b/hosting/single/couch/local.ini deleted file mode 100644 index 266c0d4b60..0000000000 --- a/hosting/single/couch/local.ini +++ /dev/null @@ -1,5 +0,0 @@ -; CouchDB Configuration Settings - -[couchdb] -database_dir = DATA_DIR/couch/dbs -view_index_dir = DATA_DIR/couch/views diff --git a/hosting/single/couch/vm.args b/hosting/single/couch/vm.args deleted file mode 100644 index e9e4416863..0000000000 --- a/hosting/single/couch/vm.args +++ /dev/null @@ -1,32 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -# erlang cookie for clouseau security --name couchdb@127.0.0.1 --setcookie monster - -# Ensure that the Erlang VM listens on a known port --kernel inet_dist_listen_min 9100 --kernel inet_dist_listen_max 9100 - -# Tell kernel and SASL not to log anything --kernel error_logger silent --sasl sasl_error_logger false - -# Use kernel poll functionality if supported by emulator -+K true - -# Start a pool of asynchronous IO threads -+A 16 - -# Comment this line out to enable the interactive Erlang shell on startup -+Bd -noinput diff --git a/hosting/single/runner.sh b/hosting/single/runner.sh index ea825131db..e4793d5492 100644 --- a/hosting/single/runner.sh +++ b/hosting/single/runner.sh @@ -72,14 +72,11 @@ for LINE in $(cat ${DATA_DIR}/.env); do export $LINE; done ln -s ${DATA_DIR}/.env /app/.env ln -s ${DATA_DIR}/.env /worker/.env # make these directories in runner, incase of mount -mkdir -p ${DATA_DIR}/couch/{dbs,views} mkdir -p ${DATA_DIR}/minio -mkdir -p ${DATA_DIR}/search chown -R couchdb:couchdb ${DATA_DIR}/couch redis-server --requirepass $REDIS_PASSWORD > /dev/stdout 2>&1 & -/opt/clouseau/bin/clouseau > /dev/stdout 2>&1 & +/bbcouch-runner.sh & /minio/minio server ${DATA_DIR}/minio > /dev/stdout 2>&1 & -/docker-entrypoint.sh /opt/couchdb/bin/couchdb & /etc/init.d/nginx restart if [[ ! -z "${CUSTOM_DOMAIN}" ]]; then # Add monthly cron job to renew certbot certificate @@ -90,15 +87,14 @@ if [[ ! -z "${CUSTOM_DOMAIN}" ]]; then /etc/init.d/nginx restart fi +# wait for backend services to start +sleep 10 + pushd app pm2 start -l /dev/stdout --name app "yarn run:docker" popd pushd worker pm2 start -l /dev/stdout --name worker "yarn run:docker" popd -sleep 10 -echo "curl to couchdb endpoints" -curl -X PUT ${COUCH_DB_URL}/_users -curl -X PUT ${COUCH_DB_URL}/_replicator echo "end of runner.sh, sleeping ..." sleep infinity diff --git a/package.json b/package.json index 6c147698ad..ff9185ae93 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "build:docker:single:multiarch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single:image": "docker build -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single": "npm run build:docker:pre && npm run build:docker:single:image", + "build:docker:couch": "docker build -f hosting/couchdb/Dockerfile -t budibase-couchdb:latest ./hosting/couchdb", "build:docs": "lerna run build:docs", "release:helm": "node scripts/releaseHelmChart", "env:multi:enable": "lerna run env:multi:enable", From b2171c595551cdd3cd47d641f9eeb98650386ca9 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 9 Dec 2022 22:11:15 +0000 Subject: [PATCH 003/386] Enabling pushing of budibase/couchdb image. --- hosting/scripts/linux/release-couch.sh | 15 +++++++++++++++ hosting/single/Dockerfile | 2 +- package.json | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100755 hosting/scripts/linux/release-couch.sh diff --git a/hosting/scripts/linux/release-couch.sh b/hosting/scripts/linux/release-couch.sh new file mode 100755 index 0000000000..d5585d0c65 --- /dev/null +++ b/hosting/scripts/linux/release-couch.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +tag=$1 + +if [[ ! "$tag" ]]; then + echo "No tag present. You must pass a tag to this script" + exit 1 +fi + +echo "Tagging images with tag: $tag" + +docker tag budibase-couchdb budibase/couchdb:$tag + +docker push --all-tags budibase/couchdb + diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index e7156c089e..2c6c06aa6e 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -18,7 +18,7 @@ WORKDIR /worker ADD packages/worker . RUN node /pinVersions.js && yarn && yarn build && /cleanup.sh -FROM budibase-couchdb +FROM budibase/couchdb ARG TARGETARCH ENV TARGETARCH $TARGETARCH #TARGETBUILD can be set to single (for single docker image) or aas (for azure app service) diff --git a/package.json b/package.json index ff9185ae93..194ce73873 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "build:docker:single:multiarch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single:image": "docker build -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single": "npm run build:docker:pre && npm run build:docker:single:image", - "build:docker:couch": "docker build -f hosting/couchdb/Dockerfile -t budibase-couchdb:latest ./hosting/couchdb", + "build:docker:couch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/couchdb/Dockerfile -t budibase/couchdb:latest -t budibase/couchdb:v3.2.1 --push ./hosting/couchdb", "build:docs": "lerna run build:docs", "release:helm": "node scripts/releaseHelmChart", "env:multi:enable": "lerna run env:multi:enable", From cdcefa16bb063609f57b5540c0d9dfdfcc84a3c0 Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 13 Dec 2022 10:13:17 +0000 Subject: [PATCH 004/386] Filtering and sort on data row export --- .../backend/DataTable/DataTable.svelte | 36 ++++- .../components/backend/DataTable/Table.svelte | 5 +- .../DataTable/buttons/ExportButton.svelte | 5 +- .../DataTable/modals/ExportModal.svelte | 139 +++++++++++++++++- packages/frontend-core/src/api/rows.js | 3 +- .../src/api/controllers/row/external.ts | 31 ++-- .../src/api/controllers/row/internal.ts | 46 ++++-- .../server/src/api/controllers/row/utils.ts | 38 +++++ .../server/src/api/controllers/view/index.ts | 27 +--- 9 files changed, 275 insertions(+), 55 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/DataTable.svelte b/packages/builder/src/components/backend/DataTable/DataTable.svelte index 4f5c3375bd..fcad72f471 100644 --- a/packages/builder/src/components/backend/DataTable/DataTable.svelte +++ b/packages/builder/src/components/backend/DataTable/DataTable.svelte @@ -39,6 +39,23 @@ $: showError($fetch.error) $: id, (filters = null) + let appliedFilter + let rawFilter + let appliedSort + let selectedRows = [] + + $: enrichedSchema, + () => { + appliedFilter = null + rawFilter = null + appliedSort = null + selectedRows = [] + } + + $: if ($fetch.pageNumber) { + selectedRows = [] + } + const showError = error => { if (error) { notifications.error(error?.message || "Unable to fetch data.") @@ -95,11 +112,15 @@ } // Fetch data whenever sorting option changes - const onSort = e => { - fetch.update({ + const onSort = async e => { + const sort = { sortColumn: e.detail.column, sortOrder: e.detail.order, - }) + } + await fetch.update(sort) + appliedSort = { ...sort } + appliedSort.sortOrder = appliedSort.sortOrder.toLowerCase() + selectedRows = [] } // Fetch data whenever filters change @@ -108,16 +129,19 @@ fetch.update({ filter: filters, }) + appliedFilter = e.detail } // Fetch data whenever schema changes const onUpdateColumns = () => { + selectedRows = [] fetch.refresh() } // Fetch data whenever rows are modified. Unfortunately we have to lose // our pagination place, as our bookmarks will have shifted. const onUpdateRows = () => { + selectedRows = [] fetch.refresh() } @@ -142,6 +166,9 @@ disableSorting on:updatecolumns={onUpdateColumns} on:updaterows={onUpdateRows} + on:selectionUpdated={e => { + selectedRows = e.detail + }} customPlaceholder >
@@ -183,6 +210,9 @@ {#key id} @@ -18,5 +21,5 @@ Export - + diff --git a/packages/builder/src/components/backend/DataTable/modals/ExportModal.svelte b/packages/builder/src/components/backend/DataTable/modals/ExportModal.svelte index f55e413a36..e69dde6070 100644 --- a/packages/builder/src/components/backend/DataTable/modals/ExportModal.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/ExportModal.svelte @@ -1,7 +1,14 @@ - + + {#if selectedRows?.length} + + {selectedRows?.length} + {`row${selectedRows?.length > 1 ? "s" : ""} will be exported`} + + {:else if filters || (sorting?.sortOrder && sorting?.sortColumn)} + + {#if !filters} + Exporting all rows + {:else} + Filters applied + {/if} + + +
+ + + {:else} + + Exporting all rows + + {/if} + - {:else if field.type === "options"} + {:else if editableColumn.type === "options"} - {:else if field.type === "longform"} + {:else if editableColumn.type === "longform"}
- {:else if field.type === "array"} + {:else if editableColumn.type === "array"} - {:else if field.type === "datetime"} + {:else if editableColumn.type === "datetime" && !editableColumn.autocolumn} + - {#if datasource?.source !== "ORACLE" && datasource?.source !== "SQL_SERVER"}
- +
{/if} - {:else if field.type === "number"} + {:else if editableColumn.type === "number" && !editableColumn.autocolumn} - {:else if field.type === "link"} + {:else if editableColumn.type === "link"} - {:else if field.type === FORMULA_TYPE} + {:else if editableColumn.type === FORMULA_TYPE} {#if !table.sql} (field.subtype = e.detail)} - options={Object.entries(getAutoColumnInformation())} - getOptionLabel={option => option[1].name} - getOptionValue={option => option[0]} - /> - {:else if field.type === JSON_TYPE} + {:else if editableColumn.type === JSON_TYPE} {/if} + {#if editableColumn.type === AUTO_TYPE || editableColumn.autocolumn} + Date: Wed, 25 Jan 2023 13:19:44 +0000 Subject: [PATCH 136/386] v2.2.12-alpha.37 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index 0b0801c9f6..c5e4b53c66 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 08db960274..2e3d249f9e 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.36", + "@budibase/types": "2.2.12-alpha.37", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 3894241cac..89b06c0d81 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.36", + "@budibase/string-templates": "2.2.12-alpha.37", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index 59bcafbc58..e273d05040 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.36", - "@budibase/client": "2.2.12-alpha.36", - "@budibase/frontend-core": "2.2.12-alpha.36", - "@budibase/string-templates": "2.2.12-alpha.36", + "@budibase/bbui": "2.2.12-alpha.37", + "@budibase/client": "2.2.12-alpha.37", + "@budibase/frontend-core": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.37", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 78ab0eba82..e0ba18d054 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.36", - "@budibase/string-templates": "2.2.12-alpha.36", - "@budibase/types": "2.2.12-alpha.36", + "@budibase/backend-core": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/types": "2.2.12-alpha.37", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 3b37ac41e9..0cd2b06c4d 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.36", - "@budibase/frontend-core": "2.2.12-alpha.36", - "@budibase/string-templates": "2.2.12-alpha.36", + "@budibase/bbui": "2.2.12-alpha.37", + "@budibase/frontend-core": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.37", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 3ca233c979..3fca440818 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.36", + "@budibase/bbui": "2.2.12-alpha.37", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 6ff23b743a..5d1146a40c 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index a32e5eadd8..7e1a71c630 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.36", - "@budibase/client": "2.2.12-alpha.36", + "@budibase/backend-core": "2.2.12-alpha.37", + "@budibase/client": "2.2.12-alpha.37", "@budibase/pro": "2.2.12-alpha.36", - "@budibase/string-templates": "2.2.12-alpha.36", - "@budibase/types": "2.2.12-alpha.36", + "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/types": "2.2.12-alpha.37", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 91e1dfe293..c254b5d979 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index 35180f8835..719309466b 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 662459a3a2..09cbbde730 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.36", + "version": "2.2.12-alpha.37", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.36", + "@budibase/backend-core": "2.2.12-alpha.37", "@budibase/pro": "2.2.12-alpha.36", - "@budibase/string-templates": "2.2.12-alpha.36", - "@budibase/types": "2.2.12-alpha.36", + "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/types": "2.2.12-alpha.37", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From dc68c8ce91d8812963d0b45b42c8d34c434fbbf3 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 13:23:11 +0000 Subject: [PATCH 137/386] Update pro version to 2.2.12-alpha.37 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 7e1a71c630..fc2a98d070 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.37", "@budibase/client": "2.2.12-alpha.37", - "@budibase/pro": "2.2.12-alpha.36", + "@budibase/pro": "2.2.12-alpha.37", "@budibase/string-templates": "2.2.12-alpha.37", "@budibase/types": "2.2.12-alpha.37", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 22f30a80a2..cebea2292f 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1278,13 +1278,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.36.tgz#cabf232b1ab99d932b5a76fe32cf7e0037da6a3f" - integrity sha512-/8uqdYDXTp+wP9+cURL54jlqbwZDoXr917Alw01qlXS00oxqSbaQA4YmLiONjk/V/O8HvYCJRiiCFMS5bz2q4w== +"@budibase/backend-core@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.37.tgz#acbbfbd98f7f30320a131b7f897cc4909cc31d01" + integrity sha512-3N9tDET3AR0lNkmAGXm4NPwM+0lMf9azFTSHWTagDW1qKL/lUlXJX6HuvoAROcV8yENHwkhhzIjGcuip3zASKg== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.36" + "@budibase/types" "2.2.12-alpha.37" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1379,13 +1379,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.36.tgz#6869e676eb3a01eb9ecea5574eabb2cfdb9f57b2" - integrity sha512-IK+iShaGrJ0k3z9+JEjRHSFYZz2nlnQlQ/4juOoJn5hTaLxkJ9nDPQ2PbzynPLfPj817BmzHLJH272YoLr216Q== +"@budibase/pro@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.37.tgz#6ec071a4ad8e02db7e8e3454b71b0489f45a004a" + integrity sha512-tIIa+1TJGVDqGXQ7z0jWNY6nz2BelxPedmVrAYju49unUyPU4/HYdRVfk0Xqq5nApVji68i0EHSjJq0QPScXpA== dependencies: - "@budibase/backend-core" "2.2.12-alpha.36" - "@budibase/types" "2.2.12-alpha.36" + "@budibase/backend-core" "2.2.12-alpha.37" + "@budibase/types" "2.2.12-alpha.37" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1410,10 +1410,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.36.tgz#cd51bd207df840e3f803c9397d1b4346037f17ec" - integrity sha512-v6l7JQCCVQ8eGV4npCUJKo+mgqt6+QKJjFYKXjuhLNVvxz1szxxOa1fLDey4yuIiL/gH/Q/SHWA28FlKF31L2w== +"@budibase/types@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.37.tgz#b48da267d1a143a5db89a2bf6bd9e1fede99d2fc" + integrity sha512-lbxjK+5eXoFzgwyzyq/l7thmyBLyxs9oA+KspSOM0LvTpvm7rZJPqxqOpkOFnsPq3h42qiue/94Z7z5+dxWyAw== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index 09cbbde730..443d382157 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.37", - "@budibase/pro": "2.2.12-alpha.36", + "@budibase/pro": "2.2.12-alpha.37", "@budibase/string-templates": "2.2.12-alpha.37", "@budibase/types": "2.2.12-alpha.37", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index f51f26a891..ca468717b1 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -475,13 +475,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.36.tgz#cabf232b1ab99d932b5a76fe32cf7e0037da6a3f" - integrity sha512-/8uqdYDXTp+wP9+cURL54jlqbwZDoXr917Alw01qlXS00oxqSbaQA4YmLiONjk/V/O8HvYCJRiiCFMS5bz2q4w== +"@budibase/backend-core@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.37.tgz#acbbfbd98f7f30320a131b7f897cc4909cc31d01" + integrity sha512-3N9tDET3AR0lNkmAGXm4NPwM+0lMf9azFTSHWTagDW1qKL/lUlXJX6HuvoAROcV8yENHwkhhzIjGcuip3zASKg== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.36" + "@budibase/types" "2.2.12-alpha.37" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -526,23 +526,23 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.36.tgz#6869e676eb3a01eb9ecea5574eabb2cfdb9f57b2" - integrity sha512-IK+iShaGrJ0k3z9+JEjRHSFYZz2nlnQlQ/4juOoJn5hTaLxkJ9nDPQ2PbzynPLfPj817BmzHLJH272YoLr216Q== +"@budibase/pro@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.37.tgz#6ec071a4ad8e02db7e8e3454b71b0489f45a004a" + integrity sha512-tIIa+1TJGVDqGXQ7z0jWNY6nz2BelxPedmVrAYju49unUyPU4/HYdRVfk0Xqq5nApVji68i0EHSjJq0QPScXpA== dependencies: - "@budibase/backend-core" "2.2.12-alpha.36" - "@budibase/types" "2.2.12-alpha.36" + "@budibase/backend-core" "2.2.12-alpha.37" + "@budibase/types" "2.2.12-alpha.37" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" jsonwebtoken "8.5.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.36": - version "2.2.12-alpha.36" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.36.tgz#cd51bd207df840e3f803c9397d1b4346037f17ec" - integrity sha512-v6l7JQCCVQ8eGV4npCUJKo+mgqt6+QKJjFYKXjuhLNVvxz1szxxOa1fLDey4yuIiL/gH/Q/SHWA28FlKF31L2w== +"@budibase/types@2.2.12-alpha.37": + version "2.2.12-alpha.37" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.37.tgz#b48da267d1a143a5db89a2bf6bd9e1fede99d2fc" + integrity sha512-lbxjK+5eXoFzgwyzyq/l7thmyBLyxs9oA+KspSOM0LvTpvm7rZJPqxqOpkOFnsPq3h42qiue/94Z7z5+dxWyAw== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 37bf4214a64b35604bb49dd0cc8d8a5339ff12fa Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 25 Jan 2023 14:11:33 +0000 Subject: [PATCH 138/386] Fix fancy select not correctly displaying the label for the selected value --- packages/bbui/src/FancyForm/FancySelect.svelte | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/bbui/src/FancyForm/FancySelect.svelte b/packages/bbui/src/FancyForm/FancySelect.svelte index 240871fc9a..ee43ecc3ca 100644 --- a/packages/bbui/src/FancyForm/FancySelect.svelte +++ b/packages/bbui/src/FancyForm/FancySelect.svelte @@ -21,6 +21,7 @@ let wrapper $: placeholder = !value + $: selectedLabel = getSelectedLabel(value) const extractProperty = (value, property) => { if (value && typeof value === "object") { @@ -37,6 +38,17 @@ } open = false } + + const getSelectedLabel = value => { + if (!value || !options?.length) { + return "" + } + const selectedOption = options.find(x => getOptionValue(x) === value) + if (!selectedOption) { + return value + } + return getOptionLabel(selectedOption) + } - {value || ""} + {selectedLabel || ""}
From 125b4a6da605989bf305b7692b46547ffafd8f63 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 14:23:22 +0000 Subject: [PATCH 139/386] v2.2.12-alpha.38 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index c5e4b53c66..bad7cb265a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 2e3d249f9e..6797c3f374 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.37", + "@budibase/types": "2.2.12-alpha.38", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 89b06c0d81..58cb9f9934 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.38", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index e273d05040..e4ac98a572 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.37", - "@budibase/client": "2.2.12-alpha.37", - "@budibase/frontend-core": "2.2.12-alpha.37", - "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/bbui": "2.2.12-alpha.38", + "@budibase/client": "2.2.12-alpha.38", + "@budibase/frontend-core": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.38", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index e0ba18d054..aa1507eef1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.37", - "@budibase/string-templates": "2.2.12-alpha.37", - "@budibase/types": "2.2.12-alpha.37", + "@budibase/backend-core": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/types": "2.2.12-alpha.38", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 0cd2b06c4d..07435e6afd 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.37", - "@budibase/frontend-core": "2.2.12-alpha.37", - "@budibase/string-templates": "2.2.12-alpha.37", + "@budibase/bbui": "2.2.12-alpha.38", + "@budibase/frontend-core": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.38", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 3fca440818..42919b367e 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.37", + "@budibase/bbui": "2.2.12-alpha.38", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 5d1146a40c..226597db3a 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index fc2a98d070..0720fb4b0a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.37", - "@budibase/client": "2.2.12-alpha.37", + "@budibase/backend-core": "2.2.12-alpha.38", + "@budibase/client": "2.2.12-alpha.38", "@budibase/pro": "2.2.12-alpha.37", - "@budibase/string-templates": "2.2.12-alpha.37", - "@budibase/types": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/types": "2.2.12-alpha.38", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index c254b5d979..d16334a309 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index 719309466b..90b824aaa9 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 443d382157..18f82ed3f8 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.37", + "version": "2.2.12-alpha.38", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.37", + "@budibase/backend-core": "2.2.12-alpha.38", "@budibase/pro": "2.2.12-alpha.37", - "@budibase/string-templates": "2.2.12-alpha.37", - "@budibase/types": "2.2.12-alpha.37", + "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/types": "2.2.12-alpha.38", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From 6eba4e13542b02f7c17dde54b653910c1ae0673a Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 14:27:14 +0000 Subject: [PATCH 140/386] Update pro version to 2.2.12-alpha.38 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 0720fb4b0a..b696622e62 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.38", "@budibase/client": "2.2.12-alpha.38", - "@budibase/pro": "2.2.12-alpha.37", + "@budibase/pro": "2.2.12-alpha.38", "@budibase/string-templates": "2.2.12-alpha.38", "@budibase/types": "2.2.12-alpha.38", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index cebea2292f..f3c37e81fc 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1278,13 +1278,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.37.tgz#acbbfbd98f7f30320a131b7f897cc4909cc31d01" - integrity sha512-3N9tDET3AR0lNkmAGXm4NPwM+0lMf9azFTSHWTagDW1qKL/lUlXJX6HuvoAROcV8yENHwkhhzIjGcuip3zASKg== +"@budibase/backend-core@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.38.tgz#47b57ed384acee3f18e4339f1ff3266b5426c228" + integrity sha512-3mvbWVkb4Su4hIKBNtPTlxU3jUDPT7XhiYImSkt7+3SC05GgpUCdA0N8cA8c6+OslLO2+ocGLAvzu/9p3vOGqQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.37" + "@budibase/types" "2.2.12-alpha.38" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1379,13 +1379,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.37.tgz#6ec071a4ad8e02db7e8e3454b71b0489f45a004a" - integrity sha512-tIIa+1TJGVDqGXQ7z0jWNY6nz2BelxPedmVrAYju49unUyPU4/HYdRVfk0Xqq5nApVji68i0EHSjJq0QPScXpA== +"@budibase/pro@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.38.tgz#22a8f028fc6dfc16045ee9d9a30338fccb237069" + integrity sha512-90T70INmsy6fC/iIcx5c0h3/EGxNNrI1I8FTgbCZefU1VyoCDQGujxGrQN2CuNcaIn5zGLvSSUdVr/bHn0fbyw== dependencies: - "@budibase/backend-core" "2.2.12-alpha.37" - "@budibase/types" "2.2.12-alpha.37" + "@budibase/backend-core" "2.2.12-alpha.38" + "@budibase/types" "2.2.12-alpha.38" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1410,10 +1410,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.37.tgz#b48da267d1a143a5db89a2bf6bd9e1fede99d2fc" - integrity sha512-lbxjK+5eXoFzgwyzyq/l7thmyBLyxs9oA+KspSOM0LvTpvm7rZJPqxqOpkOFnsPq3h42qiue/94Z7z5+dxWyAw== +"@budibase/types@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.38.tgz#1c60dcd6f6c00f8dea555710137c560ae263e5ca" + integrity sha512-MizsYBZGpOz7Vok2t3BhHEKCtcq+a7lfwRTR1DnZJEtqwV335PctHdlqF5SzcamFRfv8oFuSb3k4FRFYf5EU4Q== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index 18f82ed3f8..185e09dd5b 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.38", - "@budibase/pro": "2.2.12-alpha.37", + "@budibase/pro": "2.2.12-alpha.38", "@budibase/string-templates": "2.2.12-alpha.38", "@budibase/types": "2.2.12-alpha.38", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index ca468717b1..93c195e5c9 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -475,13 +475,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.37.tgz#acbbfbd98f7f30320a131b7f897cc4909cc31d01" - integrity sha512-3N9tDET3AR0lNkmAGXm4NPwM+0lMf9azFTSHWTagDW1qKL/lUlXJX6HuvoAROcV8yENHwkhhzIjGcuip3zASKg== +"@budibase/backend-core@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.38.tgz#47b57ed384acee3f18e4339f1ff3266b5426c228" + integrity sha512-3mvbWVkb4Su4hIKBNtPTlxU3jUDPT7XhiYImSkt7+3SC05GgpUCdA0N8cA8c6+OslLO2+ocGLAvzu/9p3vOGqQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.37" + "@budibase/types" "2.2.12-alpha.38" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -526,23 +526,23 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.37.tgz#6ec071a4ad8e02db7e8e3454b71b0489f45a004a" - integrity sha512-tIIa+1TJGVDqGXQ7z0jWNY6nz2BelxPedmVrAYju49unUyPU4/HYdRVfk0Xqq5nApVji68i0EHSjJq0QPScXpA== +"@budibase/pro@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.38.tgz#22a8f028fc6dfc16045ee9d9a30338fccb237069" + integrity sha512-90T70INmsy6fC/iIcx5c0h3/EGxNNrI1I8FTgbCZefU1VyoCDQGujxGrQN2CuNcaIn5zGLvSSUdVr/bHn0fbyw== dependencies: - "@budibase/backend-core" "2.2.12-alpha.37" - "@budibase/types" "2.2.12-alpha.37" + "@budibase/backend-core" "2.2.12-alpha.38" + "@budibase/types" "2.2.12-alpha.38" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" jsonwebtoken "8.5.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.37": - version "2.2.12-alpha.37" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.37.tgz#b48da267d1a143a5db89a2bf6bd9e1fede99d2fc" - integrity sha512-lbxjK+5eXoFzgwyzyq/l7thmyBLyxs9oA+KspSOM0LvTpvm7rZJPqxqOpkOFnsPq3h42qiue/94Z7z5+dxWyAw== +"@budibase/types@2.2.12-alpha.38": + version "2.2.12-alpha.38" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.38.tgz#1c60dcd6f6c00f8dea555710137c560ae263e5ca" + integrity sha512-MizsYBZGpOz7Vok2t3BhHEKCtcq+a7lfwRTR1DnZJEtqwV335PctHdlqF5SzcamFRfv8oFuSb3k4FRFYf5EU4Q== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From f6b840ca0eddb90961cf63e826c87685d5b58df6 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 25 Jan 2023 15:55:57 +0000 Subject: [PATCH 141/386] Add suffix prop to fancy input component --- packages/bbui/src/FancyForm/FancyInput.svelte | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/bbui/src/FancyForm/FancyInput.svelte b/packages/bbui/src/FancyForm/FancyInput.svelte index ef254949c8..7437deeb98 100644 --- a/packages/bbui/src/FancyForm/FancyInput.svelte +++ b/packages/bbui/src/FancyForm/FancyInput.svelte @@ -2,6 +2,7 @@ import { createEventDispatcher } from "svelte" import FancyField from "./FancyField.svelte" import FancyFieldLabel from "./FancyFieldLabel.svelte" + import { fade } from "svelte/transition" export let label export let value @@ -9,6 +10,7 @@ export let disabled = false export let error = null export let validate = null + export let suffix = null const dispatch = createEventDispatcher() @@ -38,6 +40,9 @@ on:blur={() => (focused = false)} class:placeholder /> + {#if suffix && !placeholder} +
{suffix}
+ {/if} From b45504fc9be640dec838297d777a263b4a882f4a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 25 Jan 2023 15:57:47 +0000 Subject: [PATCH 142/386] Add suffix setting to fancy input component and fix lint warning --- packages/bbui/src/FancyForm/FancyInput.svelte | 2 ++ packages/frontend-core/src/components/TestimonialPage.svelte | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/bbui/src/FancyForm/FancyInput.svelte b/packages/bbui/src/FancyForm/FancyInput.svelte index 7437deeb98..8735e2c30c 100644 --- a/packages/bbui/src/FancyForm/FancyInput.svelte +++ b/packages/bbui/src/FancyForm/FancyInput.svelte @@ -57,6 +57,8 @@ color: var(--spectrum-global-color-gray-900); outline: none; border: none; + padding: 0; + margin: 0; } input.placeholder { transform: translateY(0); diff --git a/packages/frontend-core/src/components/TestimonialPage.svelte b/packages/frontend-core/src/components/TestimonialPage.svelte index 3028d4447a..f2f74731d0 100644 --- a/packages/frontend-core/src/components/TestimonialPage.svelte +++ b/packages/frontend-core/src/components/TestimonialPage.svelte @@ -14,6 +14,7 @@
a-happy-budibase-user
From e467234b85ec7f0248fd5237fe983ecdeb31840f Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 16:12:14 +0000 Subject: [PATCH 143/386] v2.2.12-alpha.39 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index bad7cb265a..abd5790072 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 6797c3f374..1b4bbad5e9 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.38", + "@budibase/types": "2.2.12-alpha.39", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 58cb9f9934..f2579540ab 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.39", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index e4ac98a572..c9e9cf7724 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.38", - "@budibase/client": "2.2.12-alpha.38", - "@budibase/frontend-core": "2.2.12-alpha.38", - "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/bbui": "2.2.12-alpha.39", + "@budibase/client": "2.2.12-alpha.39", + "@budibase/frontend-core": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.39", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index aa1507eef1..a6200060f1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.38", - "@budibase/string-templates": "2.2.12-alpha.38", - "@budibase/types": "2.2.12-alpha.38", + "@budibase/backend-core": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/types": "2.2.12-alpha.39", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 07435e6afd..16c93740ea 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.38", - "@budibase/frontend-core": "2.2.12-alpha.38", - "@budibase/string-templates": "2.2.12-alpha.38", + "@budibase/bbui": "2.2.12-alpha.39", + "@budibase/frontend-core": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.39", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 42919b367e..5b303ee3eb 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.38", + "@budibase/bbui": "2.2.12-alpha.39", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 226597db3a..a65407a066 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index b696622e62..f298c6d3f3 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.38", - "@budibase/client": "2.2.12-alpha.38", + "@budibase/backend-core": "2.2.12-alpha.39", + "@budibase/client": "2.2.12-alpha.39", "@budibase/pro": "2.2.12-alpha.38", - "@budibase/string-templates": "2.2.12-alpha.38", - "@budibase/types": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/types": "2.2.12-alpha.39", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index d16334a309..b9ee7b8efb 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index 90b824aaa9..b0d84c045b 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 185e09dd5b..babed69088 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.38", + "version": "2.2.12-alpha.39", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.38", + "@budibase/backend-core": "2.2.12-alpha.39", "@budibase/pro": "2.2.12-alpha.38", - "@budibase/string-templates": "2.2.12-alpha.38", - "@budibase/types": "2.2.12-alpha.38", + "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/types": "2.2.12-alpha.39", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From e260204186abdd8bd1e5a41127e59082551980fa Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 16:16:45 +0000 Subject: [PATCH 144/386] Update pro version to 2.2.12-alpha.39 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index f298c6d3f3..32cc1b3887 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.39", "@budibase/client": "2.2.12-alpha.39", - "@budibase/pro": "2.2.12-alpha.38", + "@budibase/pro": "2.2.12-alpha.39", "@budibase/string-templates": "2.2.12-alpha.39", "@budibase/types": "2.2.12-alpha.39", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index f3c37e81fc..a914b0dd33 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1278,13 +1278,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.38.tgz#47b57ed384acee3f18e4339f1ff3266b5426c228" - integrity sha512-3mvbWVkb4Su4hIKBNtPTlxU3jUDPT7XhiYImSkt7+3SC05GgpUCdA0N8cA8c6+OslLO2+ocGLAvzu/9p3vOGqQ== +"@budibase/backend-core@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.39.tgz#8b56bd113761099ec7b16b14298f881ab5f91854" + integrity sha512-pqijIq/qpvTtaxo8QxYl8gyW6D3joAt2cGHLEdjACi1cFzCjMd/Wf2muJLv6hYria1DOEkoP82n819OeKqgNoQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.38" + "@budibase/types" "2.2.12-alpha.39" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1379,13 +1379,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.38.tgz#22a8f028fc6dfc16045ee9d9a30338fccb237069" - integrity sha512-90T70INmsy6fC/iIcx5c0h3/EGxNNrI1I8FTgbCZefU1VyoCDQGujxGrQN2CuNcaIn5zGLvSSUdVr/bHn0fbyw== +"@budibase/pro@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.39.tgz#8db18f5868155adc29df376656f2126d6f132728" + integrity sha512-p3NBeYSAvVeUiIIP6FUzRjs7eweGTtZ0dJ//efsyeiOZfS0/FDJi9wUsDrp7CbnoSzwXLK1KMYDnf2RIP5kOkQ== dependencies: - "@budibase/backend-core" "2.2.12-alpha.38" - "@budibase/types" "2.2.12-alpha.38" + "@budibase/backend-core" "2.2.12-alpha.39" + "@budibase/types" "2.2.12-alpha.39" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1410,10 +1410,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.38.tgz#1c60dcd6f6c00f8dea555710137c560ae263e5ca" - integrity sha512-MizsYBZGpOz7Vok2t3BhHEKCtcq+a7lfwRTR1DnZJEtqwV335PctHdlqF5SzcamFRfv8oFuSb3k4FRFYf5EU4Q== +"@budibase/types@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.39.tgz#779b286e2d6855ef6c76699a0c28ad423224621f" + integrity sha512-tJu3SnOm5GHnov2RF5pz53S7eRtqVUBERCMNd4YdvIhM9ACFVGDs4j54WTQhSpZX6WzxxUl+x9LkAFDsuHXVOQ== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index babed69088..2daa0753ee 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.39", - "@budibase/pro": "2.2.12-alpha.38", + "@budibase/pro": "2.2.12-alpha.39", "@budibase/string-templates": "2.2.12-alpha.39", "@budibase/types": "2.2.12-alpha.39", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index 93c195e5c9..c85d84fdf4 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -475,13 +475,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.38.tgz#47b57ed384acee3f18e4339f1ff3266b5426c228" - integrity sha512-3mvbWVkb4Su4hIKBNtPTlxU3jUDPT7XhiYImSkt7+3SC05GgpUCdA0N8cA8c6+OslLO2+ocGLAvzu/9p3vOGqQ== +"@budibase/backend-core@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.39.tgz#8b56bd113761099ec7b16b14298f881ab5f91854" + integrity sha512-pqijIq/qpvTtaxo8QxYl8gyW6D3joAt2cGHLEdjACi1cFzCjMd/Wf2muJLv6hYria1DOEkoP82n819OeKqgNoQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.38" + "@budibase/types" "2.2.12-alpha.39" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -526,23 +526,23 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.38.tgz#22a8f028fc6dfc16045ee9d9a30338fccb237069" - integrity sha512-90T70INmsy6fC/iIcx5c0h3/EGxNNrI1I8FTgbCZefU1VyoCDQGujxGrQN2CuNcaIn5zGLvSSUdVr/bHn0fbyw== +"@budibase/pro@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.39.tgz#8db18f5868155adc29df376656f2126d6f132728" + integrity sha512-p3NBeYSAvVeUiIIP6FUzRjs7eweGTtZ0dJ//efsyeiOZfS0/FDJi9wUsDrp7CbnoSzwXLK1KMYDnf2RIP5kOkQ== dependencies: - "@budibase/backend-core" "2.2.12-alpha.38" - "@budibase/types" "2.2.12-alpha.38" + "@budibase/backend-core" "2.2.12-alpha.39" + "@budibase/types" "2.2.12-alpha.39" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" jsonwebtoken "8.5.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.38": - version "2.2.12-alpha.38" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.38.tgz#1c60dcd6f6c00f8dea555710137c560ae263e5ca" - integrity sha512-MizsYBZGpOz7Vok2t3BhHEKCtcq+a7lfwRTR1DnZJEtqwV335PctHdlqF5SzcamFRfv8oFuSb3k4FRFYf5EU4Q== +"@budibase/types@2.2.12-alpha.39": + version "2.2.12-alpha.39" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.39.tgz#779b286e2d6855ef6c76699a0c28ad423224621f" + integrity sha512-tJu3SnOm5GHnov2RF5pz53S7eRtqVUBERCMNd4YdvIhM9ACFVGDs4j54WTQhSpZX6WzxxUl+x9LkAFDsuHXVOQ== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 27b472b662218a8a41a37e253ab9d79833989544 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 24 Jan 2023 19:09:36 +0000 Subject: [PATCH 145/386] Quick updates for #8989 - this issue appeared to be fixed already but just adding a few extra bits of security to make sure that looping only occurs when valid data is found in the binding. --- packages/server/src/threads/automation.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/server/src/threads/automation.ts b/packages/server/src/threads/automation.ts index 44951869f4..d765ef8472 100644 --- a/packages/server/src/threads/automation.ts +++ b/packages/server/src/threads/automation.ts @@ -37,9 +37,13 @@ function getLoopIterations(loopStep: LoopStep, input: LoopInput) { if (!loopStep || !binding) { return 1 } - return Array.isArray(binding) - ? binding.length - : automationUtils.stringSplit(binding).length + if (Array.isArray(binding)) { + return binding.length + } + if (typeof binding === "string") { + return automationUtils.stringSplit(binding).length + } + return 1 } /** @@ -280,13 +284,13 @@ class Orchestrator { break } - let item + let item = [] if ( typeof loopStep.inputs.binding === "string" && loopStep.inputs.option === "String" ) { item = automationUtils.stringSplit(newInput.binding) - } else { + } else if (Array.isArray(loopStep.inputs.binding)) { item = loopStep.inputs.binding } this._context.steps[loopStepNumber] = { From b38399cb74856db648c1ee7ec45adae24a6eabbe Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 25 Jan 2023 18:27:58 +0000 Subject: [PATCH 146/386] Adding test cases as per PR comments. --- .../server/src/automations/tests/loop.spec.ts | 45 +++++++++++++ packages/server/src/automations/triggers.ts | 7 +- .../server/src/tests/utilities/structures.ts | 67 ++++++++++++++++++- .../types/src/documents/app/automation.ts | 1 + 4 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 packages/server/src/automations/tests/loop.spec.ts diff --git a/packages/server/src/automations/tests/loop.spec.ts b/packages/server/src/automations/tests/loop.spec.ts new file mode 100644 index 0000000000..b64f7b16f8 --- /dev/null +++ b/packages/server/src/automations/tests/loop.spec.ts @@ -0,0 +1,45 @@ +import * as automation from "../index" +import * as triggers from "../triggers" +import { loopAutomation } from "../../tests/utilities/structures" +import { context } from "@budibase/backend-core" +import * as setup from "./utilities" + +describe("Attempt to run a basic loop automation", () => { + let config = setup.getConfig(), + table: any, + row: any + + beforeEach(async () => { + await automation.init() + await config.init() + table = await config.createTable() + row = await config.createRow() + }) + + afterAll(setup.afterAll) + + async function runLoop(loopOpts?: any) { + const appId = config.getAppId() + return await context.doInAppContext(appId, async () => { + const params = { fields: { appId } } + return await triggers.externalTrigger( + loopAutomation(table._id, loopOpts), + params, + { getResponses: true } + ) + }) + } + + it("attempt to run a basic loop", async () => { + const resp = await runLoop() + expect(resp.steps[2].outputs.iterations).toBe(1) + }) + + it("test a loop with a string", async () => { + const resp = await runLoop({ + type: "String", + binding: "a,b,c", + }) + expect(resp.steps[2].outputs.iterations).toBe(3) + }) +}) diff --git a/packages/server/src/automations/triggers.ts b/packages/server/src/automations/triggers.ts index f4b34bc9e8..78f8a87b0c 100644 --- a/packages/server/src/automations/triggers.ts +++ b/packages/server/src/automations/triggers.ts @@ -109,8 +109,13 @@ export async function externalTrigger( } params.fields = coercedFields } - const data = { automation, event: params } + const data: Record = { automation, event: params } if (getResponses) { + data.event = { + ...data.event, + appId: context.getAppId(), + automation, + } return utils.processEvent({ data }) } else { return automationQueue.add(data, JOB_OPTS) diff --git a/packages/server/src/tests/utilities/structures.ts b/packages/server/src/tests/utilities/structures.ts index a412be4931..9d66fecc5e 100644 --- a/packages/server/src/tests/utilities/structures.ts +++ b/packages/server/src/tests/utilities/structures.ts @@ -1,8 +1,14 @@ -import { roles, permissions } from "@budibase/backend-core" +import { permissions, roles } from "@budibase/backend-core" import { createHomeScreen } from "../../constants/screens" import { EMPTY_LAYOUT } from "../../constants/layouts" import { cloneDeep } from "lodash/fp" -import { TRIGGER_DEFINITIONS, ACTION_DEFINITIONS } from "../../automations" +import { ACTION_DEFINITIONS, TRIGGER_DEFINITIONS } from "../../automations" +import { + Automation, + AutomationActionStepId, + AutomationTriggerStepId, +} from "@budibase/types" + const { v4: uuidv4 } = require("uuid") export const TENANT_ID = "default" @@ -116,6 +122,63 @@ export function basicAutomation() { } } +export function loopAutomation(tableId: string, loopOpts?: any): Automation { + if (!loopOpts) { + loopOpts = { + option: "Array", + binding: "{{ steps.1.rows }}", + } + } + const automation: any = { + name: "looping", + type: "automation", + definition: { + steps: [ + { + id: "b", + type: "ACTION", + stepId: AutomationActionStepId.QUERY_ROWS, + internal: true, + inputs: { + tableId, + }, + schema: ACTION_DEFINITIONS.QUERY_ROWS.schema, + }, + { + id: "c", + type: "ACTION", + stepId: AutomationActionStepId.LOOP, + internal: true, + inputs: loopOpts, + blockToLoop: "d", + schema: ACTION_DEFINITIONS.LOOP.schema, + }, + { + id: "d", + type: "ACTION", + internal: true, + stepId: AutomationActionStepId.SERVER_LOG, + inputs: { + text: "log statement", + }, + schema: ACTION_DEFINITIONS.SERVER_LOG.schema, + }, + ], + trigger: { + id: "a", + type: "TRIGGER", + event: "row:save", + stepId: AutomationTriggerStepId.ROW_SAVED, + inputs: { + tableId, + }, + schema: TRIGGER_DEFINITIONS.ROW_SAVED.schema, + }, + }, + } + return automation as Automation +} + export function basicRow(tableId: string) { return { name: "Test Contact", diff --git a/packages/types/src/documents/app/automation.ts b/packages/types/src/documents/app/automation.ts index 184fed629d..0aa11d808b 100644 --- a/packages/types/src/documents/app/automation.ts +++ b/packages/types/src/documents/app/automation.ts @@ -50,6 +50,7 @@ export interface AutomationStepSchema { internal?: boolean deprecated?: boolean stepId: AutomationTriggerStepId | AutomationActionStepId + blockToLoop?: string inputs: { [key: string]: any } From b95316a4dee38d6f65e466ecfe47461e861942fa Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 19:13:39 +0000 Subject: [PATCH 147/386] v2.2.12-alpha.40 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index abd5790072..ada4b59a78 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 1b4bbad5e9..b0e0bdb7bd 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.39", + "@budibase/types": "2.2.12-alpha.40", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index f2579540ab..7e78ea65f9 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.40", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index c9e9cf7724..f96150a3e5 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.39", - "@budibase/client": "2.2.12-alpha.39", - "@budibase/frontend-core": "2.2.12-alpha.39", - "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/bbui": "2.2.12-alpha.40", + "@budibase/client": "2.2.12-alpha.40", + "@budibase/frontend-core": "2.2.12-alpha.40", + "@budibase/string-templates": "2.2.12-alpha.40", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index a6200060f1..5f33e9fd7a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.39", - "@budibase/string-templates": "2.2.12-alpha.39", - "@budibase/types": "2.2.12-alpha.39", + "@budibase/backend-core": "2.2.12-alpha.40", + "@budibase/string-templates": "2.2.12-alpha.40", + "@budibase/types": "2.2.12-alpha.40", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 16c93740ea..b0a3924c7e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.39", - "@budibase/frontend-core": "2.2.12-alpha.39", - "@budibase/string-templates": "2.2.12-alpha.39", + "@budibase/bbui": "2.2.12-alpha.40", + "@budibase/frontend-core": "2.2.12-alpha.40", + "@budibase/string-templates": "2.2.12-alpha.40", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 5b303ee3eb..27a0d9c159 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.39", + "@budibase/bbui": "2.2.12-alpha.40", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index a65407a066..eb257dccaf 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index 32cc1b3887..ccea08cc56 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.39", - "@budibase/client": "2.2.12-alpha.39", + "@budibase/backend-core": "2.2.12-alpha.40", + "@budibase/client": "2.2.12-alpha.40", "@budibase/pro": "2.2.12-alpha.39", - "@budibase/string-templates": "2.2.12-alpha.39", - "@budibase/types": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.40", + "@budibase/types": "2.2.12-alpha.40", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index b9ee7b8efb..364f210aa8 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index b0d84c045b..6846bf9765 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 2daa0753ee..78fed78f61 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.39", + "version": "2.2.12-alpha.40", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.39", + "@budibase/backend-core": "2.2.12-alpha.40", "@budibase/pro": "2.2.12-alpha.39", - "@budibase/string-templates": "2.2.12-alpha.39", - "@budibase/types": "2.2.12-alpha.39", + "@budibase/string-templates": "2.2.12-alpha.40", + "@budibase/types": "2.2.12-alpha.40", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From 206e3cddf4edd8655c0c1a0f1298f7100a63c709 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 25 Jan 2023 19:17:06 +0000 Subject: [PATCH 148/386] Update pro version to 2.2.12-alpha.40 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index ccea08cc56..6e34b8eb51 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.40", "@budibase/client": "2.2.12-alpha.40", - "@budibase/pro": "2.2.12-alpha.39", + "@budibase/pro": "2.2.12-alpha.40", "@budibase/string-templates": "2.2.12-alpha.40", "@budibase/types": "2.2.12-alpha.40", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index a914b0dd33..4d3d958008 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1278,13 +1278,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.39.tgz#8b56bd113761099ec7b16b14298f881ab5f91854" - integrity sha512-pqijIq/qpvTtaxo8QxYl8gyW6D3joAt2cGHLEdjACi1cFzCjMd/Wf2muJLv6hYria1DOEkoP82n819OeKqgNoQ== +"@budibase/backend-core@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.40.tgz#49bae56f5d8c1511100d64c447171c96e1929b26" + integrity sha512-wvArhOlcSGq3K9hE6zFcFB5zztzZjmAA+I3+2DYud9/8KxBOyQmPlUyRRrHXsrtURDiEtLDyIc/AG9pvDEFwGw== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.39" + "@budibase/types" "2.2.12-alpha.40" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1379,13 +1379,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.39.tgz#8db18f5868155adc29df376656f2126d6f132728" - integrity sha512-p3NBeYSAvVeUiIIP6FUzRjs7eweGTtZ0dJ//efsyeiOZfS0/FDJi9wUsDrp7CbnoSzwXLK1KMYDnf2RIP5kOkQ== +"@budibase/pro@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.40.tgz#e41af1af7db36aac4e27412b58cf6a25ab921606" + integrity sha512-Z7kW/KLu0Bst8+JVHdYJYpr65SVavFH55mmqDcCD/j44pNxZKchNBCYe5KTukNwtJS7wnLPAinQI52dDhYcpfg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.39" - "@budibase/types" "2.2.12-alpha.39" + "@budibase/backend-core" "2.2.12-alpha.40" + "@budibase/types" "2.2.12-alpha.40" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1410,10 +1410,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.39.tgz#779b286e2d6855ef6c76699a0c28ad423224621f" - integrity sha512-tJu3SnOm5GHnov2RF5pz53S7eRtqVUBERCMNd4YdvIhM9ACFVGDs4j54WTQhSpZX6WzxxUl+x9LkAFDsuHXVOQ== +"@budibase/types@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.40.tgz#114c2de00f502736d90b18238ed31eb0b2ef6a19" + integrity sha512-YLCycoImazSypq89w+1l3LHEMZ9qEh5NPBJ5DQ07Un/1Sq5H4QxVLK8r7Z1VtxIqtAh95H3nMPnAB/vLpJEL8Q== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index 78fed78f61..2395f44c95 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.40", - "@budibase/pro": "2.2.12-alpha.39", + "@budibase/pro": "2.2.12-alpha.40", "@budibase/string-templates": "2.2.12-alpha.40", "@budibase/types": "2.2.12-alpha.40", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index c85d84fdf4..b7c934f195 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -475,13 +475,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.39.tgz#8b56bd113761099ec7b16b14298f881ab5f91854" - integrity sha512-pqijIq/qpvTtaxo8QxYl8gyW6D3joAt2cGHLEdjACi1cFzCjMd/Wf2muJLv6hYria1DOEkoP82n819OeKqgNoQ== +"@budibase/backend-core@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.40.tgz#49bae56f5d8c1511100d64c447171c96e1929b26" + integrity sha512-wvArhOlcSGq3K9hE6zFcFB5zztzZjmAA+I3+2DYud9/8KxBOyQmPlUyRRrHXsrtURDiEtLDyIc/AG9pvDEFwGw== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.39" + "@budibase/types" "2.2.12-alpha.40" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -526,23 +526,23 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.39.tgz#8db18f5868155adc29df376656f2126d6f132728" - integrity sha512-p3NBeYSAvVeUiIIP6FUzRjs7eweGTtZ0dJ//efsyeiOZfS0/FDJi9wUsDrp7CbnoSzwXLK1KMYDnf2RIP5kOkQ== +"@budibase/pro@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.40.tgz#e41af1af7db36aac4e27412b58cf6a25ab921606" + integrity sha512-Z7kW/KLu0Bst8+JVHdYJYpr65SVavFH55mmqDcCD/j44pNxZKchNBCYe5KTukNwtJS7wnLPAinQI52dDhYcpfg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.39" - "@budibase/types" "2.2.12-alpha.39" + "@budibase/backend-core" "2.2.12-alpha.40" + "@budibase/types" "2.2.12-alpha.40" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" jsonwebtoken "8.5.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.39": - version "2.2.12-alpha.39" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.39.tgz#779b286e2d6855ef6c76699a0c28ad423224621f" - integrity sha512-tJu3SnOm5GHnov2RF5pz53S7eRtqVUBERCMNd4YdvIhM9ACFVGDs4j54WTQhSpZX6WzxxUl+x9LkAFDsuHXVOQ== +"@budibase/types@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.40.tgz#114c2de00f502736d90b18238ed31eb0b2ef6a19" + integrity sha512-YLCycoImazSypq89w+1l3LHEMZ9qEh5NPBJ5DQ07Un/1Sq5H4QxVLK8r7Z1VtxIqtAh95H3nMPnAB/vLpJEL8Q== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 6d07a0371ad59ea1070341f687a008b939f55cd9 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Wed, 25 Jan 2023 22:26:09 +0000 Subject: [PATCH 149/386] Update pull_request_template.md --- pull_request_template.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pull_request_template.md b/pull_request_template.md index ade39d55e4..36e2f425d5 100644 --- a/pull_request_template.md +++ b/pull_request_template.md @@ -11,5 +11,8 @@ Addresses: ## Screenshots _If a UI facing feature, a short video of the happy path, and some screenshots of the new functionality._ +## Documentation +- [ ] I have reviewed the budibase documentatation to verify if this feature requires any changes. If changes or new docs are required I have written them. + From 7027abeaa2a84e06dbc8a1044445eb8a641194fe Mon Sep 17 00:00:00 2001 From: adrinr Date: Thu, 26 Jan 2023 17:18:49 +0000 Subject: [PATCH 150/386] Fix issues with parallel tests and self/cloud modes --- packages/backend-core/src/objectStore/objectStore.ts | 10 +++++----- packages/server/__mocks__/aws-sdk.ts | 2 +- packages/server/src/api/routes/tests/static.spec.js | 1 + packages/server/src/api/routes/tests/webhook.spec.js | 1 + .../server/src/automations/tests/executeQuery.spec.js | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/backend-core/src/objectStore/objectStore.ts b/packages/backend-core/src/objectStore/objectStore.ts index f601d40a37..059e1b228d 100644 --- a/packages/backend-core/src/objectStore/objectStore.ts +++ b/packages/backend-core/src/objectStore/objectStore.ts @@ -361,8 +361,8 @@ export const deleteFolder = async ( Prefix: folder, } - let response: any = await client.listObjects(listParams).promise() - if (response.Contents.length === 0) { + const existingObjectsResponse = await client.listObjects(listParams).promise() + if (existingObjectsResponse.Contents?.length === 0) { return } const deleteParams: any = { @@ -372,13 +372,13 @@ export const deleteFolder = async ( }, } - response.Contents.forEach((content: any) => { + existingObjectsResponse.Contents?.forEach((content: any) => { deleteParams.Delete.Objects.push({ Key: content.Key }) }) - response = await client.deleteObjects(deleteParams).promise() + const deleteResponse = await client.deleteObjects(deleteParams).promise() // can only empty 1000 items at once - if (response.Deleted.length === 1000) { + if (deleteResponse.Deleted?.length === 1000) { return deleteFolder(bucketName, folder) } } diff --git a/packages/server/__mocks__/aws-sdk.ts b/packages/server/__mocks__/aws-sdk.ts index 2efbd303f2..8a66f0e213 100644 --- a/packages/server/__mocks__/aws-sdk.ts +++ b/packages/server/__mocks__/aws-sdk.ts @@ -34,7 +34,7 @@ module AwsMock { // @ts-ignore this.listObjects = jest.fn( response({ - Contents: {}, + Contents: [], }) ) diff --git a/packages/server/src/api/routes/tests/static.spec.js b/packages/server/src/api/routes/tests/static.spec.js index cbfe167100..6e0ffd2319 100644 --- a/packages/server/src/api/routes/tests/static.spec.js +++ b/packages/server/src/api/routes/tests/static.spec.js @@ -9,6 +9,7 @@ describe("/static", () => { afterAll(setup.afterAll) beforeEach(async () => { + config.modeSelf() app = await config.init() }) diff --git a/packages/server/src/api/routes/tests/webhook.spec.js b/packages/server/src/api/routes/tests/webhook.spec.js index 5bdc2ced96..2c619e7906 100644 --- a/packages/server/src/api/routes/tests/webhook.spec.js +++ b/packages/server/src/api/routes/tests/webhook.spec.js @@ -10,6 +10,7 @@ describe("/webhooks", () => { afterAll(setup.afterAll) beforeEach(async () => { + config.modeSelf() await config.init() const autoConfig = basicAutomation() autoConfig.definition.trigger = { diff --git a/packages/server/src/automations/tests/executeQuery.spec.js b/packages/server/src/automations/tests/executeQuery.spec.js index c9b7629d09..2136baa99e 100644 --- a/packages/server/src/automations/tests/executeQuery.spec.js +++ b/packages/server/src/automations/tests/executeQuery.spec.js @@ -41,7 +41,7 @@ describe("test the execute query action", () => { query: { queryId: "wrong_id" } } ) - expect(res.response).toEqual('{"status":404,"name":"not_found","message":"missing","reason":"missing"}') + expect(res.response).toEqual('Error: missing') expect(res.success).toEqual(false) }) From 768e84d9b3644c4f9291b170d25747bdd3ccb10f Mon Sep 17 00:00:00 2001 From: adrinr Date: Wed, 25 Jan 2023 10:13:35 +0000 Subject: [PATCH 151/386] Don't create the apps on test --- hosting/dependencies/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosting/dependencies/README.md b/hosting/dependencies/README.md index ccfc386ea5..8586b31948 100644 --- a/hosting/dependencies/README.md +++ b/hosting/dependencies/README.md @@ -53,5 +53,5 @@ yarn build #### Build Image The following yarn command does some prep and then runs the docker build command: ``` -yarn build:docker:tests +yarn build:docker:dependencies ``` From cae83684ea4bea4470e470e9d0ee9348138b077b Mon Sep 17 00:00:00 2001 From: adrinr Date: Thu, 26 Jan 2023 18:24:20 +0000 Subject: [PATCH 152/386] Remove wrong createApp --- packages/server/src/api/controllers/application.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/api/controllers/application.ts b/packages/server/src/api/controllers/application.ts index fef883ef9e..06e7dc8a57 100644 --- a/packages/server/src/api/controllers/application.ts +++ b/packages/server/src/api/controllers/application.ts @@ -320,7 +320,6 @@ async function performAppCreate(ctx: BBContext) { newApplication._rev = response.rev /* istanbul ignore next */ - await createApp(appId) if (!env.isTest()) { await createApp(appId) } From a9772c19e138f643e57a9b07fe5dd270db5a6115 Mon Sep 17 00:00:00 2001 From: adrinr Date: Thu, 26 Jan 2023 18:40:36 +0000 Subject: [PATCH 153/386] Delete testcontainers-config --- packages/backend-core/jest-testcontainers-config.js | 1 - 1 file changed, 1 deletion(-) delete mode 120000 packages/backend-core/jest-testcontainers-config.js diff --git a/packages/backend-core/jest-testcontainers-config.js b/packages/backend-core/jest-testcontainers-config.js deleted file mode 120000 index a7b7bbeed7..0000000000 --- a/packages/backend-core/jest-testcontainers-config.js +++ /dev/null @@ -1 +0,0 @@ -../../hosting/tests/jest-testcontainers-config.js \ No newline at end of file From e4c898c327cc9249db481af03fe58ee967c4f894 Mon Sep 17 00:00:00 2001 From: adrinr Date: Fri, 27 Jan 2023 11:43:36 +0000 Subject: [PATCH 154/386] Use test-containers for backend-core tests --- jestTestcontainersConfigGenerator.js | 10 ------ .../jest-testcontainers-config.js | 8 +++++ packages/backend-core/jest.config.ts | 4 +-- packages/backend-core/package.json | 3 +- .../src/cache/tests/writethrough.spec.js | 6 ++-- .../backend-core/src/db/tests/index.spec.js | 16 ++++----- .../backend-core/src/db/tests/utils.spec.ts | 20 ++++++----- .../passport/tests/third-party-common.spec.js | 2 ++ .../tests/__snapshots__/index.spec.js.snap | 2 +- .../src/migrations/tests/index.spec.js | 17 ++++++---- .../src/utils/tests/utils.spec.ts | 16 +++++++-- packages/backend-core/tests/jestEnv.ts | 23 +++++++++++++ packages/backend-core/tests/jestSetup.ts | 34 ++++++------------- packages/backend-core/yarn.lock | 10 ++++++ packages/worker/jest-testcontainers-config.js | 1 - 15 files changed, 104 insertions(+), 68 deletions(-) create mode 100644 packages/backend-core/jest-testcontainers-config.js create mode 100644 packages/backend-core/tests/jestEnv.ts delete mode 120000 packages/worker/jest-testcontainers-config.js diff --git a/jestTestcontainersConfigGenerator.js b/jestTestcontainersConfigGenerator.js index c74bcea1bc..ad032ed82e 100644 --- a/jestTestcontainersConfigGenerator.js +++ b/jestTestcontainersConfigGenerator.js @@ -1,16 +1,6 @@ module.exports = dependenciesEnv => { - if (process.env.DEV_TOOLS) { - return { - dockerCompose: { - composeFilePath: `${__dirname}/hosting`, - composeFile: 'docker-compose.dev.yaml', - startupTimeout: 10000, - } - } - } - return { devEnv: { image: "budibase/dependencies", diff --git a/packages/backend-core/jest-testcontainers-config.js b/packages/backend-core/jest-testcontainers-config.js new file mode 100644 index 0000000000..8a19389492 --- /dev/null +++ b/packages/backend-core/jest-testcontainers-config.js @@ -0,0 +1,8 @@ +const { join } = require("path") +const { parsed: env } = require("dotenv").config({ + path: join(__dirname, "..", "..", "hosting", ".env"), +}) + +const jestTestcontainersConfigGenerator = require("../../jestTestcontainersConfigGenerator") + +module.exports = jestTestcontainersConfigGenerator(env) diff --git a/packages/backend-core/jest.config.ts b/packages/backend-core/jest.config.ts index 133c25734e..084084bea5 100644 --- a/packages/backend-core/jest.config.ts +++ b/packages/backend-core/jest.config.ts @@ -4,8 +4,8 @@ const preset = require("ts-jest/jest-preset") const config: Config.InitialOptions = { ...preset, preset: "@trendyol/jest-testcontainers", - testEnvironment: "node", - setupFiles: ["./tests/jestSetup.ts"], + setupFiles: ["./tests/jestEnv.ts"], + setupFilesAfterEnv: ["./tests/jestSetup.ts"], collectCoverageFrom: ["src/**/*.{js,ts}"], coverageReporters: ["lcov", "json", "clover"], transform: { diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index b0e0bdb7bd..dec782c7f4 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -57,9 +57,10 @@ "zlib": "1.0.5" }, "devDependencies": { - "@trendyol/jest-testcontainers": "^2.1.1", + "@faker-js/faker": "^7.6.0", "@swc/core": "^1.3.25", "@swc/jest": "^0.2.24", + "@trendyol/jest-testcontainers": "^2.1.1", "@types/chance": "1.1.3", "@types/ioredis": "4.28.0", "@types/jest": "27.5.1", diff --git a/packages/backend-core/src/cache/tests/writethrough.spec.js b/packages/backend-core/src/cache/tests/writethrough.spec.js index 716d3f9c23..67728c0f51 100644 --- a/packages/backend-core/src/cache/tests/writethrough.spec.js +++ b/packages/backend-core/src/cache/tests/writethrough.spec.js @@ -6,10 +6,12 @@ const tk = require("timekeeper") const START_DATE = Date.now() tk.freeze(START_DATE) +const { faker } = require( "@faker-js/faker") + const DELAY = 5000 -const db = getDB("test") -const db2 = getDB("test2") +const db = getDB(faker.random.alpha(10)) +const db2 = getDB(faker.random.alpha(10)) const writethrough = new Writethrough(db, DELAY), writethrough2 = new Writethrough(db2, DELAY) describe("writethrough", () => { diff --git a/packages/backend-core/src/db/tests/index.spec.js b/packages/backend-core/src/db/tests/index.spec.js index fc0094d354..e10df7ef07 100644 --- a/packages/backend-core/src/db/tests/index.spec.js +++ b/packages/backend-core/src/db/tests/index.spec.js @@ -1,19 +1,18 @@ require("../../../tests") -const { getDB } = require("../") +const { getDB } = require("../db") +const { faker } = require( "@faker-js/faker") -describe("db", () => { - +describe("db", () => { describe("getDB", () => { it("returns a db", async () => { - const db = getDB("test") + const dbName = faker.random.alpha(10) + const db = getDB(dbName) expect(db).toBeDefined() - expect(db._adapter).toBe("memory") - expect(db.prefix).toBe("_pouch_") - expect(db.name).toBe("test") + expect(db.name).toBe(dbName) }) it("uses the custom put function", async () => { - const db = getDB("test") + const db = getDB(faker.random.alpha(10)) let doc = { _id: "test" } await db.put(doc) doc = await db.get(doc._id) @@ -23,4 +22,3 @@ describe("db", () => { }) }) }) - diff --git a/packages/backend-core/src/db/tests/utils.spec.ts b/packages/backend-core/src/db/tests/utils.spec.ts index 37b7ce51e2..38166ab1cf 100644 --- a/packages/backend-core/src/db/tests/utils.spec.ts +++ b/packages/backend-core/src/db/tests/utils.spec.ts @@ -8,6 +8,7 @@ const { const { generateAppID, getPlatformUrl, getScopedConfig } = require("../utils") const tenancy = require("../../tenancy") const { Config, DEFAULT_TENANT_ID } = require("../../constants") +import { faker } from "@faker-js/faker" import env from "../../environment" describe("utils", () => { @@ -66,17 +67,16 @@ describe("utils", () => { }) }) -const DB_URL = "http://dburl.com" const DEFAULT_URL = "http://localhost:10000" const ENV_URL = "http://env.com" -const setDbPlatformUrl = async () => { +const setDbPlatformUrl = async (dbUrl: string) => { const db = tenancy.getGlobalDB() - db.put({ + await db.put({ _id: "config_settings", type: Config.SETTINGS, config: { - platformUrl: DB_URL, + platformUrl: dbUrl, }, }) } @@ -119,9 +119,10 @@ describe("getPlatformUrl", () => { it("gets the platform url from the database", async () => { await tenancy.doInTenant(null, async () => { - await setDbPlatformUrl() + const dbUrl = faker.internet.url() + await setDbPlatformUrl(dbUrl) const url = await getPlatformUrl() - expect(url).toBe(DB_URL) + expect(url).toBe(dbUrl) }) }) }) @@ -152,7 +153,7 @@ describe("getPlatformUrl", () => { it("never gets the platform url from the database", async () => { await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => { - await setDbPlatformUrl() + await setDbPlatformUrl(faker.internet.url()) const url = await getPlatformUrl() expect(url).toBe(TENANT_AWARE_URL) }) @@ -170,10 +171,11 @@ describe("getScopedConfig", () => { it("returns the platform url with an existing config", async () => { await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => { - await setDbPlatformUrl() + const dbUrl = faker.internet.url() + await setDbPlatformUrl(dbUrl) const db = tenancy.getGlobalDB() const config = await getScopedConfig(db, { type: Config.SETTINGS }) - expect(config.platformUrl).toBe(DB_URL) + expect(config.platformUrl).toBe(dbUrl) }) }) diff --git a/packages/backend-core/src/middleware/passport/tests/third-party-common.spec.js b/packages/backend-core/src/middleware/passport/tests/third-party-common.spec.js index d377d602f1..474d234ee1 100644 --- a/packages/backend-core/src/middleware/passport/tests/third-party-common.spec.js +++ b/packages/backend-core/src/middleware/passport/tests/third-party-common.spec.js @@ -6,6 +6,8 @@ const { DEFAULT_TENANT_ID } = require("../../../constants") const { generateGlobalUserID } = require("../../../db/utils") const { newid } = require("../../../utils") const { doWithGlobalDB, doInTenant } = require("../../../tenancy") +const { default: environment } = require("../../../environment") +environment._set("MULTI_TENANCY", 'TRUE') const done = jest.fn() diff --git a/packages/backend-core/src/migrations/tests/__snapshots__/index.spec.js.snap b/packages/backend-core/src/migrations/tests/__snapshots__/index.spec.js.snap index 532b5a32db..5129869232 100644 --- a/packages/backend-core/src/migrations/tests/__snapshots__/index.spec.js.snap +++ b/packages/backend-core/src/migrations/tests/__snapshots__/index.spec.js.snap @@ -3,7 +3,7 @@ exports[`migrations should match snapshot 1`] = ` Object { "_id": "migrations", - "_rev": "1-a32b0b708e59eeb006ed5e063cfeb36a", + "_rev": "1-2f64479842a0513aa8b97f356b0b9127", "createdAt": "2020-01-01T00:00:00.000Z", "test": 1577836800000, "updatedAt": "2020-01-01T00:00:00.000Z", diff --git a/packages/backend-core/src/migrations/tests/index.spec.js b/packages/backend-core/src/migrations/tests/index.spec.js index b7d2e14ea5..608e700d9b 100644 --- a/packages/backend-core/src/migrations/tests/index.spec.js +++ b/packages/backend-core/src/migrations/tests/index.spec.js @@ -1,9 +1,11 @@ require("../../../tests") const { runMigrations, getMigrationsDoc } = require("../index") -const { getDB } = require("../../db") -const { - StaticDatabases, -} = require("../../constants") +const { getGlobalDBName, getDB } = require("../../db") + +const { faker } = require( "@faker-js/faker") + +const { default: environment } = require("../../environment") +environment._set("MULTI_TENANCY", 'TRUE') let db @@ -17,8 +19,11 @@ describe("migrations", () => { fn: migrationFunction }] + let tenantId + beforeEach(() => { - db = getDB(StaticDatabases.GLOBAL.name) + tenantId =faker.random.alpha(10) + db = getDB(getGlobalDBName(tenantId)) }) afterEach(async () => { @@ -27,7 +32,7 @@ describe("migrations", () => { }) const migrate = () => { - return runMigrations(MIGRATIONS) + return runMigrations(MIGRATIONS, { tenantIds: [tenantId]}) } it("should run a new migration", async () => { diff --git a/packages/backend-core/src/utils/tests/utils.spec.ts b/packages/backend-core/src/utils/tests/utils.spec.ts index 498aff1555..52de2cc9f1 100644 --- a/packages/backend-core/src/utils/tests/utils.spec.ts +++ b/packages/backend-core/src/utils/tests/utils.spec.ts @@ -2,13 +2,19 @@ import { structures } from "../../../tests" import * as utils from "../../utils" import * as events from "../../events" import * as db from "../../db" -import { DEFAULT_TENANT_ID, Header } from "../../constants" +import { Header } from "../../constants" import { doInTenant } from "../../context" +import { faker } from "@faker-js/faker" +import environment from "../../environment" describe("utils", () => { describe("platformLogout", () => { + beforeEach(() => { + environment._set("MULTI_TENANCY", "TRUE") + }) + it("should call platform logout", async () => { - await doInTenant(DEFAULT_TENANT_ID, async () => { + await doInTenant(faker.random.alpha(10), async () => { const ctx = structures.koa.newContext() await utils.platformLogout({ ctx, userId: "test" }) expect(events.auth.logout).toBeCalledTimes(1) @@ -17,6 +23,10 @@ describe("utils", () => { }) describe("getAppIdFromCtx", () => { + beforeEach(() => { + environment._set("MULTI_TENANCY", undefined) + }) + it("gets appId from header", async () => { const ctx = structures.koa.newContext() const expected = db.generateAppID() @@ -54,7 +64,7 @@ describe("utils", () => { const app = structures.apps.app(expected) // set custom url - const appUrl = "custom-url" + const appUrl = faker.datatype.uuid() app.url = `/${appUrl}` ctx.path = `/app/${appUrl}` diff --git a/packages/backend-core/tests/jestEnv.ts b/packages/backend-core/tests/jestEnv.ts new file mode 100644 index 0000000000..1190eb3bb7 --- /dev/null +++ b/packages/backend-core/tests/jestEnv.ts @@ -0,0 +1,23 @@ +import env from "../src/environment" +import { mocks } from "./utilities" + +// must explicitly enable fetch mock +mocks.fetch.enable() + +// mock all dates to 2020-01-01T00:00:00.000Z +// use tk.reset() to use real dates in individual tests +import tk from "timekeeper" +tk.freeze(mocks.date.MOCK_DATE) + +env._set("SELF_HOSTED", "1") +env._set("NODE_ENV", "jest") + +if (!process.env.DEBUG) { + global.console.log = jest.fn() // console.log are ignored in tests +} + +if (!process.env.CI) { + // set a longer timeout in dev for debugging + // 100 seconds + jest.setTimeout(100000) +} diff --git a/packages/backend-core/tests/jestSetup.ts b/packages/backend-core/tests/jestSetup.ts index b7ab5b49d9..d80624947b 100644 --- a/packages/backend-core/tests/jestSetup.ts +++ b/packages/backend-core/tests/jestSetup.ts @@ -1,28 +1,14 @@ import env from "../src/environment" -import { mocks } from "./utilities" -// must explicitly enable fetch mock -mocks.fetch.enable() +const globalSafe = global as any -// mock all dates to 2020-01-01T00:00:00.000Z -// use tk.reset() to use real dates in individual tests -import tk from "timekeeper" -tk.freeze(mocks.date.MOCK_DATE) +env._set("COUCH_DB_PORT", globalSafe.__TESTCONTAINERS_DEVENV_PORT_5984__) +env._set( + "COUCH_DB_URL", + `http://${globalSafe.__TESTCONTAINERS_DEVENV_IP__}:${globalSafe.__TESTCONTAINERS_DEVENV_PORT_5984__}` +) -env._set("SELF_HOSTED", "1") -env._set("NODE_ENV", "jest") -env._set("JWT_SECRET", "test-jwtsecret") -env._set("LOG_LEVEL", "silent") -env._set("MINIO_URL", "http://localhost") -env._set("MINIO_ACCESS_KEY", "test") -env._set("MINIO_SECRET_KEY", "test") - -if (!process.env.DEBUG) { - global.console.log = jest.fn() // console.log are ignored in tests -} - -if (!process.env.CI) { - // set a longer timeout in dev for debugging - // 100 seconds - jest.setTimeout(100000) -} +env._set( + "MINIO_URL", + `http://${globalSafe.__TESTCONTAINERS_DEVENV_IP__}:${globalSafe.__TESTCONTAINERS_DEVENV_PORT_9000__}` +) diff --git a/packages/backend-core/yarn.lock b/packages/backend-core/yarn.lock index d07a95d5f8..e64c9539a6 100644 --- a/packages/backend-core/yarn.lock +++ b/packages/backend-core/yarn.lock @@ -487,6 +487,11 @@ qs "^6.11.0" tough-cookie "^4.1.2" +"@budibase/types@2.2.12-alpha.40": + version "2.2.12-alpha.40" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.40.tgz#114c2de00f502736d90b18238ed31eb0b2ef6a19" + integrity sha512-YLCycoImazSypq89w+1l3LHEMZ9qEh5NPBJ5DQ07Un/1Sq5H4QxVLK8r7Z1VtxIqtAh95H3nMPnAB/vLpJEL8Q== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -494,6 +499,11 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@faker-js/faker@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.6.0.tgz#9ea331766084288634a9247fcd8b84f16ff4ba07" + integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" diff --git a/packages/worker/jest-testcontainers-config.js b/packages/worker/jest-testcontainers-config.js deleted file mode 120000 index a7b7bbeed7..0000000000 --- a/packages/worker/jest-testcontainers-config.js +++ /dev/null @@ -1 +0,0 @@ -../../hosting/tests/jest-testcontainers-config.js \ No newline at end of file From ecbf9250a4ee86eaf55ac2320d57869b153d149d Mon Sep 17 00:00:00 2001 From: adrinr Date: Fri, 27 Jan 2023 12:36:52 +0000 Subject: [PATCH 155/386] Add module name mapper back --- packages/worker/jest.config.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/worker/jest.config.ts b/packages/worker/jest.config.ts index 0d06446862..85f554f8da 100644 --- a/packages/worker/jest.config.ts +++ b/packages/worker/jest.config.ts @@ -1,10 +1,7 @@ import { Config } from "@jest/types" import * as fs from "fs" -const preset = require("ts-jest/jest-preset") const config: Config.InitialOptions = { - ...preset, - preset: "@trendyol/jest-testcontainers", testEnvironment: "node", setupFiles: ["./src/tests/jestEnv.ts"], setupFilesAfterEnv: ["./src/tests/jestSetup.ts"], @@ -15,4 +12,22 @@ const config: Config.InitialOptions = { }, } +if (!process.env.CI) { + // use sources when not in CI + config.moduleNameMapper = { + "@budibase/backend-core/(.*)": "/../backend-core/$1", + "@budibase/backend-core": "/../backend-core/src", + "@budibase/types": "/../types/src", + } + // add pro sources if they exist + if (fs.existsSync("../../../budibase-pro")) { + config.moduleNameMapper["@budibase/pro/(.*)"] = + "/../../../budibase-pro/packages/pro/$1" + config.moduleNameMapper["@budibase/pro"] = + "/../../../budibase-pro/packages/pro/src" + } +} else { + console.log("Running tests with compiled dependency sources") +} + export default config From a5980caf680d62ae12c32a8d8a1d7e37fde19029 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 27 Jan 2023 13:17:19 +0000 Subject: [PATCH 156/386] Updating Dockerfile to use same path as the publish (restrict context size). --- hosting/dependencies/Dockerfile | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hosting/dependencies/Dockerfile b/hosting/dependencies/Dockerfile index 859ba10c83..c4872213f1 100644 --- a/hosting/dependencies/Dockerfile +++ b/hosting/dependencies/Dockerfile @@ -12,7 +12,7 @@ RUN chmod +x install.sh && ./install.sh WORKDIR / -ADD hosting/dependencies/runner.sh . +ADD dependencies/runner.sh . RUN chmod +x ./runner.sh EXPOSE 5984 diff --git a/package.json b/package.json index 6815429f1e..c499d35af7 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "build:docker:single:multiarch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single:image": "docker build -f hosting/single/Dockerfile -t budibase:latest .", "build:docker:single": "npm run build:docker:pre && npm run build:docker:single:image", - "build:docker:dependencies": "docker build -f hosting/dependencies/Dockerfile -t budibase/dependencies:latest .", + "build:docker:dependencies": "docker build -f hosting/dependencies/Dockerfile -t budibase/dependencies:latest ./hosting", "publish:docker:couch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/couchdb/Dockerfile -t budibase/couchdb:latest -t budibase/couchdb:v3.2.1 --push ./hosting/couchdb", "publish:docker:dependencies": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/dependencies/Dockerfile -t budibase/dependencies:latest -t budibase/dependencies:v3.2.1 --push ./hosting", "build:docs": "lerna run build:docs", From d37c0e4b5d5981775c61cb046502733c0a7e694b Mon Sep 17 00:00:00 2001 From: Dean Date: Fri, 27 Jan 2023 13:44:57 +0000 Subject: [PATCH 157/386] UI Onboarding UI/UX auth refactoring --- .../src/pages/builder/admin/index.svelte | 173 ++++++++++----- .../auth/_components/GoogleButton.svelte | 30 +-- .../auth/_components/OIDCButton.svelte | 30 +-- .../pages/builder/auth/_components/utils.js | 18 ++ .../src/pages/builder/auth/forgot.svelte | 103 +++++---- .../src/pages/builder/auth/login.svelte | 164 +++++++++------ .../src/pages/builder/auth/reset.svelte | 135 ++++++++---- .../src/pages/builder/invite/index.svelte | 198 ++++++++++++++---- packages/builder/src/stores/portal/users.js | 9 +- packages/frontend-core/src/api/user.js | 16 +- .../src/api/controllers/global/users.ts | 13 ++ packages/worker/src/api/index.ts | 4 + .../worker/src/api/routes/global/users.ts | 14 ++ 13 files changed, 622 insertions(+), 285 deletions(-) create mode 100644 packages/builder/src/pages/builder/auth/_components/utils.js diff --git a/packages/builder/src/pages/builder/admin/index.svelte b/packages/builder/src/pages/builder/admin/index.svelte index 99731b8285..7ef2d6d290 100644 --- a/packages/builder/src/pages/builder/admin/index.svelte +++ b/packages/builder/src/pages/builder/admin/index.svelte @@ -4,37 +4,45 @@ Heading, notifications, Layout, - Input, Body, - ActionButton, Modal, } from "@budibase/bbui" import { goto } from "@roxi/routify" import { API } from "api" import { admin, auth } from "stores/portal" - import PasswordRepeatInput from "components/common/users/PasswordRepeatInput.svelte" import ImportAppsModal from "./_components/ImportAppsModal.svelte" import Logo from "assets/bb-emblem.svg" import { onMount } from "svelte" + import { FancyForm, FancyInput, ActionButton } from "@budibase/bbui" + import { TestimonialPage } from "@budibase/frontend-core/src/components" + import { handleError, passwordsMatch } from "../auth/_components/utils" - let adminUser = {} - let error let modal + let form + let errors = {} + let formData = {} + let submitted = false $: tenantId = $auth.tenantId - $: multiTenancyEnabled = $admin.multiTenancy $: cloud = $admin.cloud $: imported = $admin.importComplete + $: multiTenancyEnabled = $admin.multiTenancy async function save() { + form.validate() + if (Object.keys(errors).length > 0) { + return + } + submitted = true try { - adminUser.tenantId = tenantId + const adminUser = { ...formData, tenantId } // Save the admin user await API.createAdminUser(adminUser) notifications.success("Admin user created") await admin.init() $goto("../portal") } catch (error) { + submitted = false notifications.error("Failed to create admin user") } } @@ -53,35 +61,109 @@ -
-
- + + + + logo - - Create an admin user - - The admin user has access to everything in Budibase. - - - - - - - - - {#if multiTenancyEnabled} - { - admin.unload() - $goto("../auth/org") - }} - > - Change organisation - - {:else if !cloud && !imported} + Create an admin user + The admin user has access to everything in Budibase. + + + + { + formData = { + ...formData, + email: e.detail, + } + }} + validate={() => { + handleError(() => { + return { + email: !formData.email + ? "Please enter a valid email" + : undefined, + } + }, errors) + }} + disabled={submitted} + error={errors.email} + /> + { + formData = { + ...formData, + password: e.detail, + } + }} + validate={() => { + handleError(() => { + let err = {} + + err["password"] = !formData.password + ? "Please enter a password" + : undefined + + err["confirmationPassword"] = + !passwordsMatch( + formData.password, + formData.confirmationPassword + ) && formData.confirmationPassword + ? "Passwords must match" + : undefined + + return err + }, errors) + }} + error={errors.password} + disabled={submitted} + /> + { + formData = { + ...formData, + confirmationPassword: e.detail, + } + }} + validate={() => { + handleError(() => { + return { + confirmationPassword: + !passwordsMatch( + formData.password, + formData.confirmationPassword + ) && formData.password + ? "Passwords must match" + : undefined, + } + }, errors) + }} + error={errors.confirmationPassword} + disabled={submitted} + /> + + + + + + + -
-
+ + diff --git a/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte b/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte index 0acaa127cc..d8e1da7072 100644 --- a/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte +++ b/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte @@ -1,5 +1,5 @@ {#if show} - window.open(`/api/global/auth/${tenantId}/google`, "_blank")} > -
- google icon -

Sign in with Google

-
-
+ Log in with Google + {/if} - - diff --git a/packages/builder/src/pages/builder/auth/_components/OIDCButton.svelte b/packages/builder/src/pages/builder/auth/_components/OIDCButton.svelte index 27f5bde186..396bde3cb0 100644 --- a/packages/builder/src/pages/builder/auth/_components/OIDCButton.svelte +++ b/packages/builder/src/pages/builder/auth/_components/OIDCButton.svelte @@ -1,5 +1,5 @@ {#if show} - window.open( `/api/global/auth/${$auth.tenantId}/oidc/configs/${$oidc.uuid}`, "_blank" )} > -
- oidc icon -

{`Sign in with ${$oidc.name || "OIDC"}`}

-
-
+ {`Log in with ${$oidc.name || "OIDC"}`} + {/if} - - diff --git a/packages/builder/src/pages/builder/auth/_components/utils.js b/packages/builder/src/pages/builder/auth/_components/utils.js new file mode 100644 index 0000000000..0ca42292b9 --- /dev/null +++ b/packages/builder/src/pages/builder/auth/_components/utils.js @@ -0,0 +1,18 @@ +exports.handleError = (validate, errors) => { + const err = validate() + let update = { ...errors, ...err } + errors = Object.keys(update).reduce((acc, key) => { + if (update[key]) { + acc[key] = update[key] + } + return acc + }, {}) +} + +exports.passwordsMatch = (password, confirmation) => { + let confirm = confirmation?.trim() + let pwd = password?.trim() + return ( + typeof confirm === "string" && typeof pwd === "string" && confirm == pwd + ) +} diff --git a/packages/builder/src/pages/builder/auth/forgot.svelte b/packages/builder/src/pages/builder/auth/forgot.svelte index 7227fd6377..13c8331c2d 100644 --- a/packages/builder/src/pages/builder/auth/forgot.svelte +++ b/packages/builder/src/pages/builder/auth/forgot.svelte @@ -1,25 +1,35 @@ - + + + + { + email = e.detail + }} + validate={() => { + if (!email) { + return "Please enter your email" + } + return null + }} + {error} + disabled={submitted} + /> + + +
+ +
+ + diff --git a/packages/builder/src/pages/builder/auth/login.svelte b/packages/builder/src/pages/builder/auth/login.svelte index d8633a4fbc..b80dac44e7 100644 --- a/packages/builder/src/pages/builder/auth/login.svelte +++ b/packages/builder/src/pages/builder/auth/login.svelte @@ -5,7 +5,6 @@ Button, Divider, Heading, - Input, Layout, notifications, Link, @@ -14,22 +13,30 @@ import { auth, organisation, oidc, admin } from "stores/portal" import GoogleButton from "./_components/GoogleButton.svelte" import OIDCButton from "./_components/OIDCButton.svelte" + import { handleError } from "./_components/utils" import Logo from "assets/bb-emblem.svg" + import { TestimonialPage } from "@budibase/frontend-core/src/components" + import { FancyForm, FancyInput } from "@budibase/bbui" import { onMount } from "svelte" - let username = "" - let password = "" let loaded = false + let form + let errors = {} + let formData = {} $: company = $organisation.company || "Budibase" - $: multiTenancyEnabled = $admin.multiTenancy $: cloud = $admin.cloud async function login() { + form.validate() + if (Object.keys(errors).length > 0) { + console.log("errors") + return + } try { await auth.login({ - username: username.trim(), - password, + username: formData?.username.trim(), + password: formData?.password, }) if ($auth?.user?.forceResetPassword) { $goto("./reset") @@ -57,75 +64,98 @@ - + + {#if loaded && ($organisation.google || $organisation.oidc)} + + + + + + {/if} + + { + formData = { + ...formData, + username: e.detail, + } + }} + validate={() => { + handleError(() => { + return { + username: !formData.username + ? "Please enter a valid email" + : undefined, + } + }, errors) + }} + error={errors.username} + /> + { + formData = { + ...formData, + password: e.detail, + } + }} + validate={() => { + handleError(() => { + return { + password: !formData.password + ? "Please enter your password" + : undefined, + } + }, errors) + }} + error={errors.password} + /> + + + + + + + + + + {#if cloud} + + By using Budibase Cloud +
+ you are agreeing to our + + License Agreement + + + {/if} + + diff --git a/packages/builder/src/stores/portal/users.js b/packages/builder/src/stores/portal/users.js index e9bdf790f2..1510207604 100644 --- a/packages/builder/src/stores/portal/users.js +++ b/packages/builder/src/stores/portal/users.js @@ -29,13 +29,19 @@ export function createUsersStore() { async function invite(payload) { return API.inviteUsers(payload) } - async function acceptInvite(inviteCode, password) { + async function acceptInvite(inviteCode, password, firstName, lastName) { return API.acceptInvite({ inviteCode, password, + firstName, + lastName, }) } + async function fetchInvite(inviteCode) { + return API.getUserInvite(inviteCode) + } + async function create(data) { let mappedUsers = data.users.map(user => { const body = { @@ -101,6 +107,7 @@ export function createUsersStore() { fetch, invite, acceptInvite, + fetchInvite, create, save, bulkDelete, diff --git a/packages/frontend-core/src/api/user.js b/packages/frontend-core/src/api/user.js index 5c4f070802..9875605ce0 100644 --- a/packages/frontend-core/src/api/user.js +++ b/packages/frontend-core/src/api/user.js @@ -146,6 +146,16 @@ export const buildUserEndpoints = API => ({ }) }, + /** + * Retrieves the invitation associated with a provided code. + * @param code The unique code for the target invite + */ + getUserInvite: async code => { + return await API.get({ + url: `/api/global/users/invite/${code}`, + }) + }, + /** * Invites multiple users to the current tenant. * @param users An array of users to invite @@ -168,13 +178,17 @@ export const buildUserEndpoints = API => ({ * Accepts an invite to join the platform and creates a user. * @param inviteCode the invite code sent in the email * @param password the password for the newly created user + * @param firstName the first name of the new user + * @param lastName the last name of the new user */ - acceptInvite: async ({ inviteCode, password }) => { + acceptInvite: async ({ inviteCode, password, firstName, lastName }) => { return await API.post({ url: "/api/global/users/invite/accept", body: { inviteCode, password, + firstName, + lastName, }, }) }, diff --git a/packages/worker/src/api/controllers/global/users.ts b/packages/worker/src/api/controllers/global/users.ts index 10741f3725..817480151d 100644 --- a/packages/worker/src/api/controllers/global/users.ts +++ b/packages/worker/src/api/controllers/global/users.ts @@ -210,6 +210,19 @@ export const inviteMultiple = async (ctx: any) => { ctx.body = await sdk.users.invite(request) } +export const checkInvite = async (ctx: any) => { + const { code } = ctx.params + let invite + try { + invite = await checkInviteCode(code, false) + } catch (e) { + ctx.throw(400, "There was a problem with the invite") + } + ctx.body = { + email: invite.email, + } +} + export const inviteAccept = async (ctx: any) => { const { inviteCode, password, firstName, lastName } = ctx.request.body try { diff --git a/packages/worker/src/api/index.ts b/packages/worker/src/api/index.ts index e37c6c2d94..d8df62f532 100644 --- a/packages/worker/src/api/index.ts +++ b/packages/worker/src/api/index.ts @@ -62,6 +62,10 @@ const PUBLIC_ENDPOINTS = [ route: "/api/system/restored", method: "POST", }, + { + route: "/api/global/users/invite", + method: "GET", + }, ] const NO_TENANCY_ENDPOINTS = [ diff --git a/packages/worker/src/api/routes/global/users.ts b/packages/worker/src/api/routes/global/users.ts index 26cba8e1ab..a73462b235 100644 --- a/packages/worker/src/api/routes/global/users.ts +++ b/packages/worker/src/api/routes/global/users.ts @@ -38,6 +38,13 @@ function buildInviteMultipleValidation() { )) } +function buildInviteLookupValidation() { + // prettier-ignore + return auth.joiValidator.params(Joi.object({ + code: Joi.string().required() + }).unknown(true)) +} + const createUserAdminOnly = (ctx: any, next: any) => { if (!ctx.request.body._id) { return auth.adminOnly(ctx, next) @@ -51,6 +58,8 @@ function buildInviteAcceptValidation() { return auth.joiValidator.body(Joi.object({ inviteCode: Joi.string().required(), password: Joi.string().required(), + firstName: Joi.string().required(), + lastName: Joi.string().optional(), }).required().unknown(true)) } @@ -91,6 +100,11 @@ router ) // non-global endpoints + .get( + "/api/global/users/invite/:code", + buildInviteLookupValidation(), + controller.checkInvite + ) .post( "/api/global/users/invite/accept", buildInviteAcceptValidation(), From 651c367f75098b82b430d3b8f55d7685b6741389 Mon Sep 17 00:00:00 2001 From: adrinr Date: Fri, 27 Jan 2023 17:59:14 +0000 Subject: [PATCH 158/386] Fix worker tests --- packages/worker/__mocks__/node-fetch.ts | 23 ++ packages/worker/jest-testcontainers-config.js | 8 + packages/worker/jest.config.ts | 4 +- .../src/api/routes/global/tests/auth.spec.ts | 51 +++-- .../api/routes/global/tests/configs.spec.ts | 198 ++++++++++-------- .../src/api/routes/global/tests/roles.spec.ts | 33 +-- .../src/api/routes/global/tests/users.spec.ts | 61 +++--- .../worker/src/tests/TestConfiguration.ts | 16 +- packages/worker/src/tests/api/auth.ts | 10 +- packages/worker/src/tests/api/configs.ts | 4 +- packages/worker/src/tests/api/users.ts | 4 +- packages/worker/src/tests/jestEnv.ts | 27 +-- packages/worker/src/tests/jestSetup.ts | 24 +++ packages/worker/src/tests/structures/index.ts | 2 - 14 files changed, 277 insertions(+), 188 deletions(-) create mode 100644 packages/worker/__mocks__/node-fetch.ts create mode 100644 packages/worker/jest-testcontainers-config.js diff --git a/packages/worker/__mocks__/node-fetch.ts b/packages/worker/__mocks__/node-fetch.ts new file mode 100644 index 0000000000..113833a0b6 --- /dev/null +++ b/packages/worker/__mocks__/node-fetch.ts @@ -0,0 +1,23 @@ +import fs from "fs" +module FetchMock { + const fetch = jest.requireActual("node-fetch") + + const func = async (url: any, opts: any) => { + if (url.includes("http://someconfigurl")) { + return { + ok: true, + json: () => ({ + issuer: "test", + authorization_endpoint: "http://localhost/auth", + token_endpoint: "http://localhost/token", + userinfo_endpoint: "http://localhost/userinfo", + }), + } + } + return fetch(url, opts) + } + + func.Headers = fetch.Headers + + module.exports = func +} diff --git a/packages/worker/jest-testcontainers-config.js b/packages/worker/jest-testcontainers-config.js new file mode 100644 index 0000000000..8a19389492 --- /dev/null +++ b/packages/worker/jest-testcontainers-config.js @@ -0,0 +1,8 @@ +const { join } = require("path") +const { parsed: env } = require("dotenv").config({ + path: join(__dirname, "..", "..", "hosting", ".env"), +}) + +const jestTestcontainersConfigGenerator = require("../../jestTestcontainersConfigGenerator") + +module.exports = jestTestcontainersConfigGenerator(env) diff --git a/packages/worker/jest.config.ts b/packages/worker/jest.config.ts index 85f554f8da..8b0514211b 100644 --- a/packages/worker/jest.config.ts +++ b/packages/worker/jest.config.ts @@ -1,8 +1,10 @@ import { Config } from "@jest/types" import * as fs from "fs" +const preset = require("ts-jest/jest-preset") const config: Config.InitialOptions = { - testEnvironment: "node", + ...preset, + preset: "@trendyol/jest-testcontainers", setupFiles: ["./src/tests/jestEnv.ts"], setupFilesAfterEnv: ["./src/tests/jestSetup.ts"], collectCoverageFrom: ["src/**/*.{js,ts}"], diff --git a/packages/worker/src/api/routes/global/tests/auth.spec.ts b/packages/worker/src/api/routes/global/tests/auth.spec.ts index 0d47857ac1..d58d56ac87 100644 --- a/packages/worker/src/api/routes/global/tests/auth.spec.ts +++ b/packages/worker/src/api/routes/global/tests/auth.spec.ts @@ -1,7 +1,7 @@ jest.mock("nodemailer") import { TestConfiguration, mocks } from "../../../../tests" const sendMailMock = mocks.email.mock() -import { events } from "@budibase/backend-core" +import { events, tenancy, utils } from "@budibase/backend-core" const expectSetAuthCookie = (res: any) => { expect( @@ -40,36 +40,43 @@ describe("/api/global/auth", () => { describe("POST /api/global/auth/:tenantId/reset", () => { it("should generate password reset email", async () => { - const { res, code } = await config.api.auth.requestPasswordReset( - sendMailMock - ) - const user = await config.getUser("test@test.com") + await tenancy.doInTenant(config.tenant1User!.tenantId, async () => { + const userEmail = `${utils.newid()}@test.com` + const { res, code } = await config.api.auth.requestPasswordReset( + sendMailMock, + userEmail + ) + const user = await config.getUser(userEmail) - expect(res.body).toEqual({ - message: "Please check your email for a reset link.", + expect(res.body).toEqual({ + message: "Please check your email for a reset link.", + }) + expect(sendMailMock).toHaveBeenCalled() + + expect(code).toBeDefined() + expect(events.user.passwordResetRequested).toBeCalledTimes(1) + expect(events.user.passwordResetRequested).toBeCalledWith(user) }) - expect(sendMailMock).toHaveBeenCalled() - - expect(code).toBeDefined() - expect(events.user.passwordResetRequested).toBeCalledTimes(1) - expect(events.user.passwordResetRequested).toBeCalledWith(user) }) }) describe("POST /api/global/auth/:tenantId/reset/update", () => { it("should reset password", async () => { - const { code } = await config.api.auth.requestPasswordReset( - sendMailMock - ) - const user = await config.getUser("test@test.com") - delete user.password + await tenancy.doInTenant(config.tenant1User!.tenantId, async () => { + const userEmail = `${utils.newid()}@test.com` + const { code } = await config.api.auth.requestPasswordReset( + sendMailMock, + userEmail + ) + const user = await config.getUser(userEmail) + delete user.password - const res = await config.api.auth.updatePassword(code) - - expect(res.body).toEqual({ message: "password reset successfully." }) - expect(events.user.passwordReset).toBeCalledTimes(1) - expect(events.user.passwordReset).toBeCalledWith(user) + const res = await config.api.auth.updatePassword(code) + expect(res.body).toEqual({ message: "password reset successfully." }) + expect(events.user.passwordReset).toBeCalledTimes(1) + expect(events.user.passwordReset).toBeCalledWith(user) + }) // TODO: Login using new password }) }) diff --git a/packages/worker/src/api/routes/global/tests/configs.spec.ts b/packages/worker/src/api/routes/global/tests/configs.spec.ts index ed457e7bcd..f25fc01699 100644 --- a/packages/worker/src/api/routes/global/tests/configs.spec.ts +++ b/packages/worker/src/api/routes/global/tests/configs.spec.ts @@ -2,7 +2,7 @@ jest.mock("nodemailer") import { TestConfiguration, structures, mocks } from "../../../../tests" mocks.email.mock() -import { Config, events } from "@budibase/backend-core" +import { Config, context, events } from "@budibase/backend-core" describe("configs", () => { const config = new TestConfiguration() @@ -113,56 +113,64 @@ describe("configs", () => { describe("create", () => { it("should create activated OIDC config", async () => { - await saveOIDCConfig() - expect(events.auth.SSOCreated).toBeCalledTimes(1) - expect(events.auth.SSOCreated).toBeCalledWith(Config.OIDC) - expect(events.auth.SSODeactivated).not.toBeCalled() - expect(events.auth.SSOActivated).toBeCalledTimes(1) - expect(events.auth.SSOActivated).toBeCalledWith(Config.OIDC) - await config.deleteConfig(Config.OIDC) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + await saveOIDCConfig() + expect(events.auth.SSOCreated).toBeCalledTimes(1) + expect(events.auth.SSOCreated).toBeCalledWith(Config.OIDC) + expect(events.auth.SSODeactivated).not.toBeCalled() + expect(events.auth.SSOActivated).toBeCalledTimes(1) + expect(events.auth.SSOActivated).toBeCalledWith(Config.OIDC) + await config.deleteConfig(Config.OIDC) + }) }) it("should create deactivated OIDC config", async () => { - await saveOIDCConfig({ activated: false }) - expect(events.auth.SSOCreated).toBeCalledTimes(1) - expect(events.auth.SSOCreated).toBeCalledWith(Config.OIDC) - expect(events.auth.SSOActivated).not.toBeCalled() - expect(events.auth.SSODeactivated).not.toBeCalled() - await config.deleteConfig(Config.OIDC) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + await saveOIDCConfig({ activated: false }) + expect(events.auth.SSOCreated).toBeCalledTimes(1) + expect(events.auth.SSOCreated).toBeCalledWith(Config.OIDC) + expect(events.auth.SSOActivated).not.toBeCalled() + expect(events.auth.SSODeactivated).not.toBeCalled() + await config.deleteConfig(Config.OIDC) + }) }) }) describe("update", () => { it("should update OIDC config to deactivated", async () => { - const oidcConf = await saveOIDCConfig() - jest.clearAllMocks() - await saveOIDCConfig( - { ...oidcConf.config.configs[0], activated: false }, - oidcConf._id, - oidcConf._rev - ) - expect(events.auth.SSOUpdated).toBeCalledTimes(1) - expect(events.auth.SSOUpdated).toBeCalledWith(Config.OIDC) - expect(events.auth.SSOActivated).not.toBeCalled() - expect(events.auth.SSODeactivated).toBeCalledTimes(1) - expect(events.auth.SSODeactivated).toBeCalledWith(Config.OIDC) - await config.deleteConfig(Config.OIDC) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + const oidcConf = await saveOIDCConfig() + jest.clearAllMocks() + await saveOIDCConfig( + { ...oidcConf.config.configs[0], activated: false }, + oidcConf._id, + oidcConf._rev + ) + expect(events.auth.SSOUpdated).toBeCalledTimes(1) + expect(events.auth.SSOUpdated).toBeCalledWith(Config.OIDC) + expect(events.auth.SSOActivated).not.toBeCalled() + expect(events.auth.SSODeactivated).toBeCalledTimes(1) + expect(events.auth.SSODeactivated).toBeCalledWith(Config.OIDC) + await config.deleteConfig(Config.OIDC) + }) }) it("should update OIDC config to activated", async () => { - const oidcConf = await saveOIDCConfig({ activated: false }) - jest.clearAllMocks() - await saveOIDCConfig( - { ...oidcConf.config.configs[0], activated: true }, - oidcConf._id, - oidcConf._rev - ) - expect(events.auth.SSOUpdated).toBeCalledTimes(1) - expect(events.auth.SSOUpdated).toBeCalledWith(Config.OIDC) - expect(events.auth.SSODeactivated).not.toBeCalled() - expect(events.auth.SSOActivated).toBeCalledTimes(1) - expect(events.auth.SSOActivated).toBeCalledWith(Config.OIDC) - await config.deleteConfig(Config.OIDC) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + const oidcConf = await saveOIDCConfig({ activated: false }) + jest.clearAllMocks() + await saveOIDCConfig( + { ...oidcConf.config.configs[0], activated: true }, + oidcConf._id, + oidcConf._rev + ) + expect(events.auth.SSOUpdated).toBeCalledTimes(1) + expect(events.auth.SSOUpdated).toBeCalledWith(Config.OIDC) + expect(events.auth.SSODeactivated).not.toBeCalled() + expect(events.auth.SSOActivated).toBeCalledTimes(1) + expect(events.auth.SSOActivated).toBeCalledWith(Config.OIDC) + await config.deleteConfig(Config.OIDC) + }) }) }) }) @@ -179,22 +187,26 @@ describe("configs", () => { describe("create", () => { it("should create SMTP config", async () => { - await config.deleteConfig(Config.SMTP) - await saveSMTPConfig() - expect(events.email.SMTPUpdated).not.toBeCalled() - expect(events.email.SMTPCreated).toBeCalledTimes(1) - await config.deleteConfig(Config.SMTP) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + await config.deleteConfig(Config.SMTP) + await saveSMTPConfig() + expect(events.email.SMTPUpdated).not.toBeCalled() + expect(events.email.SMTPCreated).toBeCalledTimes(1) + await config.deleteConfig(Config.SMTP) + }) }) }) describe("update", () => { it("should update SMTP config", async () => { - const smtpConf = await saveSMTPConfig() - jest.clearAllMocks() - await saveSMTPConfig(smtpConf.config, smtpConf._id, smtpConf._rev) - expect(events.email.SMTPCreated).not.toBeCalled() - expect(events.email.SMTPUpdated).toBeCalledTimes(1) - await config.deleteConfig(Config.SMTP) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + const smtpConf = await saveSMTPConfig() + jest.clearAllMocks() + await saveSMTPConfig(smtpConf.config, smtpConf._id, smtpConf._rev) + expect(events.email.SMTPCreated).not.toBeCalled() + expect(events.email.SMTPUpdated).toBeCalledTimes(1) + await config.deleteConfig(Config.SMTP) + }) }) }) }) @@ -211,65 +223,73 @@ describe("configs", () => { describe("create", () => { it("should create settings config with default settings", async () => { - await config.deleteConfig(Config.SETTINGS) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + await config.deleteConfig(Config.SETTINGS) - await saveSettingsConfig() + await saveSettingsConfig() - expect(events.org.nameUpdated).not.toBeCalled() - expect(events.org.logoUpdated).not.toBeCalled() - expect(events.org.platformURLUpdated).not.toBeCalled() + expect(events.org.nameUpdated).not.toBeCalled() + expect(events.org.logoUpdated).not.toBeCalled() + expect(events.org.platformURLUpdated).not.toBeCalled() + }) }) it("should create settings config with non-default settings", async () => { - config.modeSelf() - await config.deleteConfig(Config.SETTINGS) - const conf = { - company: "acme", - logoUrl: "http://example.com", - platformUrl: "http://example.com", - } + await context.doInTenant(config.tenant1User!.tenantId, async () => { + config.modeSelf() + await config.deleteConfig(Config.SETTINGS) + const conf = { + company: "acme", + logoUrl: "http://example.com", + platformUrl: "http://example.com", + } - await saveSettingsConfig(conf) + await saveSettingsConfig(conf) - expect(events.org.nameUpdated).toBeCalledTimes(1) - expect(events.org.logoUpdated).toBeCalledTimes(1) - expect(events.org.platformURLUpdated).toBeCalledTimes(1) - config.modeCloud() + expect(events.org.nameUpdated).toBeCalledTimes(1) + expect(events.org.logoUpdated).toBeCalledTimes(1) + expect(events.org.platformURLUpdated).toBeCalledTimes(1) + config.modeCloud() + }) }) }) describe("update", () => { it("should update settings config", async () => { - config.modeSelf() - await config.deleteConfig(Config.SETTINGS) - const settingsConfig = await saveSettingsConfig() - settingsConfig.config.company = "acme" - settingsConfig.config.logoUrl = "http://example.com" - settingsConfig.config.platformUrl = "http://example.com" + await context.doInTenant(config.tenant1User!.tenantId, async () => { + config.modeSelf() + await config.deleteConfig(Config.SETTINGS) + const settingsConfig = await saveSettingsConfig() + settingsConfig.config.company = "acme" + settingsConfig.config.logoUrl = "http://example.com" + settingsConfig.config.platformUrl = "http://example.com" - await saveSettingsConfig( - settingsConfig.config, - settingsConfig._id, - settingsConfig._rev - ) + await saveSettingsConfig( + settingsConfig.config, + settingsConfig._id, + settingsConfig._rev + ) - expect(events.org.nameUpdated).toBeCalledTimes(1) - expect(events.org.logoUpdated).toBeCalledTimes(1) - expect(events.org.platformURLUpdated).toBeCalledTimes(1) - config.modeCloud() + expect(events.org.nameUpdated).toBeCalledTimes(1) + expect(events.org.logoUpdated).toBeCalledTimes(1) + expect(events.org.platformURLUpdated).toBeCalledTimes(1) + config.modeCloud() + }) }) }) }) }) it("should return the correct checklist status based on the state of the budibase installation", async () => { - await config.saveSmtpConfig() + await context.doInTenant(config.tenant1User!.tenantId, async () => { + await config.saveSmtpConfig() - const res = await config.api.configs.getConfigChecklist() - const checklist = res.body + const res = await config.api.configs.getConfigChecklist() + const checklist = res.body - expect(checklist.apps.checked).toBeFalsy() - expect(checklist.smtp.checked).toBeTruthy() - expect(checklist.adminUser.checked).toBeTruthy() + expect(checklist.apps.checked).toBeFalsy() + expect(checklist.smtp.checked).toBeTruthy() + expect(checklist.adminUser.checked).toBeTruthy() + }) }) }) diff --git a/packages/worker/src/api/routes/global/tests/roles.spec.ts b/packages/worker/src/api/routes/global/tests/roles.spec.ts index 2289273488..622a643f25 100644 --- a/packages/worker/src/api/routes/global/tests/roles.spec.ts +++ b/packages/worker/src/api/routes/global/tests/roles.spec.ts @@ -1,6 +1,7 @@ import { structures, TestConfiguration } from "../../../../tests" import { context, db, permissions, roles } from "@budibase/backend-core" import { Mock } from "jest-mock" +import { Database } from "@budibase/types" jest.mock("@budibase/backend-core", () => { const core = jest.requireActual("@budibase/backend-core") @@ -16,14 +17,13 @@ jest.mock("@budibase/backend-core", () => { } }) -const appDb = db.getDB("app_test") -const mockAppDB = context.getAppDB as Mock -mockAppDB.mockReturnValue(appDb) +let appId: string +let appDb: Database async function addAppMetadata() { await appDb.put({ _id: "app_metadata", - appId: "app_test", + appId: appId, name: "New App", version: "version", url: "url", @@ -39,12 +39,19 @@ describe("/api/global/roles", () => { ) beforeAll(async () => { - console.debug(role) - appDb.put(role) - await addAppMetadata() await config.beforeAll() }) + beforeEach(async () => { + appId = db.generateAppID() + appDb = db.getDB(appId) + const mockAppDB = context.getAppDB as Mock + mockAppDB.mockReturnValue(appDb) + + await addAppMetadata() + appDb.put(role) + }) + afterAll(async () => { await config.afterAll() }) @@ -57,16 +64,14 @@ describe("/api/global/roles", () => { it("retrieves roles", async () => { const res = await config.api.roles.get() expect(res.body).toBeDefined() - expect(res.body["app_test"].roles.length).toEqual(5) - expect(res.body["app_test"].roles.map((r: any) => r._id)).toContain( - role._id - ) + expect(res.body[appId].roles.length).toEqual(5) + expect(res.body[appId].roles.map((r: any) => r._id)).toContain(role._id) }) }) describe("GET api/global/roles/:appId", () => { it("finds a role by appId", async () => { - const res = await config.api.roles.find("app_test") + const res = await config.api.roles.find(appId) expect(res.body).toBeDefined() expect(res.body.name).toEqual("New App") }) @@ -79,9 +84,9 @@ describe("/api/global/roles", () => { app_test: "role1", } const userResponse = await config.createUser(user) - const res = await config.api.roles.remove("app_test") + const res = await config.api.roles.remove(appId) const updatedUser = await config.api.users.getUser(userResponse._id!) - expect(updatedUser.body.roles).not.toHaveProperty("app_test") + expect(updatedUser.body.roles).not.toHaveProperty(appId) expect(res.body.message).toEqual("App role removed from all users") }) }) diff --git a/packages/worker/src/api/routes/global/tests/users.spec.ts b/packages/worker/src/api/routes/global/tests/users.spec.ts index 10c29809b9..7ebc8d9e71 100644 --- a/packages/worker/src/api/routes/global/tests/users.spec.ts +++ b/packages/worker/src/api/routes/global/tests/users.spec.ts @@ -1,14 +1,9 @@ import { InviteUsersResponse, User } from "@budibase/types" jest.mock("nodemailer") -import { - TestConfiguration, - mocks, - structures, - TENANT_1, -} from "../../../../tests" +import { TestConfiguration, mocks, structures } from "../../../../tests" const sendMailMock = mocks.email.mock() -import { events, tenancy } from "@budibase/backend-core" +import { context, events, tenancy, utils } from "@budibase/backend-core" describe("/api/global/users", () => { const config = new TestConfiguration() @@ -27,16 +22,18 @@ describe("/api/global/users", () => { describe("invite", () => { it("should be able to generate an invitation", async () => { - const email = structures.users.newEmail() - const { code, res } = await config.api.users.sendUserInvite( - sendMailMock, - email - ) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + const email = structures.users.newEmail() + const { code, res } = await config.api.users.sendUserInvite( + sendMailMock, + email + ) - expect(res.body).toEqual({ message: "Invitation has been sent." }) - expect(sendMailMock).toHaveBeenCalled() - expect(code).toBeDefined() - expect(events.user.invited).toBeCalledTimes(1) + expect(res.body).toEqual({ message: "Invitation has been sent." }) + expect(sendMailMock).toHaveBeenCalled() + expect(code).toBeDefined() + expect(events.user.invited).toBeCalledTimes(1) + }) }) it("should not be able to generate an invitation for existing user", async () => { @@ -53,20 +50,22 @@ describe("/api/global/users", () => { }) it("should be able to create new user from invite", async () => { - const email = structures.users.newEmail() - const { code } = await config.api.users.sendUserInvite( - sendMailMock, - email - ) + await context.doInTenant(config.tenant1User!.tenantId, async () => { + const email = structures.users.newEmail() + const { code } = await config.api.users.sendUserInvite( + sendMailMock, + email + ) - const res = await config.api.users.acceptInvite(code) + const res = await config.api.users.acceptInvite(code) - expect(res.body._id).toBeDefined() - const user = await config.getUser(email) - expect(user).toBeDefined() - expect(user._id).toEqual(res.body._id) - expect(events.user.inviteAccepted).toBeCalledTimes(1) - expect(events.user.inviteAccepted).toBeCalledWith(user) + expect(res.body._id).toBeDefined() + const user = await config.getUser(email) + expect(user).toBeDefined() + expect(user._id).toEqual(res.body._id) + expect(events.user.inviteAccepted).toBeCalledTimes(1) + expect(events.user.inviteAccepted).toBeCalledWith(user) + }) }) }) @@ -118,7 +117,7 @@ describe("/api/global/users", () => { const user = await config.createUser() jest.clearAllMocks() - await tenancy.doInTenant(TENANT_1, async () => { + await tenancy.doInTenant(config.getTenantId(), async () => { const response = await config.api.users.bulkCreateUsers([user]) expect(response.created?.successful.length).toBe(0) @@ -231,7 +230,7 @@ describe("/api/global/users", () => { const user = await config.createUser() jest.clearAllMocks() - await tenancy.doInTenant(TENANT_1, async () => { + await tenancy.doInTenant(config.getTenantId(), async () => { delete user._id const response = await config.api.users.saveUser(user, 400) @@ -444,7 +443,7 @@ describe("/api/global/users", () => { }) it("should not be able to update email address", async () => { - const email = "email@test.com" + const email = `${utils.newid()}@test.com` const user = await config.createUser(structures.users.user({ email })) user.email = "new@test.com" diff --git a/packages/worker/src/tests/TestConfiguration.ts b/packages/worker/src/tests/TestConfiguration.ts index ecf7e14ebe..ce6106da87 100644 --- a/packages/worker/src/tests/TestConfiguration.ts +++ b/packages/worker/src/tests/TestConfiguration.ts @@ -20,8 +20,11 @@ import { auth, constants, env as coreEnv, + context, + utils, + DEFAULT_TENANT_ID, } from "@budibase/backend-core" -import structures, { TENANT_ID, TENANT_1, CSRF_TOKEN } from "./structures" +import structures, { TENANT_ID, CSRF_TOKEN } from "./structures" import { CreateUserResponse, User, AuthToken } from "@budibase/types" import API from "./api" @@ -36,6 +39,7 @@ class TestConfiguration { api: API defaultUser?: User tenant1User?: User + #tenantId?: string constructor( opts: { openServer: boolean; mode: Mode } = { @@ -112,10 +116,12 @@ class TestConfiguration { // SETUP / TEARDOWN async beforeAll() { + this.#tenantId = `tenant-${utils.newid()}` + await this.createDefaultUser() await this.createSession(this.defaultUser!) - await tenancy.doInTenant(TENANT_1, async () => { + await tenancy.doInTenant(this.#tenantId, async () => { await this.createTenant1User() await this.createSession(this.tenant1User!) }) @@ -152,7 +158,7 @@ class TestConfiguration { try { return tenancy.getTenantId() } catch (e: any) { - return TENANT_ID + return DEFAULT_TENANT_ID } } @@ -203,7 +209,7 @@ class TestConfiguration { const tenantId = this.getTenantId() if (tenantId === TENANT_ID) { return this.authHeaders(this.defaultUser!) - } else if (tenantId === TENANT_1) { + } else if (tenantId === this.getTenantId()) { return this.authHeaders(this.tenant1User!) } else { throw new Error("could not determine auth headers to use") @@ -222,7 +228,6 @@ class TestConfiguration { async createDefaultUser() { const user = structures.users.adminUser({ - email: "test@test.com", password: "test", }) this.defaultUser = await this.createUser(user) @@ -230,7 +235,6 @@ class TestConfiguration { async createTenant1User() { const user = structures.users.adminUser({ - email: "tenant1@test.com", password: "test", }) this.tenant1User = await this.createUser(user) diff --git a/packages/worker/src/tests/api/auth.ts b/packages/worker/src/tests/api/auth.ts index dda50976bd..ccbf747273 100644 --- a/packages/worker/src/tests/api/auth.ts +++ b/packages/worker/src/tests/api/auth.ts @@ -1,3 +1,4 @@ +import structures from "../structures" import TestConfiguration from "../TestConfiguration" import { TestAPI } from "./base" @@ -24,14 +25,17 @@ export class AuthAPI extends TestAPI { .expect(200) } - requestPasswordReset = async (sendMailMock: any) => { + requestPasswordReset = async (sendMailMock: any, userEmail: string) => { await this.config.saveSmtpConfig() await this.config.saveSettingsConfig() - await this.config.createUser() + await this.config.createUser({ + ...structures.users.user(), + email: userEmail, + }) const res = await this.request .post(`/api/global/auth/${this.config.getTenantId()}/reset`) .send({ - email: "test@test.com", + email: userEmail, }) .expect("Content-Type", /json/) .expect(200) diff --git a/packages/worker/src/tests/api/configs.ts b/packages/worker/src/tests/api/configs.ts index 10413dfdd6..76a6f31415 100644 --- a/packages/worker/src/tests/api/configs.ts +++ b/packages/worker/src/tests/api/configs.ts @@ -10,8 +10,8 @@ export class ConfigAPI extends TestAPI { return this.request .get(`/api/global/configs/checklist`) .set(this.config.defaultHeaders()) - .expect("Content-Type", /json/) .expect(200) + .expect("Content-Type", /json/) } saveConfig = (data: any) => { @@ -19,8 +19,8 @@ export class ConfigAPI extends TestAPI { .post(`/api/global/configs`) .send(data) .set(this.config.defaultHeaders()) - .expect("Content-Type", /json/) .expect(200) + .expect("Content-Type", /json/) } OIDCCallback = (configId: string, preAuthRes: any) => { diff --git a/packages/worker/src/tests/api/users.ts b/packages/worker/src/tests/api/users.ts index f2c95a20a1..884336fa4e 100644 --- a/packages/worker/src/tests/api/users.ts +++ b/packages/worker/src/tests/api/users.ts @@ -26,8 +26,8 @@ export class UserAPI extends TestAPI { email, }) .set(this.config.defaultHeaders()) - .expect("Content-Type", /json/) .expect(status) + .expect("Content-Type", /json/) if (status !== 200) { return { code: undefined, res } @@ -99,7 +99,7 @@ export class UserAPI extends TestAPI { request = { email: structures.email(), password: generator.string(), - tenantId: structures.uuid(), + tenantId: `tenant-${structures.uuid()}`, } } const res = await this.request diff --git a/packages/worker/src/tests/jestEnv.ts b/packages/worker/src/tests/jestEnv.ts index 88ed8c2ed5..0b27cf52aa 100644 --- a/packages/worker/src/tests/jestEnv.ts +++ b/packages/worker/src/tests/jestEnv.ts @@ -1,16 +1,11 @@ -import env from "../environment" -import { env as coreEnv } from "@budibase/backend-core" - -env._set("SELF_HOSTED", "0") -env._set("NODE_ENV", "jest") -env._set("JWT_SECRET", "test-jwtsecret") -env._set("LOG_LEVEL", "silent") -env._set("MULTI_TENANCY", "1") -env._set("MINIO_URL", "http://localhost") -env._set("MINIO_ACCESS_KEY", "test") -env._set("MINIO_SECRET_KEY", "test") -env._set("PLATFORM_URL", "http://localhost:10000") -env._set("INTERNAL_API_KEY", "test") -env._set("DISABLE_ACCOUNT_PORTAL", "0") -coreEnv._set("COUCH_DB_USER", "budibase") -coreEnv._set("COUCH_DB_PASSWORD", "budibase") +process.env.SELF_HOSTED = "0" +process.env.NODE_ENV = "jest" +process.env.JWT_SECRET = "test-jwtsecret" +process.env.LOG_LEVEL = "silent" +process.env.MULTI_TENANCY = "1" +process.env.MINIO_URL = "http://localhost" +process.env.MINIO_ACCESS_KEY = "test" +process.env.MINIO_SECRET_KEY = "test" +process.env.PLATFORM_URL = "http://localhost:10000" +process.env.INTERNAL_API_KEY = "tet" +process.env.DISABLE_ACCOUNT_PORTAL = "0" diff --git a/packages/worker/src/tests/jestSetup.ts b/packages/worker/src/tests/jestSetup.ts index 9a948b674d..89ffb85b95 100644 --- a/packages/worker/src/tests/jestSetup.ts +++ b/packages/worker/src/tests/jestSetup.ts @@ -1,5 +1,8 @@ import { mocks } from "@budibase/backend-core/tests" +import env from "../environment" +import { env as coreEnv } from "@budibase/backend-core" + // must explicitly enable fetch mock mocks.fetch.enable() @@ -17,3 +20,24 @@ if (!process.env.CI) { // 100 seconds jest.setTimeout(100000) } + +function overrideConfigValue(key: string, value: string) { + env._set(key, value) + coreEnv._set(key, value) +} + +const globalSafe = global as any + +overrideConfigValue( + "COUCH_DB_PORT", + globalSafe.__TESTCONTAINERS_DEVENV_PORT_5984__ +) +overrideConfigValue( + "COUCH_DB_URL", + `http://${globalSafe.__TESTCONTAINERS_DEVENV_IP__}:${globalSafe.__TESTCONTAINERS_DEVENV_PORT_5984__}` +) + +overrideConfigValue( + "MINIO_URL", + `http://${globalSafe.__TESTCONTAINERS_DEVENV_IP__}:${globalSafe.__TESTCONTAINERS_DEVENV_PORT_9000__}` +) diff --git a/packages/worker/src/tests/structures/index.ts b/packages/worker/src/tests/structures/index.ts index 1223dfa019..dad055f7a7 100644 --- a/packages/worker/src/tests/structures/index.ts +++ b/packages/worker/src/tests/structures/index.ts @@ -5,7 +5,6 @@ import * as groups from "./groups" import { v4 as uuid } from "uuid" export const TENANT_ID = "default" -export const TENANT_1 = "tenant1" export const CSRF_TOKEN = "e3727778-7af0-4226-b5eb-f43cbe60a306" const pkg = { @@ -14,7 +13,6 @@ const pkg = { configs, users, TENANT_ID, - TENANT_1, CSRF_TOKEN, groups, } From 1534218c9416aef6f3f07424cce9d3a2b09f0dcc Mon Sep 17 00:00:00 2001 From: Dean Date: Fri, 27 Jan 2023 17:59:50 +0000 Subject: [PATCH 159/386] Validation refactor --- .../src/pages/builder/admin/index.svelte | 66 ++++++++--------- .../pages/builder/auth/_components/utils.js | 9 ++- .../src/pages/builder/auth/forgot.svelte | 2 +- .../src/pages/builder/auth/login.svelte | 28 ++++---- .../src/pages/builder/auth/reset.svelte | 58 +++++++-------- .../src/pages/builder/invite/index.svelte | 70 +++++++++---------- 6 files changed, 111 insertions(+), 122 deletions(-) diff --git a/packages/builder/src/pages/builder/admin/index.svelte b/packages/builder/src/pages/builder/admin/index.svelte index 7ef2d6d290..cc1a70b3bc 100644 --- a/packages/builder/src/pages/builder/admin/index.svelte +++ b/packages/builder/src/pages/builder/admin/index.svelte @@ -15,7 +15,7 @@ import { onMount } from "svelte" import { FancyForm, FancyInput, ActionButton } from "@budibase/bbui" import { TestimonialPage } from "@budibase/frontend-core/src/components" - import { handleError, passwordsMatch } from "../auth/_components/utils" + import { passwordsMatch, handleError } from "../auth/_components/utils" let modal let form @@ -26,7 +26,6 @@ $: tenantId = $auth.tenantId $: cloud = $admin.cloud $: imported = $admin.importComplete - $: multiTenancyEnabled = $admin.multiTenancy async function save() { form.validate() @@ -35,7 +34,8 @@ } submitted = true try { - const adminUser = { ...formData, tenantId } + let adminUser = { ...formData, tenantId } + delete adminUser.confirmationPassword // Save the admin user await API.createAdminUser(adminUser) notifications.success("Admin user created") @@ -81,13 +81,10 @@ } }} validate={() => { - handleError(() => { - return { - email: !formData.email - ? "Please enter a valid email" - : undefined, - } - }, errors) + let fieldError = { + email: !formData.email ? "Please enter a valid email" : undefined, + } + errors = handleError({ ...errors, ...fieldError }) }} disabled={submitted} error={errors.email} @@ -103,23 +100,21 @@ } }} validate={() => { - handleError(() => { - let err = {} + let fieldError = {} - err["password"] = !formData.password - ? "Please enter a password" + fieldError["password"] = !formData.password + ? "Please enter a password" + : undefined + + fieldError["confirmationPassword"] = + !passwordsMatch( + formData.password, + formData.confirmationPassword + ) && formData.confirmationPassword + ? "Passwords must match" : undefined - err["confirmationPassword"] = - !passwordsMatch( - formData.password, - formData.confirmationPassword - ) && formData.confirmationPassword - ? "Passwords must match" - : undefined - - return err - }, errors) + errors = handleError({ ...errors, ...fieldError }) }} error={errors.password} disabled={submitted} @@ -135,17 +130,16 @@ } }} validate={() => { - handleError(() => { - return { - confirmationPassword: - !passwordsMatch( - formData.password, - formData.confirmationPassword - ) && formData.password - ? "Passwords must match" - : undefined, - } - }, errors) + let fieldError = { + confirmationPassword: + !passwordsMatch( + formData.password, + formData.confirmationPassword + ) && formData.password + ? "Passwords must match" + : undefined, + } + errors = handleError({ ...errors, ...fieldError }) }} error={errors.confirmationPassword} disabled={submitted} @@ -163,7 +157,7 @@ diff --git a/packages/builder/src/components/portal/onboarding/TourPopover.svelte b/packages/builder/src/components/portal/onboarding/TourPopover.svelte index ec9a9a999b..b04c796d04 100644 --- a/packages/builder/src/components/portal/onboarding/TourPopover.svelte +++ b/packages/builder/src/components/portal/onboarding/TourPopover.svelte @@ -110,12 +110,11 @@ {#key tourStepKey} @@ -160,6 +159,7 @@ } :global([data-cy="tour-popover-menu"]) { padding: 10px; + margin-top: var(--spacing-l); } .tour-body :global(.feature-list) { margin-bottom: 0px; diff --git a/packages/builder/src/components/portal/onboarding/tours.js b/packages/builder/src/components/portal/onboarding/tours.js index d483a5af8b..8acd5bb8ce 100644 --- a/packages/builder/src/components/portal/onboarding/tours.js +++ b/packages/builder/src/components/portal/onboarding/tours.js @@ -34,6 +34,7 @@ const getTours = () => { onLoad: async () => { tourEvent(TOUR_STEP_KEYS.BUILDER_DATA_SECTION) }, + align: "left", }, { id: TOUR_STEP_KEYS.BUILDER_DESIGN_SECTION, @@ -44,6 +45,7 @@ const getTours = () => { onLoad: () => { tourEvent(TOUR_STEP_KEYS.BUILDER_DESIGN_SECTION) }, + align: "left", }, { id: TOUR_STEP_KEYS.BUILDER_AUTOMATE_SECTION, @@ -54,6 +56,7 @@ const getTours = () => { onLoad: () => { tourEvent(TOUR_STEP_KEYS.BUILDER_AUTOMATE_SECTION) }, + align: "left", }, { id: TOUR_STEP_KEYS.BUILDER_APP_PUBLISH, From 9786c85bd3b9a6d9d01fbff13dfd62fcd16998fa Mon Sep 17 00:00:00 2001 From: Dean Date: Sun, 29 Jan 2023 22:00:20 +0000 Subject: [PATCH 163/386] Feedback updates --- .../data/table/[selectedTable]/index.svelte | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/data/table/[selectedTable]/index.svelte b/packages/builder/src/pages/builder/app/[application]/data/table/[selectedTable]/index.svelte index 5f12496895..5a3597ab6d 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/table/[selectedTable]/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/table/[selectedTable]/index.svelte @@ -1,7 +1,7 @@ +
-
+
+ background
@@ -25,11 +30,14 @@ overflow-y: auto; } .right { - background: linear-gradient( - to bottom right, - var(--spectrum-global-color-gray-300) 0%, - var(--background) 100% - ); + position: relative; + } + .right img { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; } .content { width: 100%; From ca399568e2df1d189c1e4196ea09ac2370dbdc40 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 31 Jan 2023 15:49:41 +0000 Subject: [PATCH 191/386] Use real testimonials on testimonial page --- .../src/components/TestimonialPage.svelte | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/packages/frontend-core/src/components/TestimonialPage.svelte b/packages/frontend-core/src/components/TestimonialPage.svelte index f2f74731d0..25ed4ac08d 100644 --- a/packages/frontend-core/src/components/TestimonialPage.svelte +++ b/packages/frontend-core/src/components/TestimonialPage.svelte @@ -1,6 +1,34 @@ @@ -8,19 +36,17 @@
+ a-happy-budibase-user
- "Here is an example of how Budibase changed my life for the better and - now all I do is eat, sleep, build apps, repeat." + "{testimonial.text}"
-
- a-happy-budibase-user -
-
No-code Enthusiast
-
Bedroom TLD
-
+
+
{testimonial.name}
+
{testimonial.role}
@@ -35,23 +61,13 @@ place-items: center; } .testimonial { - width: 280px; + width: 380px; padding: 40px; } .text { font-size: var(--font-size-l); font-style: italic; } - img { - width: 40px; - } - .user { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - gap: var(--spacing-s); - } .name { font-weight: bold; color: var(--spectrum-global-color-gray-900); From 6bd5d9e80b3737930cb91f2cf4cc07608e20afd7 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 15:49:55 +0000 Subject: [PATCH 192/386] Update pro version to 2.2.12-alpha.49 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index e0a44c74d0..3f357a2e26 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.49", "@budibase/client": "2.2.12-alpha.49", - "@budibase/pro": "2.2.12-alpha.48", + "@budibase/pro": "2.2.12-alpha.49", "@budibase/string-templates": "2.2.12-alpha.49", "@budibase/types": "2.2.12-alpha.49", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 44cb55b072..f218c89ca4 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1273,13 +1273,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.48.tgz#d211474e8ba57f2aa8d9c7b263cfbe96f7051ab9" - integrity sha512-7UuMHuV7jcaq5Y9fz7PM+YgT5bexuhm2UOoTivAtKOJwUR5Au7lGunVAZqLB5BPp55B9ncD/mQ5fev16vrep0Q== +"@budibase/backend-core@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.49.tgz#898f8465cb834c87123d2451f1b43cdeef8c080d" + integrity sha512-TyEiCrU5zmsLLcd6OejHYNp9fYMw0MdbstCWnek2GTuBKTrnifir33EYgCMh5+z7GQ63V28XHpmY9DKMnhC7MQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.48" + "@budibase/types" "2.2.12-alpha.49" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1374,13 +1374,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.48.tgz#639431a654dbe55c316a94e4220adae76e5f7540" - integrity sha512-QMilBTDN/y5ieTnIjSlovhbmBLfTQV11B3YapJcdtpWKALyGpuZ7eYBY2DIjZtxTx5BE1Ib+BAJZmBxyXlkcHg== +"@budibase/pro@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.49.tgz#2b79207a19ac3364dfadaec7cf546fb0f92f0881" + integrity sha512-0m0ZcS65N2D8YBRbrSH7ajapMSNIJnqGM+tkbAg8LtNwrApt6p1S1KbCEuCSDxxy+tr6MXV+2hDLLaSa3ukgQg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.48" - "@budibase/types" "2.2.12-alpha.48" + "@budibase/backend-core" "2.2.12-alpha.49" + "@budibase/types" "2.2.12-alpha.49" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1406,10 +1406,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.48.tgz#5036062395c0290e6d7d83c2438945a4fbe33432" - integrity sha512-DrGGGaJL7QIwM5W40jXFWHdVU7g3mTqqhqSmciglitaapngYnkVAztkS2itjimStB/6WuxE+V2dRKAJgkvKeGw== +"@budibase/types@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.49.tgz#c873c3ced54d06e4bc40959a9f8112c73326175e" + integrity sha512-wiU0KtyVQ9HJiSUSdEsidq62GEf0Yn13DqXBFtB2VLKcwrcpmyQdDb3hLzFvGCmlfy2h8qkjUFVBEImlwlB9+Q== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index 8c4b112fa1..2957ebc743 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.49", - "@budibase/pro": "2.2.12-alpha.48", + "@budibase/pro": "2.2.12-alpha.49", "@budibase/string-templates": "2.2.12-alpha.49", "@budibase/types": "2.2.12-alpha.49", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index f3c081acfb..0b928943dc 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -470,13 +470,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.48.tgz#d211474e8ba57f2aa8d9c7b263cfbe96f7051ab9" - integrity sha512-7UuMHuV7jcaq5Y9fz7PM+YgT5bexuhm2UOoTivAtKOJwUR5Au7lGunVAZqLB5BPp55B9ncD/mQ5fev16vrep0Q== +"@budibase/backend-core@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.49.tgz#898f8465cb834c87123d2451f1b43cdeef8c080d" + integrity sha512-TyEiCrU5zmsLLcd6OejHYNp9fYMw0MdbstCWnek2GTuBKTrnifir33EYgCMh5+z7GQ63V28XHpmY9DKMnhC7MQ== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.48" + "@budibase/types" "2.2.12-alpha.49" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -521,13 +521,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.48.tgz#639431a654dbe55c316a94e4220adae76e5f7540" - integrity sha512-QMilBTDN/y5ieTnIjSlovhbmBLfTQV11B3YapJcdtpWKALyGpuZ7eYBY2DIjZtxTx5BE1Ib+BAJZmBxyXlkcHg== +"@budibase/pro@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.49.tgz#2b79207a19ac3364dfadaec7cf546fb0f92f0881" + integrity sha512-0m0ZcS65N2D8YBRbrSH7ajapMSNIJnqGM+tkbAg8LtNwrApt6p1S1KbCEuCSDxxy+tr6MXV+2hDLLaSa3ukgQg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.48" - "@budibase/types" "2.2.12-alpha.48" + "@budibase/backend-core" "2.2.12-alpha.49" + "@budibase/types" "2.2.12-alpha.49" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -535,10 +535,10 @@ lru-cache "^7.14.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.48": - version "2.2.12-alpha.48" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.48.tgz#5036062395c0290e6d7d83c2438945a4fbe33432" - integrity sha512-DrGGGaJL7QIwM5W40jXFWHdVU7g3mTqqhqSmciglitaapngYnkVAztkS2itjimStB/6WuxE+V2dRKAJgkvKeGw== +"@budibase/types@2.2.12-alpha.49": + version "2.2.12-alpha.49" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.49.tgz#c873c3ced54d06e4bc40959a9f8112c73326175e" + integrity sha512-wiU0KtyVQ9HJiSUSdEsidq62GEf0Yn13DqXBFtB2VLKcwrcpmyQdDb3hLzFvGCmlfy2h8qkjUFVBEImlwlB9+Q== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 06f87c3a825e34f9674eb673a81b7273602c2acd Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 31 Jan 2023 15:54:06 +0000 Subject: [PATCH 193/386] Enable rollup to bundle PNG images due to new assets in frontend-core --- packages/client/package.json | 1 + packages/client/rollup.config.js | 2 ++ packages/client/yarn.lock | 34 +++++++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/client/package.json b/packages/client/package.json index 2f28c4e699..6c176f211a 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -48,6 +48,7 @@ "devDependencies": { "@rollup/plugin-alias": "^3.1.5", "@rollup/plugin-commonjs": "^18.0.0", + "@rollup/plugin-image": "^3.0.2", "@rollup/plugin-node-resolve": "^11.2.1", "postcss": "^8.2.10", "rollup": "^2.44.0", diff --git a/packages/client/rollup.config.js b/packages/client/rollup.config.js index be94ace90c..a69de38799 100644 --- a/packages/client/rollup.config.js +++ b/packages/client/rollup.config.js @@ -5,6 +5,7 @@ import svelte from "rollup-plugin-svelte" import { terser } from "rollup-plugin-terser" import postcss from "rollup-plugin-postcss" import svg from "rollup-plugin-svg" +import image from "@rollup/plugin-image" import json from "rollup-plugin-json" import nodePolyfills from "rollup-plugin-polyfill-node" import path from "path" @@ -87,6 +88,7 @@ export default { dedupe: ["svelte", "svelte/internal"], }), svg(), + image(), json(), production && terser(), !production && visualizer(), diff --git a/packages/client/yarn.lock b/packages/client/yarn.lock index 68d29299a8..e7140f7af3 100644 --- a/packages/client/yarn.lock +++ b/packages/client/yarn.lock @@ -83,6 +83,14 @@ magic-string "^0.25.7" resolve "^1.17.0" +"@rollup/plugin-image@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-image/-/plugin-image-3.0.2.tgz#8a66389510517495c5d10d392140cdefa43b27c2" + integrity sha512-eGVrD6lummWH5ENo9LWX3JY62uBb9okUNQ2htXkugrG6WjACrMUVhWvss+0wW3fwJWmFYpoEny3yL4spEdh15g== + dependencies: + "@rollup/pluginutils" "^5.0.1" + mini-svg-data-uri "^1.4.4" + "@rollup/plugin-inject@^4.0.0": version "4.0.4" resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz#fbeee66e9a700782c4f65c8b0edbafe58678fbc2" @@ -113,6 +121,15 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rollup/pluginutils@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" @@ -182,6 +199,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + "@types/node@*": version "16.11.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42" @@ -599,7 +621,7 @@ estree-walker@^1.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -estree-walker@^2.0.1: +estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== @@ -845,6 +867,11 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +mini-svg-data-uri@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== + minimatch@^3.0.2, minimatch@^3.0.4: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -955,6 +982,11 @@ picomatch@^2.2.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" From b2813db5db41f99b61f166a5c32bd05eaf13bd77 Mon Sep 17 00:00:00 2001 From: adrinr Date: Tue, 31 Jan 2023 16:15:11 +0000 Subject: [PATCH 194/386] Handle db creation race conditions --- hosting/docker-compose.test.yaml | 13 ------------- packages/backend-core/src/db/couch/DatabaseImpl.ts | 9 ++++++++- packages/server/src/app.ts | 7 +------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/hosting/docker-compose.test.yaml b/hosting/docker-compose.test.yaml index f11d32fc3b..dfd78621c5 100644 --- a/hosting/docker-compose.test.yaml +++ b/hosting/docker-compose.test.yaml @@ -37,19 +37,6 @@ services: timeout: 20s retries: 3 - couch-init: - image: curlimages/curl - environment: - PUT_CALL: "curl -u ${COUCH_DB_USER}:${COUCH_DB_PASSWORD} -X PUT couchdb-service:5984" - depends_on: - - couchdb-service - command: - [ - "sh", - "-c", - "sleep 10 && $${PUT_CALL}/_users && $${PUT_CALL}/_replicator; fg;", - ] - redis-service: restart: on-failure image: redis diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 4919d8db4a..de45c14033 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -58,7 +58,14 @@ export class DatabaseImpl implements Database { throw new Error("DB does not exist") } if (!exists) { - await DatabaseImpl.nano.db.create(this.name) + try { + await DatabaseImpl.nano.db.create(this.name) + } catch (err: any) { + // Handling race conditions + if (err.statusCode !== 412) { + throw err + } + } } return DatabaseImpl.nano.db.use(this.name) } diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts index f550932dbc..177393dee7 100644 --- a/packages/server/src/app.ts +++ b/packages/server/src/app.ts @@ -22,7 +22,6 @@ import * as redis from "./utilities/redis" import { events, logging, middleware } from "@budibase/backend-core" import { initialise as initialiseWebsockets } from "./websocket" import { startup } from "./startup" -import { retry } from "./utilities/retry" const Sentry = require("@sentry/node") const destroyable = require("server-destroy") @@ -81,11 +80,7 @@ server.on("close", async () => { }) export default server.listen(env.PORT || 0, async () => { - if (!env.isTest()) { - await startup(app, server) - } else { - await retry(async () => await startup(app, server)) - } + await startup(app, server) }) const shutdown = () => { From cbd3f2712f1ff282789e1482e492dc8ed9e4af71 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 16:26:17 +0000 Subject: [PATCH 195/386] v2.2.12-alpha.50 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index 0ffc7a583c..0360b2e821 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index f086da6165..81898f6d0b 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.49", + "@budibase/types": "2.2.12-alpha.50", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 8157a3c3b0..18092ae2a5 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.49", + "@budibase/string-templates": "2.2.12-alpha.50", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index 5f3aabdba4..27ee30f56d 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.49", - "@budibase/client": "2.2.12-alpha.49", - "@budibase/frontend-core": "2.2.12-alpha.49", - "@budibase/string-templates": "2.2.12-alpha.49", + "@budibase/bbui": "2.2.12-alpha.50", + "@budibase/client": "2.2.12-alpha.50", + "@budibase/frontend-core": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.50", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 6e82f3e3f2..19fb9e4df8 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.49", - "@budibase/string-templates": "2.2.12-alpha.49", - "@budibase/types": "2.2.12-alpha.49", + "@budibase/backend-core": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/types": "2.2.12-alpha.50", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 6c176f211a..79016b204e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.49", - "@budibase/frontend-core": "2.2.12-alpha.49", - "@budibase/string-templates": "2.2.12-alpha.49", + "@budibase/bbui": "2.2.12-alpha.50", + "@budibase/frontend-core": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.50", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 31a391ecaf..3821337599 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.49", + "@budibase/bbui": "2.2.12-alpha.50", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 470ec65c3b..5b91148966 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index 3f357a2e26..f6527669a5 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.49", - "@budibase/client": "2.2.12-alpha.49", + "@budibase/backend-core": "2.2.12-alpha.50", + "@budibase/client": "2.2.12-alpha.50", "@budibase/pro": "2.2.12-alpha.49", - "@budibase/string-templates": "2.2.12-alpha.49", - "@budibase/types": "2.2.12-alpha.49", + "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/types": "2.2.12-alpha.50", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 87c9b9b392..21ca20ad27 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index da65a48b95..d7b648264e 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 2957ebc743..086813b26a 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.49", + "version": "2.2.12-alpha.50", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.49", + "@budibase/backend-core": "2.2.12-alpha.50", "@budibase/pro": "2.2.12-alpha.49", - "@budibase/string-templates": "2.2.12-alpha.49", - "@budibase/types": "2.2.12-alpha.49", + "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/types": "2.2.12-alpha.50", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From 5685e155c635de440ba57031807071602323aa6e Mon Sep 17 00:00:00 2001 From: Jonny McCullagh Date: Tue, 31 Jan 2023 16:27:56 +0000 Subject: [PATCH 196/386] Infra/ingress secrurity group (#9374) * optional security groups to helm ingress --- charts/budibase/templates/alb-ingress.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/charts/budibase/templates/alb-ingress.yaml b/charts/budibase/templates/alb-ingress.yaml index 388bcf1d3e..9456e6b340 100644 --- a/charts/budibase/templates/alb-ingress.yaml +++ b/charts/budibase/templates/alb-ingress.yaml @@ -14,6 +14,9 @@ metadata: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' alb.ingress.kubernetes.io/certificate-arn: {{ .Values.ingress.certificateArn }} {{- end }} + {{ - if .Values.ingress.securityGroups }} + alb.ingress.kubernetes.io/security-groups: {{ .Values.ingress.securityGroups }} + {{ - end }} spec: rules: - http: From 07794efa2601da0acc5482b174a73e1ece141923 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 16:30:18 +0000 Subject: [PATCH 197/386] Update pro version to 2.2.12-alpha.50 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index f6527669a5..94b5f563cf 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.50", "@budibase/client": "2.2.12-alpha.50", - "@budibase/pro": "2.2.12-alpha.49", + "@budibase/pro": "2.2.12-alpha.50", "@budibase/string-templates": "2.2.12-alpha.50", "@budibase/types": "2.2.12-alpha.50", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index f218c89ca4..bdf6187969 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1273,13 +1273,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.49.tgz#898f8465cb834c87123d2451f1b43cdeef8c080d" - integrity sha512-TyEiCrU5zmsLLcd6OejHYNp9fYMw0MdbstCWnek2GTuBKTrnifir33EYgCMh5+z7GQ63V28XHpmY9DKMnhC7MQ== +"@budibase/backend-core@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.50.tgz#39f228904cf39de2dbb51900df4494267ac72381" + integrity sha512-ysVJ6Eul7o+LZRoilFr7bk1/gkoxSqM30yBbRhKxIhH2IOk0qd9LAaNQiTnwn4ZzU+tJWSkyAsJAQdTnX8/i9g== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.49" + "@budibase/types" "2.2.12-alpha.50" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1374,13 +1374,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.49.tgz#2b79207a19ac3364dfadaec7cf546fb0f92f0881" - integrity sha512-0m0ZcS65N2D8YBRbrSH7ajapMSNIJnqGM+tkbAg8LtNwrApt6p1S1KbCEuCSDxxy+tr6MXV+2hDLLaSa3ukgQg== +"@budibase/pro@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.50.tgz#599edc75363b323f613a0d56e5173150582b13bb" + integrity sha512-eeKY9P4Zi81AlU6vYWVcffMwkyUrNv6PcNjdKZZNBuIgNfOVejy9vmpIukx43LpHUOsk6FKxHFNVDN1txnYRkg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.49" - "@budibase/types" "2.2.12-alpha.49" + "@budibase/backend-core" "2.2.12-alpha.50" + "@budibase/types" "2.2.12-alpha.50" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1406,10 +1406,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.49.tgz#c873c3ced54d06e4bc40959a9f8112c73326175e" - integrity sha512-wiU0KtyVQ9HJiSUSdEsidq62GEf0Yn13DqXBFtB2VLKcwrcpmyQdDb3hLzFvGCmlfy2h8qkjUFVBEImlwlB9+Q== +"@budibase/types@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.50.tgz#ef07d4593c1ea0da6a6b75004d1319d7621cd910" + integrity sha512-LU+G7gQffBvnLvWfzpxUNcrCZFP/ZNQqAjB2KJxgq9pfeynU3MWAwut1tjKpp8eduuu7GnfBT1uvet9jM87FKA== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index 086813b26a..cb98ce525b 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.50", - "@budibase/pro": "2.2.12-alpha.49", + "@budibase/pro": "2.2.12-alpha.50", "@budibase/string-templates": "2.2.12-alpha.50", "@budibase/types": "2.2.12-alpha.50", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index 0b928943dc..d0a31fc49f 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -470,13 +470,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.49.tgz#898f8465cb834c87123d2451f1b43cdeef8c080d" - integrity sha512-TyEiCrU5zmsLLcd6OejHYNp9fYMw0MdbstCWnek2GTuBKTrnifir33EYgCMh5+z7GQ63V28XHpmY9DKMnhC7MQ== +"@budibase/backend-core@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.50.tgz#39f228904cf39de2dbb51900df4494267ac72381" + integrity sha512-ysVJ6Eul7o+LZRoilFr7bk1/gkoxSqM30yBbRhKxIhH2IOk0qd9LAaNQiTnwn4ZzU+tJWSkyAsJAQdTnX8/i9g== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.49" + "@budibase/types" "2.2.12-alpha.50" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -521,13 +521,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.49.tgz#2b79207a19ac3364dfadaec7cf546fb0f92f0881" - integrity sha512-0m0ZcS65N2D8YBRbrSH7ajapMSNIJnqGM+tkbAg8LtNwrApt6p1S1KbCEuCSDxxy+tr6MXV+2hDLLaSa3ukgQg== +"@budibase/pro@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.50.tgz#599edc75363b323f613a0d56e5173150582b13bb" + integrity sha512-eeKY9P4Zi81AlU6vYWVcffMwkyUrNv6PcNjdKZZNBuIgNfOVejy9vmpIukx43LpHUOsk6FKxHFNVDN1txnYRkg== dependencies: - "@budibase/backend-core" "2.2.12-alpha.49" - "@budibase/types" "2.2.12-alpha.49" + "@budibase/backend-core" "2.2.12-alpha.50" + "@budibase/types" "2.2.12-alpha.50" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -535,10 +535,10 @@ lru-cache "^7.14.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.49": - version "2.2.12-alpha.49" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.49.tgz#c873c3ced54d06e4bc40959a9f8112c73326175e" - integrity sha512-wiU0KtyVQ9HJiSUSdEsidq62GEf0Yn13DqXBFtB2VLKcwrcpmyQdDb3hLzFvGCmlfy2h8qkjUFVBEImlwlB9+Q== +"@budibase/types@2.2.12-alpha.50": + version "2.2.12-alpha.50" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.50.tgz#ef07d4593c1ea0da6a6b75004d1319d7621cd910" + integrity sha512-LU+G7gQffBvnLvWfzpxUNcrCZFP/ZNQqAjB2KJxgq9pfeynU3MWAwut1tjKpp8eduuu7GnfBT1uvet9jM87FKA== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 9e0ee974eb119e2c1179ca79b81dd314bbdf7299 Mon Sep 17 00:00:00 2001 From: Budibase Release Bot <> Date: Tue, 31 Jan 2023 16:45:32 +0000 Subject: [PATCH 198/386] v2.2.25 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index 2d18047970..5fc4d7ddb8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.24", + "version": "2.2.25", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 36d4090926..9e6345c8be 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -21,7 +21,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "^2.2.24", + "@budibase/types": "^2.2.25", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-sdk": "2.1030.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 7468e36891..627e5d57af 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.24", + "version": "2.2.25", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "^2.2.24", + "@budibase/string-templates": "^2.2.25", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", "@spectrum-css/avatar": "3.0.2", diff --git a/packages/builder/package.json b/packages/builder/package.json index 75f1615f95..ed2f49d133 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.24", + "version": "2.2.25", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "^2.2.24", - "@budibase/client": "^2.2.24", - "@budibase/frontend-core": "^2.2.24", - "@budibase/string-templates": "^2.2.24", + "@budibase/bbui": "^2.2.25", + "@budibase/client": "^2.2.25", + "@budibase/frontend-core": "^2.2.25", + "@budibase/string-templates": "^2.2.25", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 3f3ed6c3e5..3f0edd287c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "^2.2.24", - "@budibase/string-templates": "^2.2.24", - "@budibase/types": "^2.2.24", + "@budibase/backend-core": "^2.2.25", + "@budibase/string-templates": "^2.2.25", + "@budibase/types": "^2.2.25", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 4c689b7d7c..9215a03fbc 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.24", + "version": "2.2.25", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^2.2.24", - "@budibase/frontend-core": "^2.2.24", - "@budibase/string-templates": "^2.2.24", + "@budibase/bbui": "^2.2.25", + "@budibase/frontend-core": "^2.2.25", + "@budibase/string-templates": "^2.2.25", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index fbba3bbcec..0ec6276378 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "^2.2.24", + "@budibase/bbui": "^2.2.25", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 7eed598d56..7dd1176af8 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index cabcc9364a..a96a33a5b8 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "^2.2.24", - "@budibase/client": "^2.2.24", + "@budibase/backend-core": "^2.2.25", + "@budibase/client": "^2.2.25", "@budibase/pro": "2.2.24", - "@budibase/string-templates": "^2.2.24", - "@budibase/types": "^2.2.24", + "@budibase/string-templates": "^2.2.25", + "@budibase/types": "^2.2.25", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 779217b34d..272f2a562e 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.24", + "version": "2.2.25", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index f9e8e6e65f..4513567eff 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 1d6133a953..ad5e9dc17d 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.24", + "version": "2.2.25", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "^2.2.24", + "@budibase/backend-core": "^2.2.25", "@budibase/pro": "2.2.24", - "@budibase/string-templates": "^2.2.24", - "@budibase/types": "^2.2.24", + "@budibase/string-templates": "^2.2.25", + "@budibase/types": "^2.2.25", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From bf5da62f75c510d26e1f6df09b7daa31f45ebaf8 Mon Sep 17 00:00:00 2001 From: Mitch-Budibase Date: Tue, 31 Jan 2023 16:48:27 +0000 Subject: [PATCH 199/386] Removing Cypress We no longer need Cypress. I am removing the Cypress directory. Also updated package.json to remove the cypress related lines --- package.json | 6 +- packages/builder/cypress.json | 15 - packages/builder/cypress/fixtures/apikey.json | 3 - .../builder/cypress/fixtures/example.json | 5 - .../builder/cypress/fixtures/exported-app.txt | 3 - .../builder/cypress/fixtures/profile.json | 5 - packages/builder/cypress/fixtures/users.json | 232 ----- .../addMultiOptionDatatype.spec.js | 45 - .../integration/addRadioButtons.spec.js | 43 - .../adminAndManagement/accountPortals.spec.js | 116 --- .../adminAndManagement/authentication.spec.js | 178 ---- .../adminAndManagement/userManagement.spec.js | 238 ----- .../adminAndManagement/userSettings.spec.js | 114 --- .../cypress/integration/appOverview.spec.js | 442 -------- .../integration/appPublishWorkflow.spec.js | 108 -- .../cypress/integration/autoScreensUI.spec.js | 101 -- .../cypress/integration/createApp.spec.js | 235 ----- .../integration/createAutomation.spec.js | 64 -- .../cypress/integration/createBinding.spec.js | 66 -- .../integration/createComponents.spec.js | 275 ----- .../cypress/integration/createScreen.spec.js | 54 - .../cypress/integration/createTable.spec.js | 112 --- .../cypress/integration/createView.spec.js | 161 --- .../customThemingProperties.spec.js | 86 -- .../datasources/datasourceWizard.spec.js | 42 - .../integration/datasources/mySql.spec.js | 229 ----- .../integration/datasources/oracle.spec.js | 229 ----- .../datasources/postgreSql.spec.js | 283 ------ .../integration/datasources/rest.spec.js | 45 - .../queryLevelTransformers.spec.js | 147 --- .../integration/renameAnApplication.spec.js | 112 --- .../cypress/integration/revertApp.spec.js | 75 -- packages/builder/cypress/plugins/index.js | 23 - packages/builder/cypress/setup.js | 45 - packages/builder/cypress/support/commands.js | 945 ------------------ packages/builder/cypress/support/cookies.js | 3 - .../builder/cypress/support/filterTests.js | 16 - packages/builder/cypress/support/index.js | 22 - packages/builder/cypress/support/interact.js | 136 --- .../support/queryLevelTransformerFunction.js | 14 - .../queryLevelTransformerFunctionWithData.js | 31 - packages/builder/cypress/ts/setup.ts | 4 - 42 files changed, 1 insertion(+), 5107 deletions(-) delete mode 100644 packages/builder/cypress.json delete mode 100644 packages/builder/cypress/fixtures/apikey.json delete mode 100644 packages/builder/cypress/fixtures/example.json delete mode 100644 packages/builder/cypress/fixtures/exported-app.txt delete mode 100644 packages/builder/cypress/fixtures/profile.json delete mode 100644 packages/builder/cypress/fixtures/users.json delete mode 100644 packages/builder/cypress/integration/addMultiOptionDatatype.spec.js delete mode 100644 packages/builder/cypress/integration/addRadioButtons.spec.js delete mode 100644 packages/builder/cypress/integration/adminAndManagement/accountPortals.spec.js delete mode 100644 packages/builder/cypress/integration/adminAndManagement/authentication.spec.js delete mode 100644 packages/builder/cypress/integration/adminAndManagement/userManagement.spec.js delete mode 100644 packages/builder/cypress/integration/adminAndManagement/userSettings.spec.js delete mode 100644 packages/builder/cypress/integration/appOverview.spec.js delete mode 100644 packages/builder/cypress/integration/appPublishWorkflow.spec.js delete mode 100644 packages/builder/cypress/integration/autoScreensUI.spec.js delete mode 100644 packages/builder/cypress/integration/createApp.spec.js delete mode 100644 packages/builder/cypress/integration/createAutomation.spec.js delete mode 100644 packages/builder/cypress/integration/createBinding.spec.js delete mode 100644 packages/builder/cypress/integration/createComponents.spec.js delete mode 100644 packages/builder/cypress/integration/createScreen.spec.js delete mode 100644 packages/builder/cypress/integration/createTable.spec.js delete mode 100644 packages/builder/cypress/integration/createView.spec.js delete mode 100644 packages/builder/cypress/integration/customThemingProperties.spec.js delete mode 100644 packages/builder/cypress/integration/datasources/datasourceWizard.spec.js delete mode 100644 packages/builder/cypress/integration/datasources/mySql.spec.js delete mode 100644 packages/builder/cypress/integration/datasources/oracle.spec.js delete mode 100644 packages/builder/cypress/integration/datasources/postgreSql.spec.js delete mode 100644 packages/builder/cypress/integration/datasources/rest.spec.js delete mode 100644 packages/builder/cypress/integration/queryLevelTransformers.spec.js delete mode 100644 packages/builder/cypress/integration/renameAnApplication.spec.js delete mode 100644 packages/builder/cypress/integration/revertApp.spec.js delete mode 100644 packages/builder/cypress/plugins/index.js delete mode 100644 packages/builder/cypress/setup.js delete mode 100644 packages/builder/cypress/support/commands.js delete mode 100644 packages/builder/cypress/support/cookies.js delete mode 100644 packages/builder/cypress/support/filterTests.js delete mode 100644 packages/builder/cypress/support/index.js delete mode 100644 packages/builder/cypress/support/interact.js delete mode 100644 packages/builder/cypress/support/queryLevelTransformerFunction.js delete mode 100644 packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js delete mode 100644 packages/builder/cypress/ts/setup.ts diff --git a/package.json b/package.json index 7da8db506d..6290930269 100644 --- a/package.json +++ b/package.json @@ -51,10 +51,6 @@ "lint:fix:eslint": "eslint --fix packages qa-core", "lint:fix:prettier": "prettier --write \"packages/**/*.{js,ts,svelte}\" && prettier --write \"examples/**/*.{js,ts,svelte}\" && prettier --write \"qa-core/**/*.{js,ts,svelte}\"", "lint:fix": "yarn run lint:fix:prettier && yarn run lint:fix:eslint", - "test:e2e": "lerna run cy:test --stream", - "test:e2e:ci": "lerna run cy:ci --stream", - "test:e2e:ci:record": "lerna run cy:ci:record --stream", - "test:e2e:ci:notify": "lerna run cy:ci:notify", "build:specs": "lerna run specs", "build:docker": "lerna run build:docker && npm run build:docker:proxy && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh $BUDIBASE_RELEASE_VERSION && cd -", "build:docker:pre": "lerna run build && lerna run predocker", @@ -84,4 +80,4 @@ "install:pro": "bash scripts/pro/install.sh", "dep:clean": "yarn clean && yarn bootstrap" } -} +} \ No newline at end of file diff --git a/packages/builder/cypress.json b/packages/builder/cypress.json deleted file mode 100644 index b779794543..0000000000 --- a/packages/builder/cypress.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "baseUrl": "http://localhost:4100", - "video": true, - "projectId": "bmbemn", - "reporter": "cypress-multi-reporters", - "reporterOptions": { - "configFile": "reporterConfig.json" - }, - "env": { - "PORT": "4100", - "WORKER_PORT": "4200", - "JWT_SECRET": "test", - "HOST_IP": "" - } -} \ No newline at end of file diff --git a/packages/builder/cypress/fixtures/apikey.json b/packages/builder/cypress/fixtures/apikey.json deleted file mode 100644 index 1def14ed6c..0000000000 --- a/packages/builder/cypress/fixtures/apikey.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "budibase": "CB373643-3FC4-4902-9E31-449C0ED066B6" -} \ No newline at end of file diff --git a/packages/builder/cypress/fixtures/example.json b/packages/builder/cypress/fixtures/example.json deleted file mode 100644 index da18d9352a..0000000000 --- a/packages/builder/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} \ No newline at end of file diff --git a/packages/builder/cypress/fixtures/exported-app.txt b/packages/builder/cypress/fixtures/exported-app.txt deleted file mode 100644 index 28aeaf958a..0000000000 --- a/packages/builder/cypress/fixtures/exported-app.txt +++ /dev/null @@ -1,3 +0,0 @@ -{"version":"1.2.9","db_type":"http","start_time":"2022-05-12T13:47:50.453Z","db_info":{"db_name":"app_dev_7cae7fa4db8745da848f91430a8211bf","purge_seq":"0-g1AAAABXeJzLYWBgYMpgTmEQTM4vTc5ISXIwNDLXMwBCwxyQVB4LkGRoAFL_gSArkQGP2kSGpHqIoiwAtOgYRA","update_seq":"11-g1AAAACbeJzLYWBgYMpgTmEQTM4vTc5ISXIwNDLXMwBCwxyQVB4LkGRoAFL_gSArgzmRPRcowJ5klmZgaZmKTR8e0xIZkuqhxrBAjEk0NzcwMsSmIQsA89QoWg","sizes":{"file":94626,"external":5665,"active":7627},"props":{},"doc_del_count":0,"doc_count":7,"disk_format_version":8,"compact_running":false,"cluster":{"q":2,"n":1,"w":1,"r":1},"instance_start_time":"0","host":"http://localhost:4005/app_dev_7cae7fa4db8745da848f91430a8211bf/","auto_compaction":false,"adapter":"http"}} -{"docs":[{"_id":"_design/database","_rev":"4-ad6d41ef604ab34da380438c1be89521","views":{"by_link":{"map":"function (doc) {\n // everything in this must remain constant as its going to Pouch, no external variables\n if (doc.type === \"link\") {\n let doc1 = doc.doc1;\n let doc2 = doc.doc2;\n // eslint-disable-next-line no-undef\n emit([doc1.tableId, doc1.rowId], {\n id: doc2.rowId,\n thisId: doc1.rowId,\n fieldName: doc1.fieldName,\n });\n // if linking to same table can't emit twice\n if (doc1.tableId !== doc2.tableId) {\n // eslint-disable-next-line no-undef\n emit([doc2.tableId, doc2.rowId], {\n id: doc1.rowId,\n thisId: doc2.rowId,\n fieldName: doc2.fieldName,\n });\n }\n }\n }"},"screen_routes":{"map":"function(doc) {\n if (doc._id.startsWith(\"screen_\")) {\n emit(doc._id, {\n id: doc._id,\n routing: doc.routing,\n })\n }\n }"}},"indexes":{"rows":{"index":"function (doc) {\n function idx(input, prev) {\n for (let key of Object.keys(input)) {\n let idxKey = prev != null ? `${prev}.${key}` : key;\n idxKey = idxKey.replace(/ /g, \"_\");\n if (Array.isArray(input[key])) {\n for (let val of input[key]) {\n if (typeof val !== \"object\") {\n // eslint-disable-next-line no-undef\n index(idxKey, val, { store: true });\n }\n }\n }\n else if (key === \"_id\" || key === \"_rev\" || input[key] == null) {\n continue;\n }\n if (typeof input[key] === \"string\") {\n // eslint-disable-next-line no-undef\n index(idxKey, input[key].toLowerCase(), { store: true });\n }\n else if (typeof input[key] !== \"object\") {\n // eslint-disable-next-line no-undef\n index(idxKey, input[key], { store: true });\n }\n else {\n idx(input[key], idxKey);\n }\n }\n }\n if (doc._id.startsWith(\"ro_\")) {\n // eslint-disable-next-line no-undef\n index(\"default\", doc._id);\n idx(doc);\n }\n }","analyzer":"keyword"}},"_revisions":{"start":4,"ids":["ad6d41ef604ab34da380438c1be89521","cb47f4fd824d5e096ac8b76117e6f93d","68a9a1d1b01b327676ecbaa4b1e5b8a7","0b24e44a44af45e51e562fd124ce3007"]}},{"_id":"app_metadata","_rev":"2-a4fe55378bfec0fc71e58a1364ac9965","appId":"app_dev_7cae7fa4db8745da848f91430a8211bf","type":"app","version":"1.0.155-alpha.0","componentLibraries":["@budibase/standard-components"],"name":"My app","url":"/my-app","instance":{"_id":"app_dev_7cae7fa4db8745da848f91430a8211bf"},"tenantId":"default","updatedAt":"2022-05-12T13:47:28.756Z","createdAt":"2022-05-12T13:47:26.825Z","status":"development","_revisions":{"start":2,"ids":["a4fe55378bfec0fc71e58a1364ac9965","f0d06bdb6e6ae4781eb5c4aa224002ff"]}},{"_id":"layout_private_master","_rev":"1-c02411b58d697e38763889a375d52159","componentLibraries":["@budibase/standard-components"],"title":"My app","favicon":"./_shared/favicon.png","stylesheets":[],"name":"Navigation Layout","props":{"_id":"4f569166-a4f3-47ea-a09e-6d218c75586f","_instanceName":"Navigation Layout","_component":"@budibase/standard-components/layout","_children":[{"_id":"7fcf11e4-6f5b-4085-8e0d-9f3d44c98967","_component":"@budibase/standard-components/screenslot","_instanceName":"Screen slot","_styles":{"normal":{"flex":"1 1 auto","display":"flex","flex-direction":"column","justify-content":"flex-start","align-items":"stretch"},"hover":{},"active":{},"selected":{}},"_children":[]}],"_styles":{"active":{},"hover":{},"normal":{},"selected":{}},"title":"My app","navigation":"Top","width":"Large","links":[{"text":"Home","url":"/"}]}},{"_id":"layout_public_master","_rev":"1-d6bce47046d4d0de4f19a6ff95064109","componentLibraries":["@budibase/standard-components"],"title":"My app","favicon":"./_shared/favicon.png","stylesheets":[],"name":"Empty Layout","props":{"_id":"3723ffa1-f9e0-4c05-8013-98195c788ed6","_instanceName":"Empty Layout","_component":"@budibase/standard-components/layout","_children":[{"_id":"7fcf11e4-6f5b-4085-8e0d-9f3d44c98967","_component":"@budibase/standard-components/screenslot","_instanceName":"Screen slot","_styles":{"normal":{"flex":"1 1 auto","display":"flex","flex-direction":"column","justify-content":"flex-start","align-items":"stretch"},"hover":{},"active":{},"selected":{}},"_children":[]}],"_styles":{"active":{},"hover":{},"normal":{},"selected":{}},"navigation":"None","width":"Large","links":[{"text":"Home","url":"/"}]}},{"_id":"screen_b19c454fa5ae41ab874a8860623ab37c","_rev":"1-02dddd460ad14de50dc885aa362452c6","layoutId":"layout_private_master","props":{"_id":"c87457efbc05a43f39064d9dacc9d4b67","_component":"@budibase/standard-components/container","_styles":{"normal":{},"hover":{},"active":{},"selected":{}},"_children":[],"_instanceName":"New Screen","direction":"column","hAlign":"stretch","vAlign":"top","size":"grow","gap":"M"},"routing":{"route":"/home","roleId":"BASIC","roldId":"BASIC"},"name":"screen-id"},{"_id":"ta_users","_rev":"1-30a4344f056c24cf776d5736eb3c7ed5","type":"table","views":{},"name":"Users","schema":{"email":{"type":"string","constraints":{"type":"string","email":true,"length":{"maximum":""},"presence":true},"fieldName":"email","name":"email"},"firstName":{"name":"firstName","fieldName":"firstName","type":"string","constraints":{"type":"string","presence":false}},"lastName":{"name":"lastName","fieldName":"lastName","type":"string","constraints":{"type":"string","presence":false}},"roleId":{"fieldName":"roleId","name":"roleId","type":"options","constraints":{"type":"string","presence":false,"inclusion":["ADMIN","POWER","BASIC","PUBLIC"]}},"status":{"fieldName":"status","name":"status","type":"options","constraints":{"type":"string","presence":false,"inclusion":["active","inactive"]}}},"primaryDisplay":"email"}]} -{"seq":"11-g1AAAACbeJzLYWBgYMpgTmEQTM4vTc5ISXIwNDLXMwBCwxyQVCJDUv3___-zMpgTWXKBAuxJiebmBkaG2DTgMSaPBUgyNACp_1DT2CGmmaUZWFqmYtOXBQAWQiha"} diff --git a/packages/builder/cypress/fixtures/profile.json b/packages/builder/cypress/fixtures/profile.json deleted file mode 100644 index b6c355ca5c..0000000000 --- a/packages/builder/cypress/fixtures/profile.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": 8739, - "name": "Jane", - "email": "jane@example.com" -} \ No newline at end of file diff --git a/packages/builder/cypress/fixtures/users.json b/packages/builder/cypress/fixtures/users.json deleted file mode 100644 index f82fc8dfb2..0000000000 --- a/packages/builder/cypress/fixtures/users.json +++ /dev/null @@ -1,232 +0,0 @@ -[ - { - "id": 1, - "name": "Leanne Graham", - "username": "Bret", - "email": "Sincere@april.biz", - "address": { - "street": "Kulas Light", - "suite": "Apt. 556", - "city": "Gwenborough", - "zipcode": "92998-3874", - "geo": { - "lat": "-37.3159", - "lng": "81.1496" - } - }, - "phone": "1-770-736-8031 x56442", - "website": "hildegard.org", - "company": { - "name": "Romaguera-Crona", - "catchPhrase": "Multi-layered client-server neural-net", - "bs": "harness real-time e-markets" - } - }, - { - "id": 2, - "name": "Ervin Howell", - "username": "Antonette", - "email": "Shanna@melissa.tv", - "address": { - "street": "Victor Plains", - "suite": "Suite 879", - "city": "Wisokyburgh", - "zipcode": "90566-7771", - "geo": { - "lat": "-43.9509", - "lng": "-34.4618" - } - }, - "phone": "010-692-6593 x09125", - "website": "anastasia.net", - "company": { - "name": "Deckow-Crist", - "catchPhrase": "Proactive didactic contingency", - "bs": "synergize scalable supply-chains" - } - }, - { - "id": 3, - "name": "Clementine Bauch", - "username": "Samantha", - "email": "Nathan@yesenia.net", - "address": { - "street": "Douglas Extension", - "suite": "Suite 847", - "city": "McKenziehaven", - "zipcode": "59590-4157", - "geo": { - "lat": "-68.6102", - "lng": "-47.0653" - } - }, - "phone": "1-463-123-4447", - "website": "ramiro.info", - "company": { - "name": "Romaguera-Jacobson", - "catchPhrase": "Face to face bifurcated interface", - "bs": "e-enable strategic applications" - } - }, - { - "id": 4, - "name": "Patricia Lebsack", - "username": "Karianne", - "email": "Julianne.OConner@kory.org", - "address": { - "street": "Hoeger Mall", - "suite": "Apt. 692", - "city": "South Elvis", - "zipcode": "53919-4257", - "geo": { - "lat": "29.4572", - "lng": "-164.2990" - } - }, - "phone": "493-170-9623 x156", - "website": "kale.biz", - "company": { - "name": "Robel-Corkery", - "catchPhrase": "Multi-tiered zero tolerance productivity", - "bs": "transition cutting-edge web services" - } - }, - { - "id": 5, - "name": "Chelsey Dietrich", - "username": "Kamren", - "email": "Lucio_Hettinger@annie.ca", - "address": { - "street": "Skiles Walks", - "suite": "Suite 351", - "city": "Roscoeview", - "zipcode": "33263", - "geo": { - "lat": "-31.8129", - "lng": "62.5342" - } - }, - "phone": "(254)954-1289", - "website": "demarco.info", - "company": { - "name": "Keebler LLC", - "catchPhrase": "User-centric fault-tolerant solution", - "bs": "revolutionize end-to-end systems" - } - }, - { - "id": 6, - "name": "Mrs. Dennis Schulist", - "username": "Leopoldo_Corkery", - "email": "Karley_Dach@jasper.info", - "address": { - "street": "Norberto Crossing", - "suite": "Apt. 950", - "city": "South Christy", - "zipcode": "23505-1337", - "geo": { - "lat": "-71.4197", - "lng": "71.7478" - } - }, - "phone": "1-477-935-8478 x6430", - "website": "ola.org", - "company": { - "name": "Considine-Lockman", - "catchPhrase": "Synchronised bottom-line interface", - "bs": "e-enable innovative applications" - } - }, - { - "id": 7, - "name": "Kurtis Weissnat", - "username": "Elwyn.Skiles", - "email": "Telly.Hoeger@billy.biz", - "address": { - "street": "Rex Trail", - "suite": "Suite 280", - "city": "Howemouth", - "zipcode": "58804-1099", - "geo": { - "lat": "24.8918", - "lng": "21.8984" - } - }, - "phone": "210.067.6132", - "website": "elvis.io", - "company": { - "name": "Johns Group", - "catchPhrase": "Configurable multimedia task-force", - "bs": "generate enterprise e-tailers" - } - }, - { - "id": 8, - "name": "Nicholas Runolfsdottir V", - "username": "Maxime_Nienow", - "email": "Sherwood@rosamond.me", - "address": { - "street": "Ellsworth Summit", - "suite": "Suite 729", - "city": "Aliyaview", - "zipcode": "45169", - "geo": { - "lat": "-14.3990", - "lng": "-120.7677" - } - }, - "phone": "586.493.6943 x140", - "website": "jacynthe.com", - "company": { - "name": "Abernathy Group", - "catchPhrase": "Implemented secondary concept", - "bs": "e-enable extensible e-tailers" - } - }, - { - "id": 9, - "name": "Glenna Reichert", - "username": "Delphine", - "email": "Chaim_McDermott@dana.io", - "address": { - "street": "Dayna Park", - "suite": "Suite 449", - "city": "Bartholomebury", - "zipcode": "76495-3109", - "geo": { - "lat": "24.6463", - "lng": "-168.8889" - } - }, - "phone": "(775)976-6794 x41206", - "website": "conrad.com", - "company": { - "name": "Yost and Sons", - "catchPhrase": "Switchable contextually-based project", - "bs": "aggregate real-time technologies" - } - }, - { - "id": 10, - "name": "Clementina DuBuque", - "username": "Moriah.Stanton", - "email": "Rey.Padberg@karina.biz", - "address": { - "street": "Kattie Turnpike", - "suite": "Suite 198", - "city": "Lebsackbury", - "zipcode": "31428-2261", - "geo": { - "lat": "-38.2386", - "lng": "57.2232" - } - }, - "phone": "024-648-3804", - "website": "ambrose.net", - "company": { - "name": "Hoeger LLC", - "catchPhrase": "Centralized empowering task-force", - "bs": "target end-to-end tables" - } - } -] \ No newline at end of file diff --git a/packages/builder/cypress/integration/addMultiOptionDatatype.spec.js b/packages/builder/cypress/integration/addMultiOptionDatatype.spec.js deleted file mode 100644 index f844402958..0000000000 --- a/packages/builder/cypress/integration/addMultiOptionDatatype.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['all'], () => { - xcontext("Add Multi-Option Datatype", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should create a new table, with data", () => { - cy.createTable("Multi Data") - cy.addColumn("Multi Data", "Test Data", "Multi-select", "1\n2\n3\n4\n5") - cy.addRowMultiValue(["1", "2", "3", "4", "5"]) - }) - - it("should add form with multi select picker, containing 5 options", () => { - cy.navigateToFrontend() - // Add data provider - cy.searchAndAddComponent("Data Provider") - cy.get(interact.DATASOURCE_PROP_CONTROL).click() - cy.get(interact.DROPDOWN).contains("Multi Data").click() - // Add Form with schema to match table - cy.searchAndAddComponent("Form") - cy.get(interact.DATASOURCE_PROP_CONTROL).click() - cy.get(interact.DROPDOWN).contains("Multi Data").click() - // Add multi-select picker to form - cy.searchAndAddComponent("Multi-select Picker").then(componentId => { - cy.get(interact.DATASOURCE_FIELD_CONTROL).type("Test Data").type("{enter}") - cy.wait(1000) - cy.getComponent(componentId).contains("Choose some options").click() - // Check picker has 5 items - cy.getComponent(componentId).find("li").should("have.length", 5) - // Select all items - for (let i = 1; i < 6; i++) { - cy.getComponent(componentId).find("li").contains(i).click() - } - // Check items have been selected - cy.getComponent(componentId) - .find(interact.SPECTRUM_PICKER_LABEL) - .contains("(5)") - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/addRadioButtons.spec.js b/packages/builder/cypress/integration/addRadioButtons.spec.js deleted file mode 100644 index 3e344c3656..0000000000 --- a/packages/builder/cypress/integration/addRadioButtons.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['all'], () => { - xcontext("Add Radio Buttons", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should add Radio Buttons options picker on form, add data, and confirm", () => { - cy.navigateToFrontend() - cy.searchAndAddComponent("Form") - cy.searchAndAddComponent("Options Picker").then((componentId) => { - // Provide field setting - cy.get(interact.DATASOURCE_FIELD_CONTROL).type("1") - // Open dropdown and select Radio buttons - cy.get(interact.OPTION_TYPE_PROP_CONTROL).click().then(() => { - cy.get(interact.SPECTRUM_POPOVER).contains('Radio buttons') - .click() - }) - const radioButtonsTotal = 3 - // Add values and confirm total - addRadioButtonData(radioButtonsTotal) - cy.getComponent(componentId).find('[type="radio"]') - .should('have.length', radioButtonsTotal) - }) - }) - - const addRadioButtonData = (totalRadioButtons) => { - cy.get(interact.OPTION_SOURCE_PROP_CONROL).click().then(() => { - cy.get(interact.SPECTRUM_POPOVER).contains('Custom') - .click() - .wait(1000) - }) - cy.addCustomSourceOptions(totalRadioButtons) - } - - after(() => { - cy.deleteAllApps() - }) - }) -}) diff --git a/packages/builder/cypress/integration/adminAndManagement/accountPortals.spec.js b/packages/builder/cypress/integration/adminAndManagement/accountPortals.spec.js deleted file mode 100644 index d9eb5a9f25..0000000000 --- a/packages/builder/cypress/integration/adminAndManagement/accountPortals.spec.js +++ /dev/null @@ -1,116 +0,0 @@ -import filterTests from "../../support/filterTests" -const interact = require('../../support/interact') - -filterTests(["smoke", "all"], () => { - xcontext("Account Portals", () => { - - const bbUserEmail = "bbuser@test.com" - - before(() => { - cy.login() - cy.deleteApp("Cypress Tests") - cy.createApp("Cypress Tests", false) - - // Create new user - cy.wait(500) - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.createUser(bbUserEmail) - cy.contains("bbuser").click() - cy.wait(500) - - // Reset password - cy.get(".title").within(() => { - cy.get(interact.SPECTRUM_ICON).click({ force: true }) - }) - cy.get(interact.SPECTRUM_MENU).within(() => { - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Force password reset").click({ force: true }) - }) - - cy.get(interact.SPECTRUM_DIALOG_GRID) - .find(interact.SPECTRUM_TEXTFIELD_INPUT).invoke('val').as('pwd') - - cy.get(interact.SPECTRUM_BUTTON).contains("Reset password").click({ force: true }) - - // Login as new user and set password - cy.logOut() - cy.get('@pwd').then((pwd) => { - cy.login(bbUserEmail, pwd) - }) - - for (let i = 0; i < 2; i++) { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).eq(i).type("test") - } - cy.get(interact.SPECTRUM_BUTTON).contains("Reset your password").click({ force: true }) - //cy.logoutNoAppGrid() - }) - - xit("should verify Standard Portal", () => { - // Development access should be disabled (Admin access is already disabled) - cy.login() - cy.setUserRole("bbuser", "App User") - bbUserLogin() - - // Verify Standard Portal - cy.get(interact.SPECTRUM_SIDENAV).should('not.exist') // No config sections - cy.get(interact.CREATE_APP_BUTTON).should('not.exist') // No create app button - cy.get(".app").should('not.exist') // No apps -> no roles assigned to user - cy.get(interact.CONTAINER).should('contain', bbUserEmail) // Message containing users email - - cy.logoutNoAppGrid() - }) - - xit("should verify Admin Portal", () => { - cy.login() - // Configure user role - cy.setUserRole("bbuser", "Admin") - bbUserLogin() - - // Verify available options for Admin portal - cy.get(interact.SPECTRUM_SIDENAV) - .should('contain', 'Apps') - //.and('contain', 'Usage') - .and('contain', 'Users') - .and('contain', 'Auth') - .and('contain', 'Email') - .and('contain', 'Organisation') - .and('contain', 'Theming') - .and('contain', 'Update') - //.and('contain', 'Upgrade') - - cy.logOut() - }) - - xit("should verify Development Portal", () => { - // Only Development access should be enabled - cy.login() - cy.setUserRole("bbuser", "Developer") - bbUserLogin() - - // Verify available options for Admin portal - cy.get(interact.SPECTRUM_SIDENAV) - .should('contain', 'Apps') - //.and('contain', 'Usage') - .and('not.contain', 'Users') - .and('not.contain', 'Auth') - .and('not.contain', 'Email') - .and('not.contain', 'Organisation') - .and('contain', 'Theming') - .and('not.contain', 'Update') - .and('not.contain', 'Upgrade') - - cy.logOut() - }) - - const bbUserLogin = () => { - // Login as bbuser - cy.logOut() - cy.login(bbUserEmail, "test") - } - - after(() => { - cy.login() - // Delete BB user - cy.deleteUser(bbUserEmail) - }) - }) -}) diff --git a/packages/builder/cypress/integration/adminAndManagement/authentication.spec.js b/packages/builder/cypress/integration/adminAndManagement/authentication.spec.js deleted file mode 100644 index 140dfb9ff8..0000000000 --- a/packages/builder/cypress/integration/adminAndManagement/authentication.spec.js +++ /dev/null @@ -1,178 +0,0 @@ -import filterTests from "../../support/filterTests" -// const interact = require("../support/interact") - -filterTests(["smoke", "all"], () => { - xcontext("Auth Configuration", () => { - before(() => { - cy.login() - }) - - after(() => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/manage/auth") - }) - - cy.get("[data-cy=new-scope-input]").clear() - - cy.get("div.content").scrollTo("bottom") - cy.get("[data-cy=oidc-active]").click() - - cy.get("[data-cy=oidc-active]").should('not.be.checked') - - cy.intercept("POST", "/api/global/configs").as("updateAuth") - cy.get("button[data-cy=oidc-save]").contains("Save").click({ force: true }) - cy.wait("@updateAuth") - cy.get("@updateAuth").its("response.statusCode").should("eq", 200) - - cy.get(".spectrum-Toast-content") - .contains("Settings saved") - .should("be.visible") - }) - - it("Should allow updating of the OIDC config", () => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/manage/auth") - }) - cy.get("div.content").scrollTo("bottom") - cy.get(".spectrum-Toast .spectrum-ClearButton").click() - - cy.get("input[data-cy=configUrl]").type("http://budi-auth.com/v2") - cy.get("input[data-cy=clientID]").type("34ac6a13-f24a-4b52-c70d-fa544ffd11b2") - cy.get("input[data-cy=clientSecret]").type("12A8Q~4nS_DWhOOJ2vWIRsNyDVsdtXPD.Zxa9df_") - - cy.get("button[data-cy=oidc-save]").should("not.be.disabled"); - - cy.intercept("POST", "/api/global/configs").as("updateAuth") - cy.get("button[data-cy=oidc-save]").contains("Save").click({ force: true }) - cy.wait("@updateAuth") - cy.get("@updateAuth").its("response.statusCode").should("eq", 200) - - cy.get(".spectrum-Toast-content") - .contains("Settings saved") - .should("be.visible") - }) - - it("Should display default scopes in advanced config.", () => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/manage/auth") - }) - cy.get("div.content").scrollTo("bottom") - - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get(".spectrum-Tags-item").contains("openid") - cy.get(".spectrum-Tags-item").contains("openid").find(".spectrum-ClearButton").should("not.exist") - - cy.get(".spectrum-Tags-item").contains("offline_access") - cy.get(".spectrum-Tags-item").contains("email") - cy.get(".spectrum-Tags-item").contains("profile") - }) - - it("Add a new scopes", () => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/manage/auth") - }) - cy.get("div.content").scrollTo("bottom") - - cy.get("[data-cy=new-scope-input]").type("Sample{enter}") - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 5) - cy.get(".spectrum-Tags-item").contains("Sample") - - cy.get(".auth-form input.spectrum-Textfield-input").type("Another ") - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 6) - cy.get(".spectrum-Tags-item").contains("Another") - - cy.get("button[data-cy=oidc-save]").should("not.be.disabled"); - - cy.intercept("POST", "/api/global/configs").as("updateAuth") - cy.get("button[data-cy=oidc-save]").contains("Save").click({ force: true }) - cy.wait("@updateAuth") - cy.get("@updateAuth").its("response.statusCode").should("eq", 200) - - cy.reload() - - cy.get("div.content").scrollTo("bottom") - - cy.get(".spectrum-Tags-item").contains("openid") - cy.get(".spectrum-Tags-item").contains("offline_access") - cy.get(".spectrum-Tags-item").contains("email") - cy.get(".spectrum-Tags-item").contains("profile") - cy.get(".spectrum-Tags-item").contains("Sample") - cy.get(".spectrum-Tags-item").contains("Another") - }) - - it("Should allow the removal of auth scopes", () => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/manage/auth") - }) - cy.get("div.content").scrollTo("bottom") - - cy.get(".spectrum-Tags-item").contains("offline_access").parent().find(".spectrum-ClearButton").click() - cy.get(".spectrum-Tags-item").contains("profile").parent().find(".spectrum-ClearButton").click() - - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get(".spectrum-Tags-item").contains("offline_access").should("not.exist") - cy.get(".spectrum-Tags-item").contains("profile").should("not.exist") - - cy.get("button[data-cy=oidc-save]").should("not.be.disabled"); - - cy.intercept("POST", "/api/global/configs").as("updateAuth") - cy.get("button[data-cy=oidc-save]").contains("Save").click({ force: true }) - cy.wait("@updateAuth") - cy.get("@updateAuth").its("response.statusCode").should("eq", 200) - - cy.get(".spectrum-Toast-content") - .contains("Settings saved") - .should("be.visible") - - cy.reload() - - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get(".spectrum-Tags-item").contains("offline_access").should("not.exist") - cy.get(".spectrum-Tags-item").contains("profile").should("not.exist") - }) - - it("Should allow auth scopes to be reset to the core defaults.", () => { - cy.get(".spectrum-SideNav li").contains("Auth").click() - - cy.get("div.content").scrollTo("bottom") - - cy.get("[data-cy=restore-oidc-default-scopes]").click({ force: true }) - - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get(".spectrum-Tags-item").contains("openid") - cy.get(".spectrum-Tags-item").contains("offline_access") - cy.get(".spectrum-Tags-item").contains("email") - cy.get(".spectrum-Tags-item").contains("profile") - }) - - it("Should not allow invalid characters in the auth scopes", () => { - cy.get("[data-cy=new-scope-input]").type("thisIsInvalid\\{enter}") - cy.get(".spectrum-Form-itemField .error").contains("Auth scopes cannot contain spaces, double quotes or backslashes") - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get("[data-cy=new-scope-input]").clear() - - cy.get("[data-cy=new-scope-input]").type("alsoInvalid\"{enter}") - cy.get(".spectrum-Form-itemField .error").contains("Auth scopes cannot contain spaces, double quotes or backslashes") - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - - cy.get("[data-cy=new-scope-input]").clear() - }) - - it("Should not allow duplicate auth scopes", () => { - cy.get("[data-cy=new-scope-input]").type("offline_access{enter}") - cy.get(".spectrum-Form-itemField .error").contains("Auth scope already exists") - cy.get(".spectrum-Tags").find(".spectrum-Tags-item").its("length").should("eq", 4) - }) - - }) -}) \ No newline at end of file diff --git a/packages/builder/cypress/integration/adminAndManagement/userManagement.spec.js b/packages/builder/cypress/integration/adminAndManagement/userManagement.spec.js deleted file mode 100644 index 3d3f5d3956..0000000000 --- a/packages/builder/cypress/integration/adminAndManagement/userManagement.spec.js +++ /dev/null @@ -1,238 +0,0 @@ -import filterTests from "../../support/filterTests" -const interact = require('../../support/interact') - -filterTests(["smoke", "all"], () => { - xcontext("User Management", () => { - before(() => { - cy.login() - cy.deleteApp("Cypress Tests") - cy.createApp("Cypress Tests", false) - }) - - xit("should create a user via basic onboarding", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000}) - cy.createUser("bbuser@test.com") - cy.get(interact.SPECTRUM_TABLE).should("contain", "bbuser") - }) - - xit("should confirm App User role for a New User", () => { - cy.contains("bbuser").click() - cy.get(".spectrum-Form-itemField").eq(3).should('contain', 'App User') - - // User should not have app access - cy.get(".spectrum-Heading").contains("Apps").parent().within(() => { - cy.get(interact.LIST_ITEMS, { timeout: 500 }).should("contain", "This user has access to no apps") - }) - }) - - if (Cypress.env("TEST_ENV")) { - xit("should assign role types", () => { - // 3 apps minimum required - to assign an app to each role type - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length < 3) { - for (let i = 1; i < 3; i++) { - const uuid = () => Cypress._.random(0, 1e6) - const name = uuid() - if(i < 1){ - cy.createApp(name, false) - } else { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000}) - cy.wait(1000) - cy.get(interact.CREATE_APP_BUTTON, { timeout: 2000 }).click({ force: true }) - cy.createAppFromScratch(name) - } - } - } - }) - // Navigate back to the user - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000}) - cy.get(interact.SPECTRUM_SIDENAV).contains("Users").click() - cy.get(interact.SPECTRUM_TABLE, { timeout: 1000 }).contains("bbuser").click() - cy.get(interact.SPECTRUM_HEADING).contains("bbuser", { timeout: 2000}) - for (let i = 0; i < 3; i++) { - cy.get(interact.SPECTRUM_TABLE, { timeout: 3000}) - .eq(1) - .find(interact.SPECTRUM_TABLE_ROW) - .eq(0) - .find(interact.SPECTRUM_TABLE_CELL) - .eq(0) - .click() - cy.get(interact.SPECTRUM_DIALOG_GRID, { timeout: 1000 }) - .contains("Choose an option") - .click() - .then(() => { - if (i == 0) { - cy.get(interact.SPECTRUM_MENU, { timeout: 2000 }).contains("Admin").click({ force: true }) - } - else if (i == 1) { - cy.get(interact.SPECTRUM_MENU, { timeout: 2000 }).contains("Power").click({ force: true }) - } - else if (i == 2) { - cy.get(interact.SPECTRUM_MENU, { timeout: 2000 }).contains("Basic").click({ force: true }) - } - cy.get(interact.SPECTRUM_BUTTON, { timeout: 2000 }) - .contains("Update role") - .click({ force: true }) - }) - cy.reload() - cy.wait(1000) - } - // Confirm roles exist within Configure roles table - cy.get(interact.SPECTRUM_TABLE, { timeout: 20000 }) - .eq(0) - .within(assginedRoles => { - expect(assginedRoles).to.contain("Admin") - expect(assginedRoles).to.contain("Power") - expect(assginedRoles).to.contain("Basic") - }) - }) - - xit("should unassign role types", () => { - // Set each app within Configure roles table to 'No Access' - cy.get(interact.SPECTRUM_TABLE) - .eq(0) - .find(interact.SPECTRUM_TABLE_ROW) - .its("length") - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(interact.SPECTRUM_TABLE) - .eq(0) - .find(interact.SPECTRUM_TABLE_ROW) - .eq(0) - .find(interact.SPECTRUM_TABLE_CELL) - .eq(0) - .click() - .then(() => { - cy.get(interact.SPECTRUM_PICKER).eq(1).click({ force: true }) - cy.get(interact.SPECTRUM_POPOVER, { timeout: 500 }).contains("No Access").click() - }) - cy.get(interact.SPECTRUM_BUTTON) - .contains("Update role") - .click({ force: true }) - } - }) - // Confirm Configure roles table no longer has any apps in it - cy.get(interact.SPECTRUM_TABLE, { timeout: 1000 }).eq(0).contains("No rows found") - }) - } - - xit("should enable Developer access and verify application access", () => { - // Enable Developer access - cy.get(interact.FIELD) - .eq(4) - .within(() => { - cy.get(interact.SPECTRUM_SWITCH_INPUT).click({ force: true }) - }) - // No Access table should now be empty - cy.get(interact.CONTAINER) - .contains("No Access") - .parent() - .within(() => { - cy.get(interact.SPECTRUM_TABLE).contains("No rows found") - }) - - // Each app within Configure roles should have Admin access - cy.get(interact.SPECTRUM_TABLE) - .eq(0) - .find(interact.SPECTRUM_TABLE_ROW) - .its("length") - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(interact.SPECTRUM_TABLE) - .eq(0) - .find(interact.SPECTRUM_TABLE_ROW) - .eq(i) - .contains("Admin") - cy.wait(500) - } - }) - }) - - xit("should disable Developer access and verify application access", () => { - // Disable Developer access - cy.get(interact.FIELD) - .eq(4) - .within(() => { - cy.get(".spectrum-Switch-input").click({ force: true }) - }) - // Configure roles table should now be empty - cy.get(interact.CONTAINER) - .contains("Configure roles") - .parent() - .within(() => { - cy.get(interact.SPECTRUM_TABLE).contains("No rows found") - }) - }) - - xit("Should edit user details within user details page", () => { - // Add First name - cy.get(interact.FIELD, { timeout: 1000 }).eq(1).within(() => { - cy.wait(500) - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT, { timeout: 1000 }).wait(500).clear().click().type("bb") - }) - // Add Last name - cy.get(interact.FIELD, { timeout: 1000 }).eq(2).within(() => { - cy.wait(500) - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT, { timeout: 1000 }).click().wait(500).clear().type("test") - }) - cy.get(interact.FIELD, { timeout: 1000 }).eq(0).click() - // Reload page - cy.reload() - - // Confirm details have been saved - cy.get(interact.FIELD, { timeout: 20000 }).eq(1).within(() => { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).should('have.value', "bb") - }) - cy.get(interact.FIELD, { timeout: 1000 }).eq(2).within(() => { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT, { timeout: 1000 }).should('have.value', "test") - }) - }) - - xit("should reset the users password", () => { - cy.get(".title").within(() => { - cy.get(interact.SPECTRUM_ICON).click({ force: true }) - }) - cy.get(interact.SPECTRUM_MENU).within(() => { - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Force password reset").click({ force: true }) - }) - - // Reset password modal - cy.get(interact.SPECTRUM_DIALOG_GRID) - .find(interact.SPECTRUM_TEXTFIELD_INPUT).invoke('val').as('pwd') - cy.get(interact.SPECTRUM_BUTTON).contains("Reset password").click({ force: true }) - cy.get(interact.SPECTRUM_BUTTON).contains("Reset password").should('not.exist') - - // Logout, then login with new password - cy.logOut() - cy.get('@pwd').then((pwd) => { - cy.login("bbuser@test.com", pwd) - }) - - // Reset password screen - for (let i = 0; i < 2; i++) { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).eq(i).type("test") - } - cy.get(interact.SPECTRUM_BUTTON).contains("Reset your password").click({ force: true }) - - // Confirm user logged in afer password change - cy.login("bbuser@test.com", "test") - cy.get(".avatar > .icon").click({ force: true }) - - cy.get(".spectrum-Menu-item").contains("Update user information").click({ force: true }) - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .eq(0) - .invoke('val').should('eq', 'bbuser@test.com') - - // Logout and login as previous user - cy.logoutNoAppGrid() - cy.login() - }) - - xit("should delete a user", () => { - cy.deleteUser("bbuser@test.com") - cy.get(interact.SPECTRUM_TABLE, { timeout: 4000 }).should("not.have.text", "bbuser") - }) - }) -}) diff --git a/packages/builder/cypress/integration/adminAndManagement/userSettings.spec.js b/packages/builder/cypress/integration/adminAndManagement/userSettings.spec.js deleted file mode 100644 index 18362031c9..0000000000 --- a/packages/builder/cypress/integration/adminAndManagement/userSettings.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -import filterTests from "../../support/filterTests" -const interact = require('../../support/interact') - -filterTests(["smoke", "all"], () => { - context("User Settings Menu", () => { - - before(() => { - cy.login() - }) - - it("should update user information via user settings menu", () => { - const fname = "test" - const lname = "user" - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.updateUserInformation(fname, lname) - - // Go to user info and confirm name update - cy.contains("Users").click() - cy.contains("test@test.com").click() - - cy.get(interact.FIELD, { timeout: 1000 }).eq(1).within(() => { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).should('have.value', fname) - }) - cy.get(interact.FIELD).eq(2).within(() => { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).should('have.value', lname) - }) - }) - - xit("should allow copying of the users API key", () => { - cy.get(".user-dropdown .avatar > .icon", { timeout: 2000 }).click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM).contains("View API key").click({ force: true }) - cy.get(interact.SPECTRUM_DIALOG_CONTENT).within(() => { - cy.get(interact.SPECTRUM_ICON).click({ force: true }) - }) - // There may be timing issues with this on the smoke build - cy.wait(500) - cy.get(".spectrum-Toast-content") - .contains("URL copied to clipboard") - .should("be.visible") - }) - - it("should allow API key regeneration", () => { - cy.get(".user-dropdown .icon", { timeout: 2000 }).click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM).contains("View API key").click({ force: true }) - cy.get(interact.SPECTRUM_DIALOG_CONTENT).within(() => { - cy.get(interact.SPECTRUM_ICON).click({ force: true }) - }) - // Get initial API key value - cy.get(interact.SPECTRUM_DIALOG_CONTENT) - .find(interact.SPECTRUM_TEXTFIELD_INPUT).invoke('val').as('keyOne') - - // Click re-generate key button - cy.get("button").contains("Regenerate key").click({ force: true }) - - // Verify API key was changed - cy.get(interact.SPECTRUM_DIALOG_CONTENT).within(() => { - cy.get('@keyOne').then((keyOne) => { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).invoke('val').should('not.eq', keyOne) - }) - }) - cy.closeModal() - }) - - it("should update password", () => { - // Access Update password modal - cy.get(".user-dropdown .icon", { timeout: 2000 }).click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Update password").click({ force: true }) - - // Enter new password and update - cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { - for (let i = 0; i < 2; i++) { - // password set to 'newpwd' - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).eq(i).type("newpwd") - } - cy.get("button").contains("Update password").click({ force: true }) - }) - - // Logout & in with new password - //cy.logOut() - cy.login("test@test.com", "newpwd") - }) - - xit("should open and close developer mode", () => { - cy.get(".user-dropdown .icon", { timeout: 2000 }).click({ force: true }) - - // Close developer mode & verify - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Close developer mode").click({ force: true }) - cy.get(interact.SPECTRUM_SIDENAV).should('not.exist') // No config sections - cy.get(interact.CREATE_APP_BUTTON).should('not.exist') // No create app button - cy.get(".app").should('not.exist') // At least one app should be available - - // Open developer mode & verify - cy.get(".avatar > .icon").click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Open developer mode").click({ force: true }) - cy.get(".app-table").should('exist') // config sections available - cy.get(interact.CREATE_APP_BUTTON).should('exist') // create app button available - }) - - after(() => { - // Change password back to original value - cy.get(".user-dropdown .icon", { timeout: 2000 }).click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM).contains("Update password").click({ force: true }) - cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { - for (let i = 0; i < 2; i++) { - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).eq(i).type("test") - } - cy.get("button").contains("Update password").click({ force: true }) - }) - // Remove users name - cy.updateUserInformation() - }) - }) -}) diff --git a/packages/builder/cypress/integration/appOverview.spec.js b/packages/builder/cypress/integration/appOverview.spec.js deleted file mode 100644 index 60d0f2a06d..0000000000 --- a/packages/builder/cypress/integration/appOverview.spec.js +++ /dev/null @@ -1,442 +0,0 @@ -import filterTests from "../support/filterTests" -import clientPackage from "@budibase/client/package.json" - -filterTests(["all"], () => { - xcontext("Application Overview screen", () => { - before(() => { - cy.login() - cy.deleteAllApps() - cy.createApp("Cypress Tests") - }) - - xit("Should be accessible from the applications list", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .title") - .eq(0) - .invoke("attr", "data-cy") - .then($dataCy => { - const dataCy = $dataCy - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .click({ force: true }) - - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/overview/" + dataCy) - }) - }) - }) - - // Find a more suitable place for this. - xit("Should allow unlocking in the app list", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.get(".appTable .lock-status").eq(0).contains("Locked by you").click() - - cy.unlockApp({ owned: true }) - - cy.get(".appTable").should("exist") - cy.get(".lock-status").should("not.be.visible") - }) - - xit("Should allow unlocking in the app overview screen", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.get(".appTable .app-row-actions button") - .contains("Edit") - .eq(0) - .click({ force: true }) - cy.wait(1000) - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".lock-status").eq(0).contains("Locked by you").click() - - cy.unlockApp({ owned: true }) - - cy.get(".lock-status").should("not.be.visible") - }) - - xit("Should reflect the deploy state of an app that hasn't been published.", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".header-right button.spectrum-Button[data-cy='view-app']").should( - "be.disabled" - ) - - cy.get(".spectrum-Tabs-item.is-selected").contains("Overview") - cy.get(".overview-tab").should("be.visible") - - cy.get(".overview-tab [data-cy='app-status']").within(() => { - cy.get(".status-display").contains("Unpublished") - cy.get(".status-display .icon svg[aria-label='GlobeStrike']").should( - "exist" - ) - cy.get(".status-text").contains("-") - }) - }) - - xit("Should reflect the app deployment state", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.get(".appTable .app-row-actions button") - .contains("Edit") - .eq(0) - .click({ force: true }) - - cy.wait(500) - cy.get(".toprightnav button.spectrum-Button", { timeout: 2000 }) - .contains("Publish") - .click({ force: true }) - cy.get(".spectrum-Modal [data-cy='deploy-app-modal']") - .should("be.visible") - .within(() => { - cy.get(".spectrum-Button").contains("Publish").click({ force: true }) - cy.wait(1000) - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".header-right button.spectrum-Button[data-cy='view-app']").should( - "not.be.disabled" - ) - - cy.get(".overview-tab [data-cy='app-status']").within(() => { - cy.get(".status-display").contains("Published") - cy.get(".status-display .icon svg[aria-label='GlobeCheck']").should( - "exist" - ) - cy.get(".status-text").contains("Last published a few seconds ago") - }) - }) - - xit("Should reflect an application that has been unpublished", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Edit") - .eq(0) - .click({ force: true }) - - cy.get(".deployment-top-nav svg[aria-label='Globe']").click({ - force: true, - }) - - cy.get("[data-cy='publish-popover-menu']").should("be.visible") - cy.get( - "[data-cy='publish-popover-menu'] [data-cy='publish-popover-action']" - ).click({ force: true }) - - cy.get("[data-cy='unpublish-modal']") - .should("be.visible") - .within(() => { - cy.get(".confirm-wrap button").click({ force: true }) - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.wait(1000) - cy.get(".appTable .app-row-actions button", { timeout: 10000 }) - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".overview-tab [data-cy='app-status']").within(() => { - cy.get(".status-display").contains("Unpublished") - cy.get(".status-display .icon svg[aria-label='GlobeStrike']").should( - "exist" - ) - cy.get(".status-text").contains("Last published a few seconds ago") - }) - }) - - xit("Should allow the editing of the application icon and colour", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".edit-hover", { timeout: 1000 }).eq(0).click({ force: true }) - // Select random icon - cy.wait(400) - cy.get(".grid").within(() => { - cy.get(".icon-item") - .eq(Math.floor(Math.random() * 23) + 1) - .click() - }) - // Select random colour - cy.get(".fill").click() - cy.get(".colors").within(() => { - cy.get(".color") - .eq(Math.floor(Math.random() * 33) + 1) - .click() - }) - cy.intercept("**/applications/**").as("iconChange") - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.wait("@iconChange") - cy.get("@iconChange").its("response.statusCode").should("eq", 200) - // Confirm icon has changed from default - // Confirm colour has been applied - cy.get(".spectrum-ActionButton-label").contains("Back").click({ force: true }) - cy.get(".appTable", { timeout: 2000 }).within(() => { - cy.get("[aria-label]") - .eq(0) - .children() - .should("have.attr", "xlink:href") - .and("not.contain", "#spectrum-icon-18-Apps") - cy.get(".title") - .children() - .children() - .should("have.attr", "style") - .and("contains", "color") - }) - }) - - xit("Should reflect the last time the application was edited", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".header-right button").contains("Edit").click({ force: true }) - - cy.navigateToFrontend() - - cy.searchAndAddComponent("Headline").then(componentId => { - cy.getComponent(componentId).should("exist") - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".overview-tab [data-cy='edited-by']").within(() => { - cy.get(".editor-name").contains("You") - cy.get(".last-edit-text").contains("Last edited a few seconds ago") - }) - }) - - xit("Should reflect application version is up-to-date", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".overview-tab [data-cy='app-version']").within(() => { - cy.get(".version-status").contains("You're running the latest!") - }) - }) - - it("Should navigate to the settings tab when clicking the App Version card header", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".spectrum-Tabs-item.is-selected").contains("Overview") - cy.get(".overview-tab").should("be.visible") - - cy.get(".overview-tab [data-cy='app-version'] .dash-card-header").click({ - force: true, - }) - - cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") - cy.get(".settings-tab").should("be.visible") - cy.get(".overview-tab").should("not.exist") - }) - - it("Should allow the upgrading of an application, if available.", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.wait(500) - - cy.location().then(loc => { - const params = loc.pathname.split("/") - const appId = params[params.length - 1] - cy.log(appId) - //Downgrade the app for the test - cy.alterAppVersion(appId, "0.0.1-alpha.0").then(() => { - cy.reload() - cy.log("Current deployment version: " + clientPackage.version) - - cy.get(".version-status a", { timeout: 5000 }).contains("Update").click() - cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") - - cy.get(".version-section .page-action button") - .contains("Update") - .click({ force: true }) - - cy.intercept("POST", "**/applications/**/client/update").as( - "updateVersion" - ) - cy.get(".spectrum-Modal.is-open button") - .contains("Update") - .click({ force: true }) - - cy.wait("@updateVersion") - .its("response.statusCode") - .should("eq", 200) - .then(() => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".spectrum-Tabs-item") - .contains("Overview") - .click({ force: true }) - cy.get(".overview-tab [data-cy='app-version']").within(() => { - cy.get(".spectrum-Heading").contains(clientPackage.version) - cy.get(".version-status").contains("You're running the latest!") - }) - }) - }) - }) - }) - - xit("Should allow editing of the app details.", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".spectrum-Tabs-item").contains("Settings").click() - cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") - cy.get(".settings-tab").should("be.visible") - - cy.get(".details-section .page-action button") - .contains("Edit") - .click({ force: true }) - cy.updateAppName("sample name") - - //publish and check its disabled - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.wait(500) - cy.get(".appTable .app-row-actions button") - .contains("Edit") - .eq(0) - .click({ force: true }) - - cy.get(".toprightnav button.spectrum-Button") - .contains("Publish") - .click({ force: true }) - cy.get(".spectrum-Modal [data-cy='deploy-app-modal']") - .should("be.visible") - .within(() => { - cy.get(".spectrum-Button").contains("Publish").click({ force: true }) - cy.wait(1000) - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 10000 }) - cy.get(".appTable .app-row-actions button", { timeout: 5000 }) - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".spectrum-Tabs-item").contains("Settings").click() - cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") - - cy.get(".details-section .page-action .spectrum-Button").scrollIntoView() - cy.get(".details-section .page-action .spectrum-Button", { timeout: 1000 }).should( - "be.disabled" - ) - }) - - xit("Should allow copying of the published application Id", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions") - .eq(0) - .within(() => { - cy.get(".spectrum-Button").contains("Edit").click({ force: true }) - }) - - cy.publishApp("sample-name") - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".app-overview-actions-icon > .icon").click({ force: true }) - - cy.get("[data-cy='app-overview-menu-popover']") - .eq(0) - .within(() => { - cy.get(".spectrum-Menu-item") - .contains("Copy App ID") - .click({ force: true }) - }) - - cy.get(".spectrum-Toast-content") - .contains("App ID copied to clipboard.") - .should("be.visible") - }) - - xit("Should allow unpublishing of the application via the Unpublish link", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - - cy.get(`[data-cy="app-status"]`).within(() => { - cy.contains("Unpublish").click({ force: true }) - }) - - cy.get("[data-cy='unpublish-modal']") - .should("be.visible") - .within(() => { - cy.get(".confirm-wrap button").click({ force: true }) - }) - - cy.get(".overview-tab [data-cy='app-status']").within(() => { - cy.get(".status-display").contains("Unpublished") - cy.get(".status-display .icon svg[aria-label='GlobeStrike']") - .should("exist") - }) - }) - - xit("Should allow deleting of the application", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.get(".appTable .app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - cy.get(".app-overview-actions-icon > .icon").click({ force: true }) - - cy.get("[data-cy='app-overview-menu-popover']") - .eq(0) - .within(() => { - cy.get(".spectrum-Menu-item") - .contains("Delete") - .click({ force: true }) - cy.wait(500) - }) - - //The test application was renamed earlier in the spec - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get("input").type("sample name") - cy.get(".spectrum-Button--warning").click() - }) - - cy.location().should(loc => { - expect(loc.pathname).to.eq("/builder/portal/apps") - }) - - cy.get(".appTable").should("not.exist") - - cy.get(".welcome .container h1").contains("Let's create your first app!") - }) - - after(() => { - cy.deleteAllApps() - }) - }) -}) diff --git a/packages/builder/cypress/integration/appPublishWorkflow.spec.js b/packages/builder/cypress/integration/appPublishWorkflow.spec.js deleted file mode 100644 index 3376db0b2d..0000000000 --- a/packages/builder/cypress/integration/appPublishWorkflow.spec.js +++ /dev/null @@ -1,108 +0,0 @@ -import filterTests from "../support/filterTests" -import { APP_TABLE_APP_NAME, DEPLOY_SUCCESS_MODAL } from "../support/interact"; -const interact = require('../support/interact') - -filterTests(['all'], () => { - xcontext("Publish Application Workflow", () => { - before(() => { - cy.login() - cy.deleteAllApps() - cy.createApp("Cypress Tests", false) - }) - - xit("Should reflect the unpublished status correctly", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - - cy.get(interact.APP_TABLE_STATUS, { timeout: 3000 }).eq(0) - .within(() => { - cy.contains("Unpublished") - cy.get(interact.GLOBESTRIKE).should("exist") - }) - - cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) - .within(() => { - cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Edit").click({ force: true }) - }) - - cy.get(interact.DEPLOYMENT_TOP_NAV_GLOBESTRIKE).should("exist") - cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("not.exist") - }) - - xit("Should publish an application and correctly reflect that", () => { - //Assuming the previous test was run and the unpublished app is open in edit mode. - cy.get(interact.TOPRIGHTNAV_BUTTON_SPECTRUM).contains("Publish").click({ force: true }) - - cy.get(interact.DEPLOY_APP_MODAL).should("be.visible") - .within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("Publish").click({ force: true }) - }); - - //Verify that the app url is presented correctly to the user - cy.get(interact.DEPLOY_SUCCESS_MODAL, { timeout: 1000 }) - .should("be.visible") - .within(() => { - let appUrl = Cypress.config().baseUrl + '/app/cypress-tests' - cy.get(interact.DEPLOY_APP_URL_INPUT).should('have.value', appUrl) - cy.get(interact.SPECTRUM_BUTTON).contains("Done").click({ force: true }) - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.get(interact.APP_TABLE_STATUS, { timeout: 3000 }).eq(0) - .within(() => { - cy.contains("Published") - cy.get(interact.GLOBE).should("exist") - }) - - cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) - .within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("Manage") - cy.get(interact.SPECTRUM_BUTTON).contains("Edit").click({ force: true }) - }) - - cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist").click({ force: true }) - - cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible") - .within(() => { - cy.get(interact.PUBLISH_POPOVER_ACTION).should("exist") - cy.get("button").contains("View app").should("exist") - cy.get(interact.PUBLISH_POPOVER_MESSAGE).should("have.text", "Last published a few seconds ago") - }) - }) - - xit("Should unpublish an application using the link and reflect the status change", () => { - //Assuming the previous test app exists and is published - - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - - cy.get(interact.APP_TABLE_STATUS).eq(0) - .within(() => { - cy.contains("Published") - cy.get("svg[aria-label='Globe']").should("exist") - }) - - cy.get(interact.APP_TABLE).eq(0) - .within(() => { - cy.get(interact.APP_TABLE_APP_NAME).click({ force: true }) - }) - - cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist").click({ force: true }) - - cy.get("[data-cy='publish-popover-menu']") - .within(() => { - cy.get(interact.PUBLISH_POPOVER_ACTION).click({ force: true }) - }) - - cy.get(interact.UNPUBLISH_MODAL).should("be.visible") - .within(() => { - cy.get(interact.CONFIRM_WRAP_BUTTON).click({ force: true } - ) - }) - - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 6000 }) - cy.wait(500) - cy.get(interact.APP_TABLE_STATUS, { timeout: 10000 }).eq(0).contains("Unpublished") - - }) - }) -}) diff --git a/packages/builder/cypress/integration/autoScreensUI.spec.js b/packages/builder/cypress/integration/autoScreensUI.spec.js deleted file mode 100644 index 581e5c431b..0000000000 --- a/packages/builder/cypress/integration/autoScreensUI.spec.js +++ /dev/null @@ -1,101 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['smoke', 'all'], () => { - xcontext("Auto Screens UI", () => { - before(() => { - cy.login() - cy.deleteAllApps() - }) - - it("should disable the autogenerated screen options if no sources are available", () => { - cy.createApp("First Test App", false) - cy.closeModal(); - - cy.navigateToAutogeneratedModal() - cy.get(interact.CONFIRM_WRAP_SPE_BUTTON).should('be.disabled') - - cy.deleteAllApps() - }); - - it("should not display incompatible sources", () => { - cy.createApp("Test App") - - cy.selectExternalDatasource("REST") - cy.selectExternalDatasource("S3") - cy.get(interact.SPECTRUM_MODAL).within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("Save and continue to query").click({ force : true }) - }) - - cy.navigateToAutogeneratedModal() - - cy.get(interact.DATA_SOURCE_ENTRY).should('have.length', 1) - cy.get(interact.DATA_SOURCE_ENTRY) - - cy.deleteAllApps() - }); - - it("should generate internal table screens", () => { - cy.createTestApp() - // Create Autogenerated screens from the internal table - cy.createDatasourceScreen(["Cypress Tests"]) - // Confirm screens have been auto generated - cy.get(interact.BODY).should('contain', "cypress-tests") - .and('contain', 'cypress-tests/:id') - .and('contain', 'cypress-tests/new/row') - }) - - it("should generate multiple internal table screens at once", () => { - const initialTable = "Cypress Tests" - const secondTable = "Table Two" - // Create a second internal table - cy.createTable(secondTable) - // Create Autogenerated screens from the internal tables - cy.createDatasourceScreen([initialTable, secondTable]) - // Confirm screens have been auto generated - // Previously generated tables are suffixed with numbers - as expected - cy.wait(1000) - cy.get(interact.BODY).should('contain', 'cypress-tests-2') - .and('contain', 'cypress-tests-2/:id') - .and('contain', 'cypress-tests-2/new/row') - .and('contain', 'table-two') - .and('contain', 'table-two/:id') - .and('contain', 'table-two/new/row') - }) - - it("should generate multiple internal table screens with the same screen access level", () => { - //The tables created in the previous step still exist - cy.createTable("Table Three") - cy.createTable("Table Four") - cy.createDatasourceScreen(["Table Three", "Table Four"], "Admin") - - // Filter screens to Admin - cy.filterScreensAccessLevel('Admin') - - cy.get(interact.BODY).should('contain', 'table-three') - .and('contain', 'table-three/:id') - .and('contain', 'table-three/new/row') - .and('contain', 'table-four') - .and('contain', 'table-four/:id') - .and('contain', 'table-four/new/row') - .and('not.contain', 'table-two') - .and('not.contain', 'cypress-tests') - }) - - if (Cypress.env("TEST_ENV")) { - it("should generate datasource screens", () => { - // Using MySQL datasource for testing this - const datasource = "MySQL" - // Select & configure MySQL datasource - cy.selectExternalDatasource(datasource) - cy.addDatasourceConfig(datasource) - // Create Autogenerated screens from a MySQL table - MySQL contains books table - cy.createDatasourceScreen(["books"]) - - cy.get(interact.BODY).should('contain', 'books') - .and('contain', 'books/:id') - .and('contain', 'books/new/row') - }) - } - }) -}) diff --git a/packages/builder/cypress/integration/createApp.spec.js b/packages/builder/cypress/integration/createApp.spec.js deleted file mode 100644 index 897c7f8b91..0000000000 --- a/packages/builder/cypress/integration/createApp.spec.js +++ /dev/null @@ -1,235 +0,0 @@ -import filterTests from '../support/filterTests' -const interact = require('../support/interact') - -filterTests(['smoke', 'all'], () => { - context("Create an Application", () => { - - before(() => { - cy.login() - cy.deleteAllApps() - }) - - if (!(Cypress.env("TEST_ENV"))) { - it.skip("should show the new user UI/UX", () => { - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/create`, { timeout: 5000 }) //added /portal/apps/create - cy.wait(1000) - cy.get(interact.CREATE_APP_BUTTON, { timeout: 10000 }).contains('Start from scratch').should("exist") - - cy.get(interact.TEMPLATE_CATEGORY_FILTER).should("exist") - cy.get(interact.TEMPLATE_CATEGORY).should("exist") - - cy.get(interact.APP_TABLE).should("not.exist") - }) - } - - xit("should provide filterable templates", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.wait(500) - - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length > 0) { - cy.get(interact.SPECTRUM_BUTTON).contains("View Templates").click({ force: true }) - } - }) - - cy.get(interact.TEMPLATE_CATEGORY_FILTER).should("exist") - cy.get(interact.TEMPLATE_CATEGORY).should("exist") - - cy.get(interact.TEMPLATE_CATEGORY_ACTIONGROUP).its('length').should('be.gt', 1) - cy.get(interact.TEMPLATE_CATEGORY_FILTER_ACTIONBUTTON).its('length').should('be.gt', 2) - - cy.get(interact.TEMPLATE_CATEGORY_FILTER_ACTIONBUTTON).eq(1).click() - cy.get(interact.TEMPLATE_CATEGORY_ACTIONGROUP).should('have.length', 1) - - cy.get(interact.TEMPLATE_CATEGORY_FILTER_ACTIONBUTTON).eq(0).click() - cy.get(interact.TEMPLATE_CATEGORY_ACTIONGROUP).its('length').should('be.gt', 1) - }) - - it("should enforce a valid url before submission", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 10000 }) - - // Start create app process. If apps already exist, click second button - cy.wait(1000) - cy.get(interact.CREATE_APP_BUTTON, { timeout: 3000 }).click({ force: true }) - - const appName = "Cypress Tests" - cy.get(interact.SPECTRUM_MODAL).within(() => { - - cy.get(interact.APP_NAME_INPUT).eq(0).should('have.focus') - - //Auto fill - cy.get(interact.APP_NAME_INPUT).eq(0).clear() - cy.get(interact.APP_NAME_INPUT).eq(0).type(appName).should("have.value", appName).blur() - cy.get(interact.APP_NAME_INPUT).eq(1).should("have.value", "/cypress-tests") - cy.get(interact.SPECTRUM_BUTTON_GROUP).contains("Create app").should('not.be.disabled') - - //Empty the app url - disabled create - cy.get(interact.APP_NAME_INPUT).eq(1).clear().blur() - cy.get(interact.SPECTRUM_BUTTON_GROUP).contains("Create app").should('be.disabled') - - //Invalid url - cy.get(interact.APP_NAME_INPUT).eq(1).type("/new app-url").blur() - cy.get(interact.SPECTRUM_BUTTON_GROUP).contains("Create app").should('be.disabled') - - //Specifically alter the url - cy.get(interact.APP_NAME_INPUT).eq(1).clear() - cy.get(interact.APP_NAME_INPUT).eq(1).type("another-app-name").blur() - cy.get(interact.APP_NAME_INPUT).eq(1).should("have.value", "/another-app-name") - cy.get(interact.APP_NAME_INPUT).eq(0).should("have.value", appName) - cy.get(interact.SPECTRUM_BUTTON_GROUP).contains("Create app").should('not.be.disabled') - - }) - }) - - it.skip("should create the first application from scratch", () => { - const appName = "Cypress Tests" - cy.createApp(appName, false) - - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - - cy.applicationInAppTable(appName) - cy.deleteApp(appName) - }) - - it.skip("should create the first application from scratch with a default name", () => { - cy.updateUserInformation("", "") - cy.createApp("", false) - cy.applicationInAppTable("My app") - cy.deleteApp("My app") - }) - - it("should create the first application from scratch, using the users first name as the default app name", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - - cy.updateUserInformation("Ted", "Userman") - - cy.createApp("", false) - cy.applicationInAppTable("Teds app") - cy.deleteApp("Teds app") - - // Accomodate names that end in 'S' - cy.updateUserInformation("Chris", "Userman") - - cy.createApp("", false) - cy.applicationInAppTable("Chris app") - cy.deleteApp("Chris app") - - cy.updateUserInformation("", "") - }) - - it("should create an application from an export", () => { - const exportedApp = 'cypress/fixtures/exported-app.txt' - - cy.importApp(exportedApp, "") - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 2000 }) - cy.applicationInAppTable("My app") - cy.get(".app-table .name").eq(0).click() - cy.closeModal() - cy.get(`[aria-label="ShowMenu"]`).click() - cy.get(".spectrum-Menu").within(() => { - cy.contains("Overview").click() - }) - cy.get(".app-overview-actions-icon").within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - cy.get(".spectrum-Menu").contains("Delete").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get("input").type("My app") - }) - cy.get(".spectrum-Button--warning").click() - }) - - it("should create an application from an export, using the users first name as the default app name", () => { - const exportedApp = 'cypress/fixtures/exported-app.txt' - - cy.updateUserInformation("Ted", "Userman") - cy.importApp(exportedApp, "") - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.applicationInAppTable("Teds app") - cy.get(".app-table .name").eq(0).click() - cy.closeModal() - cy.get(`[aria-label="ShowMenu"]`).click() - cy.get(".spectrum-Menu").within(() => { - cy.contains("Overview").click() - }) - cy.get(".app-overview-actions-icon").within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - cy.get(".spectrum-Menu").contains("Delete").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get("input").type("Teds app") - }) - cy.get(".spectrum-Button--warning").click() - cy.updateUserInformation("", "") - }) - - xit("should generate the first application from a template", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.wait(500) - - // Navigate to Create new app section if apps already exist - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length > 0) { - cy.get(interact.CREATE_APP_BUTTON).click({ force: true }) - } - }) - - cy.get(interact.TEMPLATE_CATEGORY_FILTER).should("exist") - cy.get(interact.TEMPLATE_CATEGORY).should("exist") - - // Select template - cy.get(interact.TEMPLATE_CATEGORY_ACTIONGROUP).eq(0).within(() => { - const card = cy.get('.template-card').eq(0).should("exist"); - const cardOverlay = card.get('.template-thumbnail-action-overlay').should("exist") - cardOverlay.invoke("show") - cardOverlay.get("button").contains("Use template").should("exist").click({ force: true }) - }) - - // CMD Create app from theme card - cy.get(".spectrum-Modal").should('be.visible') - - const templateName = cy.get(".spectrum-Modal .template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = "/" + templateNameText.toLowerCase().replace(/\s+/g, "-") - cy.get(interact.SPECTRUM_MODAL_INPUT).eq(0).should("have.value", templateNameText) - cy.get(interact.SPECTRUM_MODAL_INPUT).eq(1).should("have.value", templateNameParsed) - - cy.get(".spectrum-Modal .spectrum-ButtonGroup").contains("Create app").click() - cy.wait(5000) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.wait(2000) - - cy.applicationInAppTable(templateNameText) - cy.deleteApp(templateNameText) - }); - - }) - - it("should display a second application and app filtering", () => { - // Create first app - const appName = "Cypress Tests" - cy.createApp(appName) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - - // Create second app - const secondAppName = "Second App Demo" - cy.createApp(secondAppName) - - cy.visit(`${Cypress.config().baseUrl}/builder`) - - //Both applications should exist and be searchable - cy.searchForApplication(appName) - cy.searchForApplication(secondAppName) - - cy.deleteApp(secondAppName) - }) - - }) -}) diff --git a/packages/builder/cypress/integration/createAutomation.spec.js b/packages/builder/cypress/integration/createAutomation.spec.js deleted file mode 100644 index 6326691d28..0000000000 --- a/packages/builder/cypress/integration/createAutomation.spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['smoke', 'all'], () => { - xcontext("Create a automation", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - xit("should create a automation", () => { - cy.createTestTableWithData() - cy.wait(2000) - cy.contains("Automate").click() - cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Add automation").click({ force: true }) - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get("input").type("Add Row") - cy.contains("Row Created").click({ force: true }) - cy.get(interact.SPECTRUM_BUTTON_CTA, { timeout: 500 }).click() - }) - - // Setup trigger - cy.get(interact.SPECTRUM_PICKER_LABEL).click() - cy.wait(500) - cy.contains("dog").click() - // Create action - cy.get('[aria-label="AddCircle"]', { timeout: 2000 }).click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.wait(1000) - cy.contains("Create Row").trigger('mouseover').click().click() - cy.get(interact.SPECTRUM_BUTTON_CTA).click() - }) - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(1).click() - cy.contains("dog").click() - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .first() - .type("{{ trigger.row.name }}", { parseSpecialCharSequences: false }) - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .eq(1) - .type("11") - cy.contains("Finish and test automation").click() - - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get(interact.SPECTRUM_PICKER_LABEL, { timeout: 1000 }).click() - cy.contains("dog").click() - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT, { timeout: 1000 }) - .first() - .type("automationGoodboy") - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .eq(1) - .type("11") - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .eq(2) - .type("123456") - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) - .eq(3) - .type("123456") - cy.contains("Test").click() - }) - cy.contains("Data").click() - cy.contains("automationGoodboy") - }) - }) -}) diff --git a/packages/builder/cypress/integration/createBinding.spec.js b/packages/builder/cypress/integration/createBinding.spec.js deleted file mode 100644 index 0722d29f1d..0000000000 --- a/packages/builder/cypress/integration/createBinding.spec.js +++ /dev/null @@ -1,66 +0,0 @@ -import filterTests from "../support/filterTests" - -filterTests(['smoke', 'all'], () => { - context("Create Bindings", () => { - before(() => { - cy.login() - cy.createTestApp() - cy.navigateToFrontend() - }) - - it("should add a current user binding", () => { - cy.searchAndAddComponent("Paragraph").then(componentId => { - addSettingBinding("text", ["Current User", "_id"], "Current User._id") - }) - cy.deleteComponentByName("New Paragraph") - }) - - it("should handle an invalid binding", () => { - cy.searchAndAddComponent("Paragraph").then(componentId => { - // Cypress needs to escape curly brackets - cy.get("[data-cy=setting-text] input") - .type("{{}{{}{{} Current User._id {}}{}}") - .blur() - cy.getComponent(componentId).should("have.text", "{{{ [user].[_id] }}") - cy.deleteComponentByName("New Paragraph") - }) - }) - - xit("should add a URL param binding", () => { - const paramName = "foo" - cy.createScreen(`/test/:${paramName}`) - cy.searchAndAddComponent("Paragraph").then(componentId => { - addSettingBinding("text", ["URL", paramName], `URL.${paramName}`) - // The builder preview pages don't have a real URL, so all we can do - // is check that we were able to bind to the property, and that the - // component exists on the page - cy.getComponent(componentId).should("have.text", "New Paragraph") - }) - }) - - it("should add a binding with a handlebars helper", () => { - cy.searchAndAddComponent("Paragraph").then(componentId => { - // Cypress needs to escape curly brackets - cy.get("[data-cy=setting-text] input") - .type("{{}{{} add 1 2 {}}{}}") - .blur() - cy.getComponent(componentId).should("have.text", "3") - }) - }) - }) - - const addSettingBinding = (setting, bindingCategories, bindingText, clickOption = true) => { - cy.get(`[data-cy="setting-${setting}"] [data-cy=text-binding-button]`).click() - cy.get(".category-list li").contains(bindingCategories[0]) - cy.get(".drawer").within(() => { - if (clickOption) { - cy.get(".category-list li").contains(bindingCategories[0]).click() - cy.get("li.binding").contains(bindingCategories[1]).click() - cy.get("textarea").should("have.value", `{{ ${bindingText} }}`) - } else { - cy.get("textarea").type(bindingText) - } - cy.contains("Save").click() - }) - } -}) diff --git a/packages/builder/cypress/integration/createComponents.spec.js b/packages/builder/cypress/integration/createComponents.spec.js deleted file mode 100644 index 7f29466258..0000000000 --- a/packages/builder/cypress/integration/createComponents.spec.js +++ /dev/null @@ -1,275 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require("../support/interact") - -filterTests(["all"], () => { - xcontext("Create Components", () => { - let headlineId - - before(() => { - cy.login() - cy.createTestApp() - cy.createTable("dog") - cy.addColumn("dog", "name", "Text") - cy.addColumn("dog", "age", "Number") - cy.addColumn("dog", "breed", "Options") - - cy.navigateToFrontend() - cy.wait(1000) //allow the iframe some wiggle room - }) - - //Use the tree to delete a selected component - const deleteSelectedComponent = () => { - cy.get( - ".nav-item.selected .actions > div > .icon" - ).click({ - force: true, - }) - cy.get(".spectrum-Popover.is-open li").contains("Delete").click() - cy.get(".spectrum-Modal button").contains("Delete Component").click({ - force: true, - }) - } - - it("should add a container", () => { - cy.searchAndAddComponent("Container").then(componentId => { - cy.getComponent(componentId).should("exist") - }) - }) - - it("should add a headline", () => { - cy.searchAndAddComponent("Headline").then(componentId => { - headlineId = componentId - cy.getComponent(headlineId).should("exist") - }) - }) - - it("should change the text of the headline", () => { - const text = "Lorem ipsum dolor sit amet." - cy.get("[data-cy=setting-text] input").type(text).blur() - cy.getComponent(headlineId).should("have.text", text) - }) - - it("should change the size of the headline", () => { - cy.get("[data-cy=setting-size]").scrollIntoView().click() - cy.get("[data-cy=setting-size]").within(() => { - cy.get(".spectrum-Form-item li.spectrum-Menu-item") - .contains("3XL") - .click() - }) - - cy.getComponent(headlineId).within(() => { - cy.get(".spectrum-Heading").should("have.css", "font-size", "60px") - }) - }) - - it("should create a form and reset to match schema", () => { - cy.searchAndAddComponent("Form").then(() => { - cy.get("[data-cy=setting-dataSource]").contains("Custom").click() - cy.get(interact.DROPDOWN).contains("dog").click() - cy.wait(500) - cy.searchAndAddComponent("Field Group").then(fieldGroupId => { - cy.contains("Update form fields").click() - cy.get(".spectrum-Modal") - .get(".confirm-wrap .spectrum-Button") - .click() - cy.wait(500) - cy.getComponent(fieldGroupId).within(() => { - cy.contains("name").should("exist") - cy.contains("age").should("exist") - cy.contains("breed").should("exist") - // cy.contains("image").should("exist") - }) - cy.getComponent(fieldGroupId).find("input").should("have.length", 2) - cy.getComponent(fieldGroupId) - .find(interact.SPECTRUM_PICKER) - .should("have.length", 1) - }) - }) - }) - - it("deletes a component", () => { - cy.searchAndAddComponent("Paragraph").then(componentId => { - cy.get("[data-cy=setting-_instanceName] input").type(componentId).blur() - cy.get( - ".nav-item.selected .actions > div > .icon" - ).click({ - force: true, - }) - cy.get(".spectrum-Popover.is-open li").contains("Delete").click() - cy.get(".spectrum-Modal button").contains("Delete Component").click({ - force: true, - }) - cy.getComponent(componentId).should("not.exist") - }) - }) - - it("should clear the iframe place holder when a form field has been set", () => { - cy.searchAndAddComponent("Form").then(formId => { - //For deletion - cy.get("[data-cy=setting-_instanceName] input") - .clear() - .type(formId) - .blur() - cy.get("[data-cy=setting-dataSource]").contains("Custom").click() - cy.get(".dropdown").contains("dog").click() - - const fieldTypeToColumnName = { - "Text Field": "name", - "Number Field": "age", - "Options Picker": "breed", - } - - const componentTypeLabels = Object.keys(fieldTypeToColumnName) - - const testFieldFocusOnCreate = componentLabel => { - cy.log("Adding: " + componentLabel) - return cy.searchAndAddComponent(componentLabel).then(componentId => { - cy.get("[data-cy=setting-field] button.spectrum-Picker").click() - - //Click the first appropriate field. They are filtered by type - cy.get( - "[data-cy=setting-field] .spectrum-Popover.is-open li.spectrum-Menu-item" - ) - .contains(fieldTypeToColumnName[componentLabel]) - .click() - cy.wait(500) - cy.getComponent(componentId) - .find(".component-placeholder") - .should("not.exist") - }) - } - - cy.wait(500) - cy.wrap(componentTypeLabels) - .each(label => { - return testFieldFocusOnCreate(label) - }) - .then(() => { - cy.get(".nav-item") - .contains(formId) - .click({ force: true }) - deleteSelectedComponent() - }) - }) - }) - - it("should populate the provider for charts with a data provider in its path", () => { - cy.searchAndAddComponent("Data Provider").then(providerId => { - //For deletion - cy.get("[data-cy=setting-_instanceName] input") - .clear() - .type(providerId) - .blur() - cy.get("[data-cy=setting-dataSource]") - .contains("Choose an option") - .click() - cy.get(`[data-cy=dataSource-popover-${providerId}] ul li`) - .contains("dog") - .click() - - const chartTypeLabels = [ - "Bar Chart", - "Line Chart", - "Area Chart", - "Pie Chart", - "Donut Chart", - "Candlestick Chart", - ] - - const testFocusOnCreate = chartLabel => { - cy.log("Adding: " + chartLabel) - cy.searchAndAddComponent(chartLabel).then(componentId => { - cy.get( - "[data-cy=dataProvider-prop-control] .spectrum-Picker" - ).should("not.have.class", "is-focused") - - // Pre populated. - cy.get("[data-cy=dataProvider-prop-control] .spectrum-Picker-label") - .contains(providerId) - .should("exist") - }) - } - cy.wait(1000) - cy.wrap(chartTypeLabels) - .each(label => { - return testFocusOnCreate(label) - }) - .then(() => { - cy.get(".nav-item") - .contains(providerId) - .click({ force: true }) - deleteSelectedComponent() - }) - }) - }) - - it("should replace the placeholder when a url is set on an image", () => { - cy.searchAndAddComponent("Image").then(imageId => { - cy.get("[data-cy=setting-_instanceName] input") - .clear() - .type(imageId) - .blur() - //return $("New Data Provider.Rows")[0]["Attachment"][0]["url"] - //No minio, so just enter something local that will not reslove - cy.get("[data-cy=url-prop-control] input[type=text]") - .type("cypress/fixtures/ghost.png") - .blur() - cy.getComponent(imageId) - .find(".component-placeholder") - .should("not.exist") - cy.getComponent(imageId).find(`img[alt=${imageId}]`).should("exist") - cy.get(".nav-item") - .contains(imageId) - .click({ force: true }) - deleteSelectedComponent() - }) - }) - - it("should add a markdown component.", () => { - cy.searchAndAddComponent("Markdown Viewer").then(markdownId => { - cy.get("[data-cy=setting-_instanceName] input") - .clear() - .type(markdownId) - .blur() - cy.get( - "[data-cy=value-prop-control] input[type=text].spectrum-Textfield-input" - ) - .type("# Hi") - .blur() - cy.getComponent(markdownId) - .find(".component-placeholder") - .should("not.exist") - cy.getComponent(markdownId) - .find(".editor-preview-full h1") - .contains("Hi") - cy.get(".nav-item") - .contains(markdownId) - .click({ force: true }) - deleteSelectedComponent() - }) - }) - - it("should direct the user when adding an Icon component.", () => { - cy.searchAndAddComponent("Icon").then(iconId => { - cy.get("[data-cy=setting-_instanceName] input") - .clear() - .type(iconId) - .blur() - cy.get("[data-cy=icon-prop-control] .spectrum-ActionButton").click() - cy.get("[data-cy=icon-popover].spectrum-Popover.is-open").within(() => { - cy.get(".search-input input").type("save").blur() - cy.get(".search-input button").click({ force: true }) - cy.get(".icon-area .icon-container").eq(0).click({ force: true }) - }) - cy.getComponent(iconId) - .find(".component-placeholder") - .should("not.exist") - cy.getComponent(iconId).find("i.ri-save-fill").should("exist") - cy.get(".nav-item") - .contains(iconId) - .click({ force: true }) - deleteSelectedComponent() - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/createScreen.spec.js b/packages/builder/cypress/integration/createScreen.spec.js deleted file mode 100644 index 09d8485386..0000000000 --- a/packages/builder/cypress/integration/createScreen.spec.js +++ /dev/null @@ -1,54 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(["smoke", "all"], () => { - xcontext("Screen Tests", () => { - before(() => { - cy.login() - cy.createTestApp() - cy.navigateToFrontend() - }) - - it.skip("Should successfully create a screen", () => { - cy.createScreen("test") - cy.get(interact.BODY).within(() => { - cy.contains("/test").should("exist") - }) - }) - - it("Should update the url", () => { - cy.createScreen("test with spaces") - cy.get(interact.BODY).within(() => { - cy.contains("/test-with-spaces").should("exist") - }) - }) - - it.skip("should delete all screens then create first screen via button", () => { - cy.deleteAllScreens() - - cy.contains("Create first screen").click() - cy.get(interact.BODY, { timeout: 2000 }).should('contain', '/home') - }) - - it("Should create and filter screens by access level", () => { - const accessLevels = ["Basic", "Admin", "Public", "Power"] - - for (const access of accessLevels) { - // Create screen with specified access level - cy.createScreen(access, access) - // Filter by access level and confirm screen visible - cy.filterScreensAccessLevel(access) - cy.get(interact.BODY).within(() => { - cy.get(interact.NAV_ITEM).should('contain', access.toLowerCase()) - }) - } - - // Filter by All screens - Confirm all screens visible - cy.filterScreensAccessLevel("All screens") - cy.get(interact.BODY).should('contain', accessLevels[0]) - .and('contain', accessLevels[1]) - .and('contain', accessLevels[2]) - .and('contain', accessLevels[3]) - }) - }) -}) diff --git a/packages/builder/cypress/integration/createTable.spec.js b/packages/builder/cypress/integration/createTable.spec.js deleted file mode 100644 index 1c3e69a36b..0000000000 --- a/packages/builder/cypress/integration/createTable.spec.js +++ /dev/null @@ -1,112 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(["smoke", "all"], () => { - xcontext("Create a Table", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should create a new Table", () => { - cy.createTable("dog") - // Check if Table exists - cy.get(interact.TABLE_TITLE_H1, { timeout: 1000 }).should("have.text", "dog") - }) - - it("adds a new column to the table", () => { - cy.addColumn("dog", "name", "Text") - cy.contains("name").should("be.visible") - }) - - it("creates a row in the table", () => { - cy.addRow(["Rover"]) - cy.contains("Rover").should("be.visible") - }) - - it("updates a column on the table", () => { - cy.get(interact.TABLE_TITLE).click() - cy.get(interact.SPECTRUM_TABLE_EDIT).click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - - cy.get("input").eq(0).type("updated", { force: true }) - // Unset table display column - cy.get(interact.SPECTRUM_SWITCH_INPUT).eq(1).click() - cy.contains("Save Column").click() - }) - cy.contains("nameupdated ").should("contain", "nameupdated") - }) - - it("edits a row", () => { - cy.contains("button", "Edit").click({ force: true }) - cy.wait(500) - cy.get(interact.SPECTRUM_MODAL_INPUT).clear() - cy.get(interact.SPECTRUM_MODAL_INPUT).type("Updated") - cy.contains("Save").click() - cy.contains("Updated").should("have.text", "Updated") - }) - - it("deletes a row", () => { - cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true }) - cy.contains("Delete 1 row").click() - cy.get(interact.SPECTRUM_MODAL).contains("Delete").click() - cy.contains("RoverUpdated").should("not.exist") - }) - - if (Cypress.env("TEST_ENV")) { - // No Pagination in CI - Test env only for the next two tests - xit("Adds 15 rows and checks pagination", () => { - // 10 rows per page, 15 rows should create 2 pages within table - const totalRows = 16 - for (let i = 1; i < totalRows; i++) { - cy.addRow([i]) - } - cy.reload() - cy.get(interact.SPECTRUM_PAGINATION, { timeout: 2000 }).within(() => { - cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).click() - }) - cy.get(interact.SPECTRUM_PAGINATION).within(() => { - cy.get(interact.SPECTRUM_BODY_SECOND).contains("Page 2") - }) - }) - - xit("Deletes rows and checks pagination", () => { - // Delete rows, removing second page from table - cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true }) - cy.get(interact.POPOVERS).within(() => { - cy.get(interact.SPECTRUM_BUTTON).click({ force: true }) - }) - cy.get(interact.SPECTRUM_DIALOG_GRID).contains("Delete").click({ force: true }) - - // Confirm table only has one page - cy.get(interact.SPECTRUM_PAGINATION, { timeout: 1000 }).within(() => { - cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).should("not.be.enabled") - }) - }) - } - - it("deletes a column", () => { - const columnName = "nameupdated" - cy.get(interact.TABLE_TITLE).click() - cy.get(interact.SPECTRUM_TABLE_EDIT).click() - cy.contains("Delete").click() - cy.get(interact.DELETE_COLUMN_CONFIRM).type(columnName) - cy.contains("Delete Column").click() - cy.contains("nameupdated").should("not.exist") - }) - - it("deletes a table", () => { - cy.get(interact.NAV_ITEM) - .contains("dog") - .parents(interact.NAV_ITEM) - .first() - .within(() => { - cy.get(interact.ACTION_SPECTRUM_ICON).click({ force: true }) - }) - cy.get(interact.SPECTRUM_MENU_CHILD2).click() - cy.get(interact.DELETE_TABLE_CONFIRM).type("dog") - cy.contains("Delete Table").click() - cy.contains("dog").should("not.exist") - }) - }) -}) diff --git a/packages/builder/cypress/integration/createView.spec.js b/packages/builder/cypress/integration/createView.spec.js deleted file mode 100644 index c1494b6756..0000000000 --- a/packages/builder/cypress/integration/createView.spec.js +++ /dev/null @@ -1,161 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['smoke', 'all'], () => { - xcontext("Create a View", () => { - before(() => { - cy.login() - cy.createTestApp() - cy.createTable("data") - cy.addColumn("data", "group", "Text") - cy.addColumn("data", "age", "Number") - cy.addColumn("data", "rating", "Number") - - // 6 Rows - cy.addRow(["Students", 25, 1]) - cy.addRow(["Students", 20, 3]) - cy.addRow(["Students", 18, 6]) - cy.addRow(["Students", 25, 2]) - cy.addRow(["Teachers", 49, 5]) - cy.addRow(["Teachers", 36, 3]) - }) - - xit("creates a view", () => { - cy.contains("Create view").click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get("input").type("Test View") - cy.get("button").contains("Create View").click({ force: true }) - }) - cy.contains(interact.TABLE_TITLE_H1, "Test View", { timeout: 10000 }) - cy.get(".table-wrapper").within(() => { - cy.get(interact.TITLE).then($headers => { - expect($headers).to.have.length(3) - const headers = Array.from($headers).map(header => - header.textContent.trim() - ) - expect(removeSpacing(headers)).to.deep.eq(["group", "age", "rating"]) - }) - }) - }) - - xit("filters the view by age over 10", () => { - cy.contains("Filter").click() - cy.contains("Add Filter").click() - - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(0).click() - cy.contains("age").click({ force: true }) - - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(1).click() - cy.contains("More Than").click({ force: true }) - - cy.get("input").type(18) - cy.contains("Save").click() - }) - - cy.get(interact.SPECTRUM_TABLE_ROW).get($values => { - expect($values).to.have.length(5) - }) - }) - - xit("creates a stats calculation view based on age", () => { - cy.wait(1000) - cy.contains("Calculate").click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(0).click() - cy.contains("Statistics").click() - - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(1).click() - cy.contains("age").click({ force: true }) - - cy.get(interact.SPECTRUM_BUTTON).contains("Save").click({ force: true }) - }) - - cy.wait(1000) - cy.get(".table-wrapper").within(() => { - cy.get(interact.TITLE).then($headers => { - expect($headers).to.have.length(7) - const headers = Array.from($headers).map(header => - header.textContent.trim() - ) - expect(removeSpacing(headers)).to.deep.eq([ - "field", - "sum", - "min", - "max", - "count", - "sumsqr", - "avg", - ]) - }) - }) - cy.get(interact.SPECTRUM_TABLE_CELL).then($values => { - let values = Array.from($values).map(header => header.textContent.trim()) - expect(values).to.deep.eq(["age", "155", "20", "49", "5", "5347", "31"]) - }) - }) - - xit("groups the view by group", () => { - cy.contains("Group by").click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get(interact.SPECTRUM_PICKER_LABEL).eq(0).click() - cy.contains("group").click() - cy.contains("Save").click() - }) - cy.wait(1000) - cy.contains("Students").should("be.visible") - cy.contains("Teachers").should("be.visible") - - cy.get(interact.SPECTRUM_TABLE_CELL).then($values => { - let values = Array.from($values).map(header => header.textContent.trim()) - expect(values).to.deep.eq([ - "Students", - "70", - "20", - "25", - "3", - "1650", - "23.333333333333332", - "Teachers", - "85", - "36", - "49", - "2", - "3697", - "42.5", - ]) - }) - }) - - xit("renames a view", () => { - cy.contains(interact.NAV_ITEM, "Test View") - .find(".actions .icon.open-popover") - .click({ force: true }) - cy.get(interact.SPECTRUM_MENU_ITEM_LABEL).contains("Edit").click() - cy.get(interact.MODAL_INNER_WRAPPER).within(() => { - cy.get("input").type(" Updated") - cy.contains("Save").click() - }) - cy.wait(1000) - cy.contains("Test View Updated").should("be.visible") - }) - - it("deletes a view", () => { - cy.contains(interact.NAV_ITEM, "Test View Updated") - .find(".actions .icon.open-popover") - .click({ force: true }) - cy.contains("Delete").click() - cy.contains("Delete View").click() - cy.wait(500) - cy.contains("TestView Updated").should("not.exist") - }) - }) - - function removeSpacing(headers) { - let newHeaders = [] - for (let header of headers) { - newHeaders.push(header.replace(/\s\s+/g, " ")) - } - return newHeaders - } -}) diff --git a/packages/builder/cypress/integration/customThemingProperties.spec.js b/packages/builder/cypress/integration/customThemingProperties.spec.js deleted file mode 100644 index e9de0985d0..0000000000 --- a/packages/builder/cypress/integration/customThemingProperties.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -import filterTests from "../support/filterTests" - -filterTests(['all'], () => { - xcontext("Custom Theming Properties", () => { - before(() => { - cy.login() - cy.createTestApp() - cy.navigateToFrontend() - }) - - /* Default Values: - Button roundness = Large - Accent colour = Blue 600 - Accent colour (hover) = Blue 500 - Navigation bar background colour = Gray 100 - Navigation bar text colour = Gray 800 */ - it("should reset the color property values", () => { - // Open Theme modal and change colours - cy.get(".spectrum-ActionButton-label").contains("Theme").click() - cy.get(".spectrum-Picker").contains("Large").click() - .parents() - .get(".spectrum-Menu-itemLabel").contains("None").click() - changeThemeColors() - // Reset colours - cy.get(".spectrum-Button-label").contains("Reset").click({force: true}) - // Check values have reset - checkThemeColorDefaults() - }) - - /* Button Roundness Values: - None = 0 - Small = 4px - Medium = 8px - Large = 16px */ - it("should test button roundness", () => { - const buttonRoundnessValues = ["0", "4px", "8px", "16px"] - // Add button, change roundness and confirm value - cy.addComponent("Button", null).then((componentId) => { - buttonRoundnessValues.forEach(function (item, index){ - cy.get(".spectrum-ActionButton-label").contains("Theme").click() - cy.get(".setting").contains("Button roundness").parent() - .get(".select-wrapper").click() - cy.get(".spectrum-Popover").find('li').eq(index).click() - cy.get(".spectrum-Button").contains("View changes").click({force: true}) - cy.reload() - cy.getComponent(componentId) - .parents(".svelte-xiqd1c").eq(0).should('have.attr', 'style').and('contains', `--buttonBorderRadius:${item}`) - }) - }) - }) - - const changeThemeColors = () => { - // Changes the theme colours - cy.get(".spectrum-FieldLabel").contains("Accent color") - .parent().find(".container.svelte-z3cm5a").click() - .find('[title="Red 400"]').click() - cy.get(".spectrum-FieldLabel").contains("Accent color (hover)") - .parent().find(".container.svelte-z3cm5a").click() - .find('[title="Orange 400"]').click() - cy.get(".spectrum-FieldLabel").contains("Navigation bar background color") - .parent().find(".container.svelte-z3cm5a").click() - .find('[title="Yellow 400"]').click() - cy.get(".spectrum-FieldLabel").contains("Navigation bar text color") - .parent().find(".container.svelte-z3cm5a").click() - .find('[title="Green 400"]').click() - } - - const checkThemeColorDefaults = () => { - cy.get(".spectrum-FieldLabel").contains("Accent color") - .parent().find(".container.svelte-z3cm5a").click() - .get('[title="Blue 600"]').children().find('[aria-label="Checkmark"]') - cy.get(".spectrum-Dialog-grid").click() - cy.get(".spectrum-FieldLabel").contains("Accent color (hover)") - .parent().find(".container.svelte-z3cm5a").click() - .get('[title="Blue 500"]').children().find('[aria-label="Checkmark"]') - cy.get(".spectrum-Dialog-grid").click() - cy.get(".spectrum-FieldLabel").contains("Navigation bar background color") - .parent().find(".container.svelte-z3cm5a").click() - .get('[title="Gray 100"]').children().find('[aria-label="Checkmark"]') - cy.get(".spectrum-Dialog-grid").click() - cy.get(".spectrum-FieldLabel").contains("Navigation bar text color") - .parent().find(".container.svelte-z3cm5a").click() - .get('[title="Gray 800"]').children().find('[aria-label="Checkmark"]') - } - }) -}) diff --git a/packages/builder/cypress/integration/datasources/datasourceWizard.spec.js b/packages/builder/cypress/integration/datasources/datasourceWizard.spec.js deleted file mode 100644 index 837a433951..0000000000 --- a/packages/builder/cypress/integration/datasources/datasourceWizard.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../support/filterTests" - -filterTests(['all'], () => { - xcontext("Datasource Wizard", () => { - if (Cypress.env("TEST_ENV")) { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should navigate in and out of a datasource via wizard", () => { - // Select PostgreSQL and add config (without fetch) - const datasource = "Oracle" - cy.selectExternalDatasource(datasource) - cy.addDatasourceConfig(datasource, true) - - // Navigate back within datasource wizard - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Back").click({ force: true }) - }) - - // Select PostgreSQL datasource again - cy.get(".item-list", { timeout: 1000 }).contains(datasource).click() - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - }) - - // Fetch tables after selection - // Previously entered config should not have been saved - // Config is back to default values - // Modal will close and provide 500 error - cy.intercept('**/datasources').as('datasourceConnection') - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Save and fetch tables").click({ force: true }) - }) - cy.wait("@datasourceConnection") - cy.get("@datasourceConnection").its('response.body') - .should('have.property', 'status', 500) - }) - } - }) -}) diff --git a/packages/builder/cypress/integration/datasources/mySql.spec.js b/packages/builder/cypress/integration/datasources/mySql.spec.js deleted file mode 100644 index 11370a9bf3..0000000000 --- a/packages/builder/cypress/integration/datasources/mySql.spec.js +++ /dev/null @@ -1,229 +0,0 @@ -import filterTests from "../../support/filterTests" - -filterTests(["all"], () => { - xcontext("MySQL Datasource Testing", () => { - if (Cypress.env("TEST_ENV")) { - before(() => { - cy.login() - cy.createTestApp() - }) - const datasource = "MySQL" - const queryName = "Cypress Test Query" - const queryRename = "CT Query Rename" - - it("Should add MySQL datasource without configuration", () => { - // Select MySQL datasource - cy.selectExternalDatasource(datasource) - // Attempt to fetch tables without applying configuration - cy.intercept("**/datasources").as("datasource") - cy.get(".spectrum-Button") - .contains("Save and fetch tables") - .click({ force: true }) - cy.wait(500) - // Intercept Request after button click & apply assertions - cy.wait("@datasource") - cy.get("@datasource") - .its("response.body") - .should( - "have.property", - "message", - "connect ECONNREFUSED 127.0.0.1:3306" - ) - cy.get("@datasource") - .its("response.body") - .should("have.property", "status", 500) - cy.get(".spectrum-Button").contains("Skip table fetch").click({ force: true }) - }) - - it("should add MySQL datasource and fetch tables", () => { - // Add & configure MySQL datasource - cy.selectExternalDatasource(datasource) - cy.intercept("**/datasources").as("datasource") - cy.addDatasourceConfig(datasource) - // Check response from datasource after adding configuration - cy.wait("@datasource") - cy.get("@datasource").its("response.statusCode").should("eq", 200) - // Confirm fetch tables was successful - cy.get(".spectrum-Table") - .eq(0) - .find(".spectrum-Table-row") - .its("length") - .should("be.gt", 0) - }) - - it("should check table fetching error", () => { - // MySQL test datasource contains tables without primary keys - cy.get(".spectrum-InLineAlert") - .should("contain", "Error fetching tables") - .and("contain", "No primary key constraint found") - }) - - it("should define a One relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("One").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - }) - // Save relationship & reload page - cy.get(".spectrum-ButtonGroup").within(() => { - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - }) - cy.reload() - - // Confirm table length & column name - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 1) - cy.get(".spectrum-Table-cell").should("contain", "COUNTRIES to REGIONS") - }) - - it("should define a Many relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("Many").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("LOCATIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("COUNTRY_ID").click() - cy.get(".spectrum-Picker").eq(5).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - // Save relationship & reload page - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.reload() - cy.wait(1000) - }) - // Confirm table length & relationship name - cy.get(".spectrum-Table", { timeout: 1000 }) - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 2) - cy.get(".spectrum-Table-cell").should( - "contain", - "LOCATIONS through COUNTRIES → REGIONS" - ) - }) - - it("should delete relationships", () => { - // Delete both relationships - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") - .eq(1) - .within(() => { - cy.get(".spectrum-Table-cell").eq(0).click({ force: true }) - }) - cy.get(".spectrum-Dialog-grid", { timeout: 500 }).within(() => { - cy.get(".spectrum-Button") - .contains("Delete") - .click({ force: true }) - }) - cy.reload() - cy.wait(500) - } - // Confirm relationships no longer exist - cy.get(".spectrum-Body").should( - "contain", - "No relationships configured" - ) - }) - }) - - it("should add a query", () => { - // Add query - cy.get(".spectrum-Button").contains("Add query").click({ force: true }) - cy.get(".spectrum-Form-item") - .eq(0) - .within(() => { - cy.get("input").type(queryName) - }) - // Insert Query within Fields section - cy.get(".CodeMirror textarea") - .eq(0) - .type("SELECT * FROM books", { force: true }) - // Intercept query execution - cy.intercept("**/queries/preview").as("query") - cy.get(".spectrum-Button").contains("Run Query").click({ force: true }) - cy.wait(500) - cy.wait("@query") - // Assert against Status Code & Body - cy.get("@query").its("response.statusCode").should("eq", 200) - cy.get("@query").its("response.body").should("not.be.empty") - // Save query - cy.intercept("POST", "**/queries").as("saveQuery") - cy.get(".spectrum-Button").contains("Save Query").click({ force: true }) - cy.wait("@saveQuery") - cy.get("@saveQuery").its("response.statusCode").should("eq", 200) - cy.get(".nav-item").should("contain", queryName) - }) - - it("should duplicate a query", () => { - /// Get query nav item - QueryName - cy.get(".nav-item") - .contains(queryName) - .parent() - .within(() => { - cy.get(".spectrum-Icon").eq(1).click({ force: true }) - }) - // Select and confirm duplication - cy.get(".spectrum-Menu").contains("Duplicate").click() - cy.get(".nav-item").should("contain", queryName + " (1)") - }) - - it("should edit a query name", () => { - // Rename query - cy.get(".spectrum-Form-item") - .eq(0) - .within(() => { - cy.get("input").clear().type(queryRename) - }) - // Click on a nav item - cy.get(".nav-item").first().click() - // Confirm name change - cy.get(".nav-item").should("contain", queryRename) - }) - - it("should delete a query", () => { - // Get query nav item - QueryName - cy.get(".nav-item") - .contains(queryRename) - .parent() - .within(() => { - cy.get(".spectrum-Icon").eq(1).click({ force: true }) - }) - // Select Delete - cy.get(".spectrum-Menu").contains("Delete").click() - cy.get(".spectrum-Button") - .contains("Delete Query") - .click({ force: true }) - // Confirm deletion - cy.get(".nav-item", { timeout: 1000 }).should("not.contain", queryRename) - }) - } - }) -}) diff --git a/packages/builder/cypress/integration/datasources/oracle.spec.js b/packages/builder/cypress/integration/datasources/oracle.spec.js deleted file mode 100644 index ae1ca5cd75..0000000000 --- a/packages/builder/cypress/integration/datasources/oracle.spec.js +++ /dev/null @@ -1,229 +0,0 @@ -import filterTests from "../../support/filterTests" - -filterTests(["all"], () => { - xcontext("Oracle Datasource Testing", () => { - if (Cypress.env("TEST_ENV")) { - before(() => { - cy.login() - cy.createTestApp() - }) - const datasource = "Oracle" - const queryName = "Cypress Test Query" - const queryRename = "CT Query Rename" - - it("Should add Oracle datasource and skip table fetch", () => { - // Select Oracle datasource - cy.selectExternalDatasource(datasource) - // Skip table fetch - no config added - cy.get(".spectrum-Button") - .contains("Skip table fetch") - .click({ force: true }) - cy.wait(500) - // Confirm config contains localhost - cy.get(".spectrum-Textfield-input", { timeout: 500 }) - .eq(1) - .should("have.value", "localhost") - // Add another Oracle datasource, configure & skip table fetch - cy.selectExternalDatasource(datasource) - cy.addDatasourceConfig(datasource, true) - // Confirm config and no tables - cy.get(".spectrum-Textfield-input") - .eq(1) - .should("have.value", Cypress.env("oracle").HOST) - cy.get(".spectrum-Body").eq(2).should("contain", "No tables found.") - }) - - it("Should add Oracle datasource and fetch tables without configuration", () => { - // Select Oracle datasource - cy.selectExternalDatasource(datasource) - // Attempt to fetch tables without applying configuration - cy.intercept("**/datasources").as("datasource") - cy.get(".spectrum-Button") - .contains("Save and fetch tables") - .click({ force: true }) - // Intercept Request after button click & apply assertions - cy.wait("@datasource") - cy.get("@datasource") - .its("response.body") - .should("have.property", "status", 500) - cy.get(".spectrum-Button").contains("Skip table fetch").click({ force: true }) - }) - - xit("should add Oracle datasource and fetch tables", () => { - // Add & configure Oracle datasource - cy.selectExternalDatasource(datasource) - cy.intercept("**/datasources").as("datasource") - cy.addDatasourceConfig(datasource) - // Check response from datasource after adding configuration - cy.wait("@datasource") - cy.get("@datasource").its("response.statusCode").should("eq", 200) - // Confirm fetch tables was successful - cy.get(".spectrum-Table") - .eq(0) - .find(".spectrum-Table-row") - .its("length") - .should("be.gt", 0) - }) - - xit("should define a One relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("One").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - // Save relationship & reload page - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.reload() - }) - // Confirm table length & column name - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 1) - cy.get(".spectrum-Table-cell").should("contain", "COUNTRIES to REGIONS") - }) - - xit("should define a Many relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("Many").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("LOCATIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("COUNTRY_ID").click() - cy.get(".spectrum-Picker").eq(5).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - // Save relationship & reload page - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.reload() - }) - // Confirm table length & relationship name - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 2) - cy.get(".spectrum-Table-cell").should( - "contain", - "LOCATIONS through COUNTRIES → REGIONS" - ) - }) - - xit("should delete relationships", () => { - // Delete both relationships - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") - .eq(1) - .within(() => { - cy.get(".spectrum-Table-row").eq(0).click() - }) - cy.get(".spectrum-Dialog-grid", { timeout: 500 }).within(() => { - cy.get(".spectrum-Button") - .contains("Delete") - .click({ force: true }) - }) - cy.reload() - } - // Confirm relationships no longer exist - cy.get(".spectrum-Body").should( - "contain", - "No relationships configured" - ) - }) - }) - - xit("should add a query", () => { - // Add query - cy.get(".spectrum-Button").contains("Add query").click({ force: true }) - cy.get(".spectrum-Form-item") - .eq(0) - .within(() => { - cy.get("input").type(queryName) - }) - // Insert Query within Fields section - cy.get(".CodeMirror textarea") - .eq(0) - .type("SELECT * FROM JOBS", { force: true }) - // Intercept query execution - cy.intercept("**/queries/preview").as("query") - cy.get(".spectrum-Button").contains("Run Query").click({ force: true }) - cy.wait(500) - cy.wait("@query") - // Assert against Status Code & Body - cy.get("@query").its("response.statusCode").should("eq", 200) - cy.get("@query").its("response.body").should("not.be.empty") - // Save query - cy.get(".spectrum-Button").contains("Save Query").click({ force: true }) - cy.get(".nav-item").should("contain", queryName) - }) - - xit("should duplicate a query", () => { - // Get query nav item - cy.get(".nav-item") - .contains(queryName) - .parent() - .within(() => { - cy.get(".spectrum-Icon").eq(1).click({ force: true }) - }) - // Select and confirm duplication - cy.get(".spectrum-Menu").contains("Duplicate").click() - cy.get(".nav-item").should("contain", queryName + " (1)") - }) - - xit("should edit a query name", () => { - // Rename query - cy.get(".spectrum-Form-item") - .eq(0) - .within(() => { - cy.get("input").clear().type(queryRename) - }) - // Save query - cy.get(".spectrum-Button").contains("Save Query").click({ force: true }) - cy.get(".nav-item").should("contain", queryRename) - }) - - xit("should delete a query", () => { - // Get query nav item - QueryName - cy.get(".nav-item") - .contains(queryName) - .parent() - .within(() => { - cy.get(".spectrum-Icon").eq(1).click({ force: true }) - }) - - // Select Delete - cy.get(".spectrum-Menu").contains("Delete").click() - cy.get(".spectrum-Button") - .contains("Delete Query") - .click({ force: true }) - - // Confirm deletion - cy.get(".nav-item", { timeout: 1000 }).should("not.contain", queryName) - }) - } - }) -}) diff --git a/packages/builder/cypress/integration/datasources/postgreSql.spec.js b/packages/builder/cypress/integration/datasources/postgreSql.spec.js deleted file mode 100644 index e1aa0ff128..0000000000 --- a/packages/builder/cypress/integration/datasources/postgreSql.spec.js +++ /dev/null @@ -1,283 +0,0 @@ -import filterTests from "../../support/filterTests" - -filterTests(["all"], () => { - xcontext("PostgreSQL Datasource Testing", () => { - if (Cypress.env("TEST_ENV")) { - before(() => { - cy.login() - cy.createTestApp() - }) - const datasource = "PostgreSQL" - const queryName = "Cypress Test Query" - const queryRename = "CT Query Rename" - - xit("Should add PostgreSQL datasource without configuration", () => { - // Select PostgreSQL datasource - cy.selectExternalDatasource(datasource) - // Attempt to fetch tables without applying configuration - cy.intercept("**/datasources").as("datasource") - cy.get(".spectrum-Button") - .contains("Save and fetch tables") - .click({ force: true }) - // Intercept Request after button click & apply assertions - cy.wait("@datasource") - cy.get("@datasource") - .its("response.body") - .should("have.property", "status", 500) - cy.get(".spectrum-Button").contains("Skip table fetch").click({ force: true }) - }) - - it("should add PostgreSQL datasource and fetch tables", () => { - // Add & configure PostgreSQL datasource - cy.selectExternalDatasource(datasource) - cy.intercept("**/datasources").as("datasource") - cy.addDatasourceConfig(datasource) - // Check response from datasource after adding configuration - cy.wait("@datasource") - cy.get("@datasource").its("response.statusCode").should("eq", 200) - cy.wait(2000) - // Confirm fetch tables was successful - cy.get(".spectrum-Table") - .eq(0) - .find(".spectrum-Table-row") - .its("length") - .should("be.gt", 0) - }) - - it("should define a One relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("One").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - // Save relationship & reload page - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.reload() - }) - // Confirm table length & column name - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 1) - cy.get(".spectrum-Table-cell").should("contain", "COUNTRIES to REGIONS") - }) - - it("should define a Many relationship type", () => { - // Select relationship type & configure - cy.get(".spectrum-Button") - .contains("Define relationship") - .click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Picker").eq(0).click() - cy.get(".spectrum-Popover").contains("Many").click() - cy.get(".spectrum-Picker").eq(1).click() - cy.get(".spectrum-Popover").contains("LOCATIONS").click() - cy.get(".spectrum-Picker").eq(2).click() - cy.get(".spectrum-Popover").contains("REGIONS").click() - cy.get(".spectrum-Picker").eq(3).click() - cy.get(".spectrum-Popover").contains("COUNTRIES").click() - cy.get(".spectrum-Picker").eq(4).click() - cy.get(".spectrum-Popover").contains("COUNTRY_ID").click() - cy.get(".spectrum-Picker").eq(5).click() - cy.get(".spectrum-Popover").contains("REGION_ID").click() - // Save relationship & reload page - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.reload() - }) - // Confirm table length & relationship name - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 2) - cy.get(".spectrum-Table-cell").should( - "contain", - "LOCATIONS through COUNTRIES → REGIONS" - ) - }) - - it("should delete a relationship", () => { - cy.get(".hierarchy-items-container").contains("PostgreSQL").click({ force: true }) - cy.reload() - // Delete one relationship - cy.get(".spectrum-Table") - .eq(1) - .within(() => { - cy.get(".spectrum-Table-cell").eq(0).click({ force: true }) - }) - cy.get(".spectrum-Dialog-grid", { timeout: 500 }).within(() => { - cy.get(".spectrum-Button").contains("Delete").click({ force: true }) - }) - cy.reload() - cy.wait(500) - // Confirm relationship was deleted - cy.get(".spectrum-Table") - .eq(1) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 1) - }) - - it("should add a query", () => { - // Add query - cy.get(".spectrum-Button").contains("Add query").click({ force: true }) - cy.get(".spectrum-Form-item") - .eq(0) - .within(() => { - cy.get("input").type(queryName) - }) - // Insert Query within Fields section - cy.get(".CodeMirror textarea") - .eq(0) - .type("SELECT * FROM books", { force: true }) - // Intercept query execution - cy.intercept("**/queries/preview").as("query") - cy.get(".spectrum-Button").contains("Run Query").click({ force: true }) - cy.wait(500) - cy.wait("@query") - // Assert against Status Code & Body - cy.get("@query").its("response.statusCode").should("eq", 200) - cy.get("@query").its("response.body").should("not.be.empty") - // Save query - cy.intercept("**/queries").as("saveQuery") - cy.get(".spectrum-Button").contains("Save Query").click({ force: true }) - cy.wait("@saveQuery") - cy.get(".spectrum-Tabs-content", { timeout: 2000 }).should("contain", queryName) - }) - - it("should switch to schema with no tables", () => { - // Switch Schema - To one without any tables - cy.get(".hierarchy-items-container").contains("PostgreSQL").click({ force: true }) - switchSchema("randomText") - - // No tables displayed - cy.get(".spectrum-Body", { timeout: 10000 }).eq(2, { timeout: 10000 }).should("contain", "No tables found") - - // Previously created query should be visible - cy.get(".spectrum-Table").should("contain", queryName) - }) - - it("should switch schemas", () => { - // Switch schema - To one with tables - switchSchema("1") - - // Confirm tables exist - Check for specific one - cy.get(".spectrum-Table", { timeout: 20000 }).eq(0).should("contain", "test") - cy.get(".spectrum-Table") - .eq(0) - .find(".spectrum-Table-row") - .its("length") - .should("eq", 1) - - // Confirm specific table visible within left nav bar - cy.get(".hierarchy-items-container").should("contain", "test") - - // Switch back to public schema - switchSchema("public") - - // Confirm tables exist - again - cy.get(".spectrum-Table", { timeout: 20000 }).eq(0).should("contain", "REGIONS") - cy.get(".spectrum-Table") - .eq(0) - .find(".spectrum-Table-row") - .its("length") - .should("be.gt", 1) - - // Confirm specific table visible within left nav bar - cy.get(".hierarchy-items-container").should("contain", "REGIONS") - - // No relationships and one query - cy.get(".spectrum-Body") - .eq(3) - .should("contain", "No relationships configured.") - cy.get(".spectrum-Table").eq(1).should("contain", queryName) - }) - - it("should duplicate a query", () => { - // Locate previously created query - cy.get(".nav-item") - .contains(queryName) - .siblings(".actions") - .within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - // Select and confirm duplication - cy.get(".spectrum-Menu").contains("Duplicate").click() - cy.get(".nav-item").should("contain", queryName + " (1)") - }) - - it("should edit a query name", () => { - // Access query - cy.get(".hierarchy-items-container", { timeout: 2000 }) - //.contains(queryName + " (1)") - .contains(queryName) - .click({ force: true }) - - // Rename query - cy.wait(1000) - cy.get(".spectrum-Form-item", { timeout: 2000 }) - .eq(0) - .within(() => { - cy.get("input").clear().type(queryRename) - }) - - // Click on a nav item and confirm name change - cy.get(".nav-item").first().click() - // Confirm name change - cy.get(".nav-item").should("contain", queryRename) - }) - - it("should delete a query", () => { - // Get query nav item - QueryName - cy.get(".nav-item") - .contains(queryRename) - .parent() - .within(() => { - cy.get(".spectrum-Icon").eq(1).click({ force: true }) - }) - // Select Delete - cy.get(".spectrum-Menu").contains("Delete").click() - cy.get(".spectrum-Button") - .contains("Delete Query") - .click({ force: true }) - // Confirm deletion - cy.reload() - cy.get(".nav-item", { timeout: 30000 }).contains(datasource).click({ force: true }) - cy.get(".nav-item", { timeout: 1000 }).should("not.contain", queryRename) - }) - - const switchSchema = schema => { - // Edit configuration - Change Schema - cy.get(".spectrum-Textfield") - .eq(6) - .within(() => { - cy.get("input").clear().type(schema) - }) - // Save configuration & fetch - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.get(".spectrum-Button") - .contains("Fetch tables") - .click({ force: true }) - // Click fetch tables again within modal - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button") - .contains("Fetch tables") - .click({ force: true }) - }) - cy.reload() - cy.wait(1000) - } - } - }) -}) diff --git a/packages/builder/cypress/integration/datasources/rest.spec.js b/packages/builder/cypress/integration/datasources/rest.spec.js deleted file mode 100644 index 7f715ae50c..0000000000 --- a/packages/builder/cypress/integration/datasources/rest.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import filterTests from "../../support/filterTests" - -filterTests(["smoke", "all"], () => { - xcontext("REST Datasource Testing", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - const datasource = "REST" - const restUrl = "https://api.openbrewerydb.org/breweries" - - it("Should add REST datasource with incorrect API", () => { - // Select REST datasource - cy.selectExternalDatasource(datasource) - // Enter incorrect api & attempt to send query - cy.get(".query-buttons", { timeout: 1000 }).contains("Add query").click({ force: true }) - cy.intercept("**/preview").as("queryError") - cy.get("input").clear().type("random text") - cy.get(".spectrum-Button").contains("Send").click({ force: true }) - // Intercept Request after button click & apply assertions - cy.wait("@queryError") - cy.get("@queryError") - .its("response.body") - .should("have.property", "message", "Invalid URL: http://random text") - cy.get("@queryError") - .its("response.body") - .should("have.property", "status", 400) - }) - - it("should add and configure a REST datasource", () => { - // Select REST datasource and create query - cy.selectExternalDatasource(datasource) - cy.wait(500) - // createRestQuery confirms query creation - cy.createRestQuery("GET", restUrl, "/breweries") - // Confirm status code response within REST datasource - cy.get(".stats", { timeout: 1000 }).within(() => { - cy.get(".spectrum-FieldLabel") - .eq(0) - .should("contain", 200) - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/queryLevelTransformers.spec.js b/packages/builder/cypress/integration/queryLevelTransformers.spec.js deleted file mode 100644 index 7357bbe905..0000000000 --- a/packages/builder/cypress/integration/queryLevelTransformers.spec.js +++ /dev/null @@ -1,147 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require("../support/interact") - -filterTests(["smoke", "all"], () => { - context("Query Level Transformers", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should write a transformer function", () => { - // Add REST datasource - contains API for breweries - const datasource = "REST" - const restUrl = "https://api.openbrewerydb.org/breweries" - cy.selectExternalDatasource(datasource) - cy.createRestQuery("GET", restUrl, "breweries") - cy.reload() - cy.contains(".nav-item-content", "breweries", { timeout: 20000 }).click() - cy.contains(interact.SPECTRUM_TABS_ITEM, "Transformer", { timeout: 5000 }).click({ force: true }) - // Get Transformer Function from file - cy.readFile("cypress/support/queryLevelTransformerFunction.js").then( - transformerFunction => { - cy.get(interact.CODEMIRROR_TEXTAREA, { timeout: 5000 }) - // Highlight current text and overwrite with file contents - .type(Cypress.platform === "darwin" ? "{cmd}a" : "{ctrl}a", { - force: true, - }) - .type(transformerFunction, { parseSpecialCharSequences: false }) - } - ) - // Send Query - cy.intercept("**/queries/preview").as("query") - cy.get(interact.SPECTRUM_BUTTON).contains("Save").click({ force: true }) - cy.get(interact.SPECTRUM_BUTTON).contains("Send").click({ force: true }) - cy.wait("@query") - // Assert against Status Code, body, & body rows - cy.get("@query").its("response.statusCode").should("eq", 200) - cy.get("@query").its("response.body").should("not.be.empty") - cy.get("@query").its("response.body.rows").should("not.be.empty") - }) - - it("should add data to the previous query", () => { - // Add REST datasource - contains API for breweries - const datasource = "REST" - const restUrl = "https://api.openbrewerydb.org/breweries" - cy.selectExternalDatasource(datasource) - cy.createRestQuery("GET", restUrl, "breweries") - cy.reload() - cy.contains(".nav-item-content", "breweries", { timeout: 2000 }).click() - cy.contains(interact.SPECTRUM_TABS_ITEM, "Transformer", { timeout: 5000 }).click({ force: true }) - // Get Transformer Function with Data from file - cy.readFile( - "cypress/support/queryLevelTransformerFunctionWithData.js" - ).then(transformerFunction => { - //console.log(transformerFunction[1]) - cy.get(interact.CODEMIRROR_TEXTAREA) - // Highlight current text and overwrite with file contents - .type(Cypress.platform === "darwin" ? "{cmd}a" : "{ctrl}a", { - force: true, - }) - .type(transformerFunction, { parseSpecialCharSequences: false }) - }) - // Send Query - cy.intercept("**/queries/preview").as("query") - cy.get(interact.SPECTRUM_BUTTON).contains("Send").click({ force: true }) - cy.wait("@query") - // Assert against Status Code, body, & body rows - cy.get("@query").its("response.statusCode").should("eq", 200) - cy.get("@query").its("response.body").should("not.be.empty") - cy.get("@query").its("response.body.rows").should("not.be.empty") - }) - - it("should run an invalid query within the transformer section", () => { - // Add REST datasource - contains API for breweries - const datasource = "REST" - const restUrl = "https://api.openbrewerydb.org/breweries" - cy.selectExternalDatasource(datasource) - cy.createRestQuery("GET", restUrl, "breweries") - cy.reload() - cy.contains(".nav-item-content", "breweries", { timeout: 10000 }).click() - cy.contains(interact.SPECTRUM_TABS_ITEM, "Transformer", { timeout: 5000 }).click({ force: true }) - // Clear the code box and add "test" - cy.get(interact.CODEMIRROR_TEXTAREA) - .type(Cypress.platform === "darwin" ? "{cmd}a" : "{ctrl}a", { - force: true, - }) - .type("test") - // Run Query and intercept - cy.intercept("**/preview").as("queryError") - cy.get(interact.SPECTRUM_BUTTON).contains("Send").click({ force: true }) - cy.wait("@queryError") - cy.wait(500) - // Assert against message and status for the query error - cy.get("@queryError") - .its("response.body") - .should("have.property", "message", "test is not defined") - cy.get("@queryError") - .its("response.body") - .should("have.property", "status", 400) - }) - - xit("should run an invalid query via POST request", () => { - // POST request with transformer as null - cy.request({ - method: "POST", - url: `${Cypress.config().baseUrl}/api/queries/`, - body: { - fields: { headers: {}, queryString: null, path: null }, - parameters: [], - schema: {}, - name: "test", - queryVerb: "read", - transformer: null, - datasourceId: "test", - }, - // Expected 400 error - Transformer must be a string - failOnStatusCode: false, - }).then(response => { - expect(response.status).to.equal(400) - expect(response.body.message).to.include( - 'Invalid body - "transformer" must be a string' - ) - }) - }) - - xit("should run an empty query", () => { - // POST request with Transformer as an empty string - cy.request({ - method: "POST", - url: `${Cypress.config().baseUrl}/api/queries/preview`, - body: { - fields: { headers: {}, queryString: null, path: null }, - queryVerb: "read", - transformer: "", - datasourceId: "test", - }, - // Expected 400 error - Transformer is not allowed to be empty - failOnStatusCode: false, - }).then(response => { - expect(response.status).to.equal(400) - expect(response.body.message).to.include( - 'Invalid body - "transformer" is not allowed to be empty' - ) - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/renameAnApplication.spec.js b/packages/builder/cypress/integration/renameAnApplication.spec.js deleted file mode 100644 index 6e432e476b..0000000000 --- a/packages/builder/cypress/integration/renameAnApplication.spec.js +++ /dev/null @@ -1,112 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require("../support/interact") - -filterTests(["all"], () => { - xcontext("Rename an App", () => { - beforeEach(() => { - cy.login() - cy.createTestApp() - }) - - it("should rename an unpublished application", () => { - const appName = "Cypress Tests" - const appRename = "Cypress Renamed" - // Rename app, Search for app, Confirm name was changed - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - renameApp(appName, appRename) - cy.reload() - cy.searchForApplication(appRename) - cy.get(interact.APP_TABLE).find(interact.TITLE).should("have.length", 1) - cy.applicationInAppTable(appRename) - // Set app name back to Cypress Tests - cy.reload() - renameApp(appRename, appName) - }) - - xit("Should rename a published application", () => { - // It is not possible to rename a published application - const appName = "Cypress Tests" - const appRename = "Cypress Renamed" - // Publish the app - cy.get(interact.TOP_RIGHT_NAV) - cy.get(interact.SPECTRUM_BUTTON) - .contains("Publish") - .click({ force: true }) - cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { - // Click publish again within the modal - cy.get(interact.SPECTRUM_BUTTON) - .contains("Publish") - .click({ force: true }) - }) - // Rename app, Search for app, Confirm name was changed - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - renameApp(appName, appRename, true) - cy.get(interact.APP_TABLE).find(interact.WRAPPER).should("have.length", 1) - cy.applicationInAppTable(appRename) - }) - - it("Should try to rename an application to have no name", () => { - const appName = "Cypress Tests" - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - renameApp(appName, " ", false, true) - // Close modal and confirm name has not been changed - cy.get(interact.SPECTRUM_DIALOG_GRID, { timeout: 1000 }).contains("Cancel").click() - cy.applicationInAppTable(appName) - }) - - xit("Should create two applications with the same name", () => { - // It is not possible to have applications with the same name - const appName = "Cypress Tests" - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - cy.get(interact.SPECTRUM_BUTTON), { timeout: 500 } - .contains("Create app") - .click({ force: true }) - cy.contains(/Start from scratch/).click() - cy.get(interact.SPECTRUM_MODAL).within(() => { - cy.get("input").eq(0).type(appName) - cy.get(interact.SPECTRUM_BUTTON_GROUP) - .contains("Create app") - .click({ force: true }) - cy.get(interact.ERROR).should( - "have.text", - "Another app with the same name already exists" - ) - }) - }) - - it("should validate application names", () => { - // App name must be letters, numbers and spaces only - // This test checks numbers and special characters specifically - const appName = "Cypress Tests" - const numberName = 12345 - const specialCharName = "£$%^" - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 5000 }) - renameApp(appName, numberName) - cy.applicationInAppTable(numberName) - renameApp(numberName, specialCharName) - cy.get(interact.ERROR).should( - "have.text", - "App name must be letters, numbers and spaces only" - ) - // Set app name back to Cypress Tests - renameApp(numberName, appName) - }) - - const renameApp = (originalName, changedName, published, noName) => { - cy.searchForApplication(originalName) - cy.get(interact.APP_TABLE, { timeout: 1000 }).within(() => { - cy.get(".app-row-actions button") - .contains("Manage") - .eq(0) - .click({ force: true }) - }) - cy.get(".spectrum-Tabs-item").contains("Settings").click() - cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") - cy.get(".settings-tab").should("be.visible") - cy.get(".details-section .page-action button") - .contains("Edit") - .click({ force: true }) - cy.updateAppName(changedName, noName) - } - }) -}) diff --git a/packages/builder/cypress/integration/revertApp.spec.js b/packages/builder/cypress/integration/revertApp.spec.js deleted file mode 100644 index 2cd806b02c..0000000000 --- a/packages/builder/cypress/integration/revertApp.spec.js +++ /dev/null @@ -1,75 +0,0 @@ -import filterTests from "../support/filterTests" -const interact = require('../support/interact') - -filterTests(['smoke', 'all'], () => { - xcontext("Revert apps", () => { - before(() => { - cy.login() - cy.createTestApp() - }) - - it("should try to revert an unpublished app", () => { - // Click revert icon - cy.get(interact.TOP_RIGHT_NAV).within(() => { - cy.get(interact.AREA_LABEL_REVERT).click({ force: true }) - }) - cy.get(interact.SPECTRUM_MODAL).within(() => { - // Enter app name before revert - cy.get(interact.SPECTRUM_TEXTFIELD_INPUT).type("Cypress Tests") - cy.intercept('**/revert').as('revertApp') - // Click Revert - cy.get(interact.SPECTRUM_BUTTON).contains("Revert").click({ force: true }) - // Intercept Request after button click & apply assertions - cy.wait("@revertApp") - cy.get("@revertApp").its('response.body').should('have.property', 'message', "App has not yet been deployed") - cy.get("@revertApp").its('response.body').should('have.property', 'status', 400) - }) - }) - - it("should revert a published app", () => { - cy.navigateToFrontend() - - // Add initial component - Paragraph - cy.searchAndAddComponent("Paragraph") - // Publish app - cy.get(interact.SPECTRUM_BUTTON).contains("Publish").click({ force: true }) - cy.get(interact.SPECTRUM_BUTTON_GROUP).within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("Publish").click({ force: true }) - }) - cy.wait(1000) // Wait for next modal to finish loading - cy.get(interact.SPECTRUM_BUTTON_GROUP, { timeout: 1000 }).within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("Done").click({ force: true }) - }) - - // Add second component - Button - cy.searchAndAddComponent("Button") - // Click Revert - cy.get(interact.TOP_RIGHT_NAV).within(() => { - cy.get(interact.AREA_LABEL_REVERT).click({ force: true }) - }) - cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { - cy.get("input").type("Cypress Tests") - // Click Revert - cy.get(interact.SPECTRUM_BUTTON).contains("Revert").click({ force: true }) - cy.wait(2000) // Wait for app to finish reverting - }) - // Confirm Paragraph component is still visible - cy.get(interact.ROOT, { timeout: 1000 }).contains("New Paragraph") - // Confirm Button component is not visible - cy.get(interact.ROOT, { timeout: 1000 }).should("not.have.text", "New Button") - }) - - it("should enter incorrect app name when reverting", () => { - // Click Revert - cy.get(interact.TOP_RIGHT_NAV, { timeout: 1000 }).within(() => { - cy.get(interact.AREA_LABEL_REVERT).click({ force: true }) - }) - // Enter incorrect app name - cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { - cy.get("input").type("Cypress Tests") - // Revert button within modal should be disabled - cy.get(interact.SPECTRUM_BUTTON).eq(1).should('be.disabled') - }) - }) - }) -}) diff --git a/packages/builder/cypress/plugins/index.js b/packages/builder/cypress/plugins/index.js deleted file mode 100644 index 771ba886b5..0000000000 --- a/packages/builder/cypress/plugins/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/// -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -// eslint-disable-next-line no-unused-vars -module.exports = (on, config) => { - // `on` is used to hook into various events Cypress emits - // `config` is the resolved Cypress config - require("cypress-terminal-report/src/installLogsPrinter")(on) -} diff --git a/packages/builder/cypress/setup.js b/packages/builder/cypress/setup.js deleted file mode 100644 index 0e2f25b028..0000000000 --- a/packages/builder/cypress/setup.js +++ /dev/null @@ -1,45 +0,0 @@ -const cypressConfig = require("../cypress.json") - -// normal development system -const SERVER_PORT = cypressConfig.env.PORT -const WORKER_PORT = cypressConfig.env.WORKER_PORT - -if (!process.env.NODE_ENV) { - process.env.NODE_ENV = "cypress" -} -process.env.ENABLE_ANALYTICS = "0" -process.env.JWT_SECRET = cypressConfig.env.JWT_SECRET -process.env.SELF_HOSTED = 1 -process.env.WORKER_URL = `http://localhost:${WORKER_PORT}/` -process.env.APPS_URL = `http://localhost:${SERVER_PORT}/` -process.env.MINIO_URL = `http://localhost:4004` -process.env.MINIO_ACCESS_KEY = "budibase" -process.env.MINIO_SECRET_KEY = "budibase" -process.env.COUCH_DB_USER = "budibase" -process.env.COUCH_DB_PASSWORD = "budibase" -process.env.INTERNAL_API_KEY = "budibase" -process.env.ALLOW_DEV_AUTOMATIONS = 1 - -// Stop info logs polluting test outputs -process.env.LOG_LEVEL = "error" - -exports.run = ( - serverLoc = "../../server/dist", - workerLoc = "../../worker/dist" -) => { - // require("dotenv").config({ path: resolve(dir, ".env") }) - // don't make this a variable or top level require - // it will cause environment module to be loaded prematurely - - // override the port with the worker port temporarily - process.env.PORT = WORKER_PORT - require(workerLoc) - - // override the port with the server port - process.env.PORT = SERVER_PORT - require(serverLoc) -} - -if (require.main === module) { - exports.run() -} diff --git a/packages/builder/cypress/support/commands.js b/packages/builder/cypress/support/commands.js deleted file mode 100644 index e63fd41591..0000000000 --- a/packages/builder/cypress/support/commands.js +++ /dev/null @@ -1,945 +0,0 @@ -Cypress.on("uncaught:exception", () => { - return false -}) - -// ACCOUNTS & USERS -Cypress.Commands.add("login", (email, password) => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.url() - .should("include", "/builder/") - .then(url => { - if (url.includes("builder/admin")) { - // create admin user - cy.get("input").first().type("test@test.com") - cy.get('input[type="password"]').first().type("test") - cy.get('input[type="password"]').eq(1).type("test") - cy.contains("Create super admin user").click({ force: true }) - } - if (url.includes("builder/auth") || url.includes("builder/admin")) { - // login - cy.contains("Sign in to Budibase").then(() => { - if (email == null) { - cy.get("input").first().type("test@test.com") - cy.get('input[type="password"]').type("test") - } else { - cy.get("input").first().type(email) - cy.get('input[type="password"]').type(password) - } - cy.get("button").first().click({ force: true }) - cy.wait(1000) - }) - } - }) -}) - -Cypress.Commands.add("logOut", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.get(".user-dropdown .avatar > .icon").click({ force: true }) - cy.get(".spectrum-Popover[data-cy='user-menu']").within(() => { - cy.get("li[data-cy='user-logout']").click({ force: true }) - }) - cy.wait(2000) -}) - -Cypress.Commands.add("logoutNoAppGrid", () => { - // Logs user out when app grid is not present - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.get(".avatar > .icon").click({ force: true }) - cy.get(".spectrum-Popover[data-cy='user-menu']").within(() => { - cy.get(".spectrum-Menu-item").contains("Log out").click({ force: true }) - }) - cy.wait(2000) -}) - -Cypress.Commands.add("createUser", (email, permission) => { - cy.contains("Users").click() - cy.get(`[data-cy="add-user"]`).click() - cy.get(".spectrum-Dialog-grid").within(() => { - // Enter email - cy.get(".spectrum-Textfield-input").clear().click().type(email) - - // Select permission, if applicable - // Default is App User - if (permission != null) { - cy.get(".spectrum-Picker-label").click() - cy.get(".spectrum-Menu").within(() => { - cy.get(".spectrum-Menu-item") - .contains(permission) - .click({ force: true }) - }) - } - // Add user - cy.get(".spectrum-Button").contains("Add users").click({ force: true }) - cy.get(".spectrum-ActionButton").contains("Add email").should("not.exist") - }) - // Onboarding modal - cy.get(".spectrum-Dialog-grid", { timeout: 5000 }).contains( - "Choose your onboarding" - ) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".onboarding-type").eq(1).click() - cy.get(".spectrum-Button").contains("Done").click({ force: true }) - cy.get(".spectrum-Button").contains("Cancel").should("not.exist") - }) - - // Accounts created modal - Click Done button - cy.get(".spectrum-Button").contains("Done").click({ force: true }) -}) - -Cypress.Commands.add("deleteUser", email => { - // Assumes user has access to Users section - cy.contains("Users", { timeout: 2000 }).click() - cy.contains(email).click() - - cy.get(".title").within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - cy.get(".spectrum-Menu").within(() => { - cy.get(".spectrum-Menu-item").contains("Delete").click({ force: true }) - }) - cy.get(".spectrum-Dialog-grid").contains("Delete user").click({ force: true }) -}) - -Cypress.Commands.add("updateUserInformation", (firstName, lastName) => { - cy.get(".user-dropdown .icon", { timeout: 2000 }).click({ - force: true, - }) - - cy.get(".spectrum-Popover[data-cy='user-menu']").within(() => { - cy.get("li[data-cy='user-info']").click({ force: true }) - }) - - cy.get(".spectrum-Modal.is-open").within(() => { - cy.get("[data-cy='user-first-name']").clear() - - if (!firstName || firstName == "") { - cy.get("[data-cy='user-first-name']").invoke("val").should("be.empty") - } else { - cy.get("[data-cy='user-first-name']") - .type(firstName) - .should("have.value", firstName) - .blur() - } - - cy.get("[data-cy='user-last-name']").clear() - - if (!lastName || lastName == "") { - cy.get("[data-cy='user-last-name']").invoke("val").should("be.empty") - } else { - cy.get("[data-cy='user-last-name']") - .type(lastName) - .should("have.value", lastName) - .blur() - } - cy.get(".confirm-wrap").within(() => { - cy.get("button").contains("Save").click({ force: true }) - }) - cy.get(".spectrum-Dialog-grid").should("not.exist") - }) -}) - -Cypress.Commands.add("setUserRole", (user, role) => { - cy.contains("Users").click() - cy.contains(user).click() - - // Set Role - cy.wait(500) - cy.get(".spectrum-Form-itemField") - .eq(3) - .within(() => { - cy.get(".spectrum-Picker-label").click({ force: true }) - }) - cy.get(".spectrum-Menu").within(() => { - cy.get(".spectrum-Menu-itemLabel").contains(role).click({ force: true }) - }) - cy.get(".spectrum-Form-itemField").eq(3).should("contain", role) -}) - -// APPLICATIONS -Cypress.Commands.add("createTestApp", () => { - const appName = "Cypress Tests" - cy.deleteApp(appName) - cy.createApp(appName, "This app is used for Cypress testing.") -}) - -Cypress.Commands.add("createApp", (name, addDefaultTable) => { - const shouldCreateDefaultTable = - typeof addDefaultTable != "boolean" ? true : addDefaultTable - - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.url({ timeout: 30000 }).should("include", "/apps") - cy.get(`[data-cy="create-app-btn"]`, { timeout: 5000 }).click({ force: true }) - - // If apps already exist - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`, { - timeout: 5000, - }) - .its("body") - .then(val => { - if (val.length > 0) { - cy.get(`[data-cy="create-app-btn"]`, { timeout: 5000 }).click({ - force: true, - }) - } - }) - - cy.get(".spectrum-Modal").within(() => { - cy.get("input").eq(0).should("have.focus") - if (name && name != "") { - cy.get("input").eq(0).clear() - cy.get("input").eq(0).type(name).should("have.value", name).blur() - } - cy.get(".spectrum-ButtonGroup") - .contains("Create app") - .click({ force: true }) - cy.wait(2000) - }) - if (shouldCreateDefaultTable) { - cy.createTable("Cypress Tests", true) - } -}) - -Cypress.Commands.add("deleteApp", name => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.wait(2000) - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - const findAppName = val.some(val => val.name == name) - if (findAppName) { - if (val.length > 0) { - const appId = val.reduce((acc, app) => { - if (name === app.name) { - acc = app.appId - } - return acc - }, "") - - if (appId == "") { - return - } - - // Go to app overview - const appIdParsed = appId.split("_").pop() - const actionEleId = `[data-cy=row_actions_${appIdParsed}]` - cy.get(actionEleId).click() - cy.get(`[aria-label="ShowMenu"]`).click() - cy.get(".spectrum-Menu").within(() => { - cy.contains("Overview").click() - }) - - cy.wait(500) - - // Unpublish first if needed - cy.get(`[data-cy="app-status"]`).then($status => { - if ($status.text().includes("- Unpublish")) { - // Exact match for Unpublish - cy.contains("Unpublish").click({ force: true }) - cy.get(".spectrum-Modal").within(() => { - cy.contains("Unpublish app").click({ force: true }) - }) - } - }) - - // Delete app - cy.get(".app-overview-actions-icon").within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - cy.get(".spectrum-Menu").contains("Delete").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get("input").type(name) - }) - cy.get(".spectrum-Button--warning").click() - } else { - return - } - } else { - return - } - }) -}) - -Cypress.Commands.add("deleteAllApps", () => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.wait(500) - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`, { - timeout: 5000, - }) - .its("body") - .then(val => { - for (let i = 0; i < val.length; i++) { - cy.deleteApp(val[i].name) - cy.reload() - } - }) -}) - -Cypress.Commands.add("unlockApp", unlock_config => { - let config = { ...unlock_config } - - cy.get(".spectrum-Modal .spectrum-Dialog[data-cy='app-lock-modal']") - .should("be.visible") - .within(() => { - if (config.owned) { - cy.get(".spectrum-Dialog-heading").contains("Locked by you") - cy.get(".lock-expiry-body").contains( - "This lock will expire in 10 minutes from now" - ) - - cy.intercept("**/lock").as("unlockApp") - cy.get(".spectrum-Button") - .contains("Release Lock") - .click({ force: true }) - cy.wait("@unlockApp") - cy.get("@unlockApp").its("response.statusCode").should("eq", 200) - cy.get("@unlockApp").its("response.body").should("deep.equal", { - message: "Lock released successfully.", - }) - } else { - //Show the name ? - cy.get(".lock-expiry-body").should("not.be.visible") - cy.get(".spectrum-Button").contains("Done") - } - }) -}) - -Cypress.Commands.add("updateAppName", (changedName, noName) => { - cy.get(".spectrum-Modal").within(() => { - if (noName == true) { - cy.get("input").clear() - cy.get(".spectrum-Dialog-grid") - .click() - .contains("App name must be letters, numbers and spaces only") - return cy - } - cy.get("input").clear() - cy.get("input") - .eq(0) - .type(changedName) - .should("have.value", changedName) - .blur() - cy.get(".spectrum-ButtonGroup").contains("Save").click({ force: true }) - cy.wait(500) - }) -}) - -Cypress.Commands.add("publishApp", resolvedAppPath => { - // Assumes you have navigated to an application first - cy.get(".toprightnav button.spectrum-Button") - .contains("Publish") - .click({ force: true }) - - cy.get(".spectrum-Modal [data-cy='deploy-app-modal']") - .should("be.visible") - .within(() => { - cy.get(".spectrum-Button").contains("Publish").click({ force: true }) - cy.wait(1000) - }) - - // Verify that the app url is presented correctly to the user - cy.get(".spectrum-Modal [data-cy='deploy-app-success-modal']") - .should("be.visible") - .within(() => { - let appUrl = Cypress.config().baseUrl + "/app/" + resolvedAppPath - cy.get("[data-cy='deployed-app-url'] input").should("have.value", appUrl) - cy.get(".spectrum-Button").contains("Done").click({ force: true }) - }) -}) - -Cypress.Commands.add("alterAppVersion", (appId, version) => { - return cy - .request("put", `${Cypress.config().baseUrl}/api/applications/${appId}`, { - version: version || "0.0.1-alpha.0", - }) - .then(resp => { - expect(resp.status).to.eq(200) - }) -}) - -Cypress.Commands.add("importApp", (exportFilePath, name) => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length > 0) { - cy.get(`[data-cy="create-app-btn"]`).click({ force: true }) - } - cy.wait(500) - cy.get(`[data-cy="import-app-btn"]`).click({ - force: true, - }) - }) - - cy.get(".spectrum-Modal").within(() => { - cy.get("input").eq(1).should("have.focus") - - cy.get(".spectrum-Dropzone").selectFile(exportFilePath, { - action: "drag-drop", - }) - - cy.get(".gallery .filename").contains("exported-app.txt") - - if (name && name != "") { - cy.get("input").eq(0).type(name).should("have.value", name).blur() - } - cy.get(".confirm-wrap button") - .should("not.be.disabled") - .click({ force: true }) - cy.wait(3000) - }) -}) - -// Filters visible with 1 or more -Cypress.Commands.add("searchForApplication", appName => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.wait(2000) - - // No app filter functionality if only 1 app exists - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length < 2) { - return - } else { - // Searches for the app - cy.get(".spectrum-Search").then(() => { - cy.get(".spectrum-Textfield").within(() => { - cy.get("input").eq(0).clear({ force: true }) - cy.get("input").eq(0).type(appName, { force: true }) - }) - }) - } - }) -}) - -// Assumes there are no others -Cypress.Commands.add("applicationInAppTable", appName => { - cy.visit(`${Cypress.config().baseUrl}/builder`, { timeout: 30000 }) - cy.get(".app-table", { timeout: 30000 }).within(() => { - cy.get(".title").contains(appName).should("exist") - }) -}) - -Cypress.Commands.add("createAppFromScratch", appName => { - cy.get(`[data-cy="create-app-btn"]`) - .contains("Start from scratch") - .click({ force: true }) - cy.get(".spectrum-Modal").within(() => { - cy.get("input") - .eq(0) - .clear() - .type(appName) - .should("have.value", appName) - .blur() - cy.get(".spectrum-ButtonGroup").contains("Create app").click() - cy.wait(10000) - }) - cy.createTable("Cypress Tests", true) -}) - -// TABLES -Cypress.Commands.add("createTable", (tableName, initialTable) => { - // Creates an internal Budibase DB table - if (!initialTable) { - cy.navigateToDataSection() - } - cy.get(`[data-cy="new-datasource"]`, { timeout: 20000 }).click() - cy.wait(2000) - cy.get(".item", { timeout: 2000 }) - .contains("Budibase DB") - .click({ force: true }) - .then(() => { - cy.get(".spectrum-Button", { timeout: 2000 }) - .contains("Continue") - .click({ force: true }) - }) - cy.get(".spectrum-Modal").contains("Create Table", { timeout: 10000 }) - cy.get(".spectrum-Modal", { timeout: 2000 }).within(() => { - cy.get("input", { timeout: 2000 }).first().type(tableName).blur() - cy.get(".spectrum-ButtonGroup").contains("Create").click() - }) - // Ensure modal has closed and table is created - cy.get(".spectrum-Modal", { timeout: 2000 }).should("not.exist") - cy.get(".nav-item", { timeout: 2000 }) - .contains("Budibase DB") - .click({ force: true }) - cy.get(".nav-item-content", { timeout: 2000 }).should("contain", tableName) -}) - -Cypress.Commands.add("createTestTableWithData", () => { - cy.createTable("dog") - cy.addColumn("dog", "name", "Text") - cy.addColumn("dog", "age", "Number") -}) - -Cypress.Commands.add( - "addColumn", - (tableName, columnName, type, multiOptions = null) => { - // Select Table - cy.selectTable(tableName) - cy.contains(".nav-item", tableName).click() - cy.contains("Create column").click() - - // Configure column - cy.get(".spectrum-Modal").within(() => { - cy.get("input").first().type(columnName) - - // Unset table display column - cy.contains("display column").click({ force: true }) - cy.get(".spectrum-Picker-label").click() - cy.contains(type).click() - - // Add options for Multi-select Type - if (multiOptions !== null) { - cy.get(".spectrum-Textfield-input").eq(1).type(multiOptions) - } - - cy.contains("Save Column").click() - }) - } -) - -Cypress.Commands.add("addRow", values => { - cy.contains("Create row").click() - cy.get(".spectrum-Modal").within(() => { - for (let i = 0; i < values.length; i++) { - cy.get("input").eq(i).type(values[i]).blur() - } - cy.get(".spectrum-ButtonGroup").contains("Create").click() - }) -}) - -Cypress.Commands.add("addRowMultiValue", values => { - cy.contains("Create row").click() - cy.get(".spectrum-Modal").within(() => { - cy.get(".spectrum-Form-itemField") - .click() - .then(() => { - cy.get(".spectrum-Popover").within(() => { - for (let i = 0; i < values.length; i++) { - cy.get(".spectrum-Menu-item").eq(i).click() - } - }) - cy.get(".spectrum-Dialog-grid").click("top") - cy.get(".spectrum-ButtonGroup").contains("Create").click() - }) - }) -}) - -Cypress.Commands.add("selectTable", tableName => { - cy.get(".nav-item").contains("Budibase DB").click() - cy.contains(".nav-item", tableName).click() -}) - -Cypress.Commands.add("addCustomSourceOptions", totalOptions => { - cy.get('[data-cy="customOptions-prop-control"]').within(() => { - cy.get(".spectrum-ActionButton-label").click({ force: true }) - }) - for (let i = 0; i < totalOptions; i++) { - // Add radio button options - cy.get(".spectrum-Button-label", { timeout: 1000 }) - .contains("Add Option") - .click({ force: true }) - .then(() => { - cy.get("[placeholder='Label']", { timeout: 500 }).eq(i).type(i) - cy.get("[placeholder='Value']").eq(i).type(i) - }) - } - // Save options - cy.get(".spectrum-Button").contains("Save").click({ force: true }) -}) - -// DESIGN SECTION -Cypress.Commands.add("searchAndAddComponent", component => { - // Open component menu - cy.get(".icon-side-nav").within(() => { - cy.get(".icon-side-nav-item").eq(1).click() - }) - cy.get(".add-component > .spectrum-Button") - .contains("Add component") - .click({ force: true }) - cy.get(".container", { timeout: 1000 }).within(() => { - cy.get(".title").should("contain", "Add component") - - // Search and add component - cy.get(".spectrum-Textfield-input").clear().type(component) - cy.get(".body").within(() => { - cy.get(".component") - .contains(new RegExp("^" + component + "$"), { timeout: 3000 }) - .click({ force: true }) - }) - }) - cy.wait(1000) - cy.location().then(loc => { - const params = loc.pathname.split("/") - const componentId = params[params.length - 1] - cy.getComponent(componentId, { timeout: 3000 }).should("exist") - return cy.wrap(componentId) - }) -}) - -Cypress.Commands.add("deleteComponentByName", componentName => { - cy.get(".body") - .eq(0) - .contains(componentName) - .siblings(".actions") - .within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - cy.get(".spectrum-Menu").contains("Delete").click() - cy.get(".spectrum-Dialog").contains("Delete Component").click() -}) - -Cypress.Commands.add("addComponent", (category, component) => { - if (category) { - cy.get(`[data-cy="category-${category}"]`, { timeout: 3000 }).click({ - force: true, - }) - } - cy.wait(500) - if (component) { - cy.get(`[data-cy="component-${component}"]`, { timeout: 3000 }).click({ - force: true, - }) - } - cy.wait(1000) - cy.location().then(loc => { - const params = loc.pathname.split("/") - const componentId = params[params.length - 1] - cy.getComponent(componentId, { timeout: 3000 }).should("exist") - return cy.wrap(componentId) - }) -}) - -Cypress.Commands.add("getComponent", componentId => { - return cy - .get("iframe") - .its("0.contentDocument") - .should("exist") - .its("body") - .should("not.be.undefined") - .then(cy.wrap) - .find(`[data-id='${componentId}']`) -}) - -Cypress.Commands.add("createScreen", (route, accessLevelLabel) => { - // Blank Screen - cy.contains("Design").click() - cy.get(".spectrum-Button").contains("Add screen").click({ force: true }) - cy.get(".spectrum-Modal").within(() => { - cy.get("[data-cy='blank-screen']").click() - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - }) - cy.wait(500) - cy.get(".spectrum-Dialog-grid", { timeout: 500 }).within(() => { - cy.get(".spectrum-Form-itemField").eq(0).type(route) - cy.get(".confirm-wrap").contains("Continue").click({ force: true }) - }) - - cy.get(".spectrum-Modal", { timeout: 1000 }).within(() => { - if (accessLevelLabel) { - cy.get(".spectrum-Picker-label").click() - cy.wait(500) - cy.contains(accessLevelLabel).click() - } - cy.get(".spectrum-Button").contains("Done").click({ force: true }) - }) -}) - -Cypress.Commands.add( - "createDatasourceScreen", - (datasourceNames, accessLevelLabel) => { - cy.contains("Design").click() - cy.get(".spectrum-Button").contains("Add screen").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get("[data-cy='autogenerated-screens']").click() - cy.intercept("**/api/datasources").as("autoScreens") - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - cy.wait("@autoScreens") - cy.wait(5000) - }) - cy.get("[data-cy='autogenerated-screens']").should("not.exist") - cy.get("[data-cy='data-source-modal']", { timeout: 10000 }).within(() => { - for (let i = 0; i < datasourceNames.length; i++) { - cy.get(".data-source-entry") - .contains(datasourceNames[i], { timeout: 20000 }) - .click({ force: true }) - // Ensure the check mark is visible - cy.get(".data-source-entry") - .contains(datasourceNames[i]) - .get(".data-source-check", { timeout: 20000 }) - .should("exist") - } - - cy.get(".spectrum-Button").contains("Confirm").click({ force: true }) - }) - - cy.get(".spectrum-Modal", { timeout: 10000 }).within(() => { - if (accessLevelLabel) { - cy.get(".spectrum-Picker-label", { timeout: 10000 }).click() - cy.contains(accessLevelLabel).click() - } - cy.get(".spectrum-Button").contains("Done").click({ force: true }) - }) - - cy.contains("Design").click() - } -) - -Cypress.Commands.add( - "createAutogeneratedScreens", - (screenNames, accessLevelLabel) => { - cy.navigateToAutogeneratedModal() - - for (let i = 0; i < screenNames.length; i++) { - cy.get(".data-source-entry").contains(screenNames[i]).click() - } - - cy.get(".spectrum-Modal").within(() => { - if (accessLevelLabel) { - cy.get(".spectrum-Picker-label").click() - cy.wait(500) - cy.contains(accessLevelLabel).click() - } - cy.get(".spectrum-Button").contains("Confirm").click({ force: true }) - cy.wait(4000) - }) - } -) - -Cypress.Commands.add("filterScreensAccessLevel", accessLevel => { - // Filters screens by access level dropdown - cy.get(".body").within(() => { - cy.get(".spectrum-Form-item").eq(1).click() - }) - cy.get(".spectrum-Menu").within(() => { - cy.contains(accessLevel).click() - }) -}) - -Cypress.Commands.add("deleteScreen", screen => { - // Navigates to Design section and deletes specified screen - cy.contains("Design").click() - cy.get(".body").within(() => { - cy.contains(screen) - .siblings(".actions") - .within(() => { - cy.get(".spectrum-Icon").click({ force: true }) - }) - }) - cy.get(".spectrum-Menu > .spectrum-Menu-item > .spectrum-Menu-itemLabel") - .contains("Delete") - .click() - - cy.get( - ".spectrum-Dialog-grid > .spectrum-ButtonGroup > .confirm-wrap > .spectrum-Button" - ).click({ force: true }) - cy.get(".spectrum-Dialog-grid", { timeout: 10000 }).should("not.exist") -}) - -Cypress.Commands.add("deleteAllScreens", () => { - // Deletes all screens - cy.get(".body") - .find(".nav-item") - .its("length") - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".body > .nav-item") - .eq(0) - .invoke("text") - .then(text => { - cy.deleteScreen(text.trim()) - }) - } - }) -}) - -// NAVIGATION -Cypress.Commands.add("navigateToFrontend", () => { - // Clicks on Design tab and then the Home nav item - cy.wait(500) - cy.intercept("**/preview").as("preview") - cy.contains("Design").click() - cy.wait("@preview") - cy.get("@preview").then(res => { - if (res.statusCode != 200) { - cy.reload() - } - }) - cy.get(".spectrum-Search", { timeout: 20000 }).type("/") - cy.get(".nav-item", { timeout: 2000 }).contains("home").click({ force: true }) -}) - -Cypress.Commands.add("navigateToDataSection", () => { - // Clicks on the Data tab - cy.wait(500) - cy.contains("Data").click() -}) - -Cypress.Commands.add("navigateToAutogeneratedModal", () => { - // Screen name must already exist within datasource - cy.contains("Design").click() - cy.get(".spectrum-Button").contains("Add screen").click({ force: true }) - cy.get(".spectrum-Modal").within(() => { - cy.get(".item", { timeout: 2000 }) - .contains("Autogenerated screens") - .click({ force: true }) - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - cy.wait(500) - }) -}) - -// DATASOURCES -Cypress.Commands.add("selectExternalDatasource", datasourceName => { - // Navigates to Data Section - cy.navigateToDataSection() - // Open Datasource modal - cy.get(".container").within(() => { - cy.get("[data-cy='new-datasource']").click() - }) - // Clicks specified datasource & continue - cy.get(".item-list", { timeout: 1000 }).contains(datasourceName).click() - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - }) - cy.wait(500) -}) - -Cypress.Commands.add("addDatasourceConfig", (datasource, skipFetch) => { - // selectExternalDatasource should be called prior to this - // Adds the config for specified datasource & fetches tables - // Currently supports MySQL, PostgreSQL, Oracle - // Host IP Address - cy.get(".spectrum-Dialog-grid", { timeout: 500 }).within(() => { - cy.get(".form-row") - .eq(0) - .within(() => { - cy.get(".spectrum-Textfield").within(() => { - if (datasource == "Oracle") { - cy.get("input").clear().type(Cypress.env("oracle").HOST) - } else { - cy.get("input") - .clear({ force: true }) - .type(Cypress.env("HOST_IP"), { force: true }) - } - }) - }) - }) - // Database Name - cy.get(".spectrum-Dialog-grid").within(() => { - if (datasource == "MySQL") { - cy.get(".form-row") - .eq(4) - .within(() => { - cy.get("input").clear().type(Cypress.env("mysql").DATABASE) - }) - } else { - cy.get(".form-row") - .eq(2) - .within(() => { - if (datasource == "PostgreSQL") { - cy.get("input").clear().type(Cypress.env("postgresql").DATABASE) - } - if (datasource == "Oracle") { - cy.get("input").clear().type(Cypress.env("oracle").DATABASE) - } - }) - } - }) - // User - cy.get(".spectrum-Dialog-grid").within(() => { - if (datasource == "MySQL") { - cy.get(".form-row") - .eq(2) - .within(() => { - cy.get("input").clear().type(Cypress.env("mysql").USER) - }) - } else { - cy.get(".form-row") - .eq(3) - .within(() => { - if (datasource == "PostgreSQL") { - cy.get("input").clear().type(Cypress.env("postgresql").USER) - } - if (datasource == "Oracle") { - cy.get("input").clear().type(Cypress.env("oracle").USER) - } - }) - } - }) - // Password - cy.get(".spectrum-Dialog-grid").within(() => { - if (datasource == "MySQL") { - cy.get(".form-row") - .eq(3) - .within(() => { - cy.get("input").clear().type(Cypress.env("mysql").PASSWORD) - }) - } else { - cy.get(".form-row") - .eq(4) - .within(() => { - if (datasource == "PostgreSQL") { - cy.get("input").clear().type(Cypress.env("postgresql").PASSWORD) - } - if (datasource == "Oracle") { - cy.get("input").clear().type(Cypress.env("oracle").PASSWORD) - } - }) - } - }) - // Click to fetch tables - if (skipFetch) { - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button") - .contains("Skip table fetch") - .click({ force: true }) - }) - } else { - cy.intercept("**/tables").as("datasourceTables") - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button") - .contains("Save and fetch tables") - .click({ force: true }) - }) - // Wait for tables to be fetched - cy.wait("@datasourceTables", { timeout: 60000 }) - } -}) - -Cypress.Commands.add("createRestQuery", (method, restUrl, queryPrettyName) => { - // addExternalDatasource should be called prior to this - // Configures REST datasource & sends query - cy.get(".spectrum-Button", { timeout: 1000 }) - .contains("Add query") - .click({ force: true }) - // Select Method & add Rest URL - cy.get(".spectrum-Picker-label").eq(1).click() - cy.get(".spectrum-Menu").contains(method).click() - cy.get("input").clear().type(restUrl) - // Send query - cy.get(".spectrum-Button").contains("Send").click({ force: true }) - cy.get(".spectrum-Button", { timeout: 500 }) - .contains("Save") - .click({ force: true }) - cy.get(".hierarchy-items-container") - .should("contain", method) - .and("contain", queryPrettyName) -}) - -// MISC -Cypress.Commands.add("closeModal", () => { - cy.get(".spectrum-Modal", { timeout: 2000 }).within(() => { - cy.get(".close-icon").click() - }) - // Confirm modal has closed - cy.get(".spectrum-Modal", { timeout: 10000 }).should("not.exist") -}) - -Cypress.Commands.add("expandBudibaseConnection", () => { - if (Cypress.$(".nav-item > .content > .opened").length === 0) { - // expand the Budibase DB connection string - cy.get(".icon.arrow").eq(0).click() - } -}) diff --git a/packages/builder/cypress/support/cookies.js b/packages/builder/cypress/support/cookies.js deleted file mode 100644 index 3e2fba6481..0000000000 --- a/packages/builder/cypress/support/cookies.js +++ /dev/null @@ -1,3 +0,0 @@ -Cypress.Cookies.defaults({ - preserve: "budibase:auth", -}) diff --git a/packages/builder/cypress/support/filterTests.js b/packages/builder/cypress/support/filterTests.js deleted file mode 100644 index 074fd05d33..0000000000 --- a/packages/builder/cypress/support/filterTests.js +++ /dev/null @@ -1,16 +0,0 @@ -const filterTests = (testTags, runTest) => { - // testTags is an array of tags - // runTest is all tests - if (Cypress.env("TEST_TAGS")) { - const tags = Cypress.env("TEST_TAGS").split("/") - const found = testTags.some($testTags => tags.includes($testTags)) - - if (found) { - runTest() - } - } else { - runTest() - } -} - -export default filterTests diff --git a/packages/builder/cypress/support/index.js b/packages/builder/cypress/support/index.js deleted file mode 100644 index acd53a1592..0000000000 --- a/packages/builder/cypress/support/index.js +++ /dev/null @@ -1,22 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import "./commands" -import "./cookies" - -// Alternatively you can use CommonJS syntax: -// require('./commands') -require("cypress-terminal-report/src/installLogsCollector")() diff --git a/packages/builder/cypress/support/interact.js b/packages/builder/cypress/support/interact.js deleted file mode 100644 index 4f2451ce4b..0000000000 --- a/packages/builder/cypress/support/interact.js +++ /dev/null @@ -1,136 +0,0 @@ -// createApp test -export const CREATE_APP_BUTTON = '[data-cy="create-app-btn"]' -export const TEMPLATE_CATEGORY_FILTER = ".template-category-filters" -export const TEMPLATE_CATEGORY = ".template-categories" -export const APP_TABLE = ".appTable" -export const SPECTRUM_BUTTON_TEMPLATE = ".spectrum-Button" -export const TEMPLATE_CATEGORY_ACTIONGROUP = ".template-category" -export const TEMPLATE_CATEGORY_FILTER_ACTIONBUTTON = - ".template-category-filters .spectrum-ActionButton" -export const SPECTRUM_MODAL = ".spectrum-Modal" -export const APP_NAME_INPUT = "input" // we need to update this with atribute cy-data; -export const SPECTRUM_BUTTON_GROUP = ".spectrum-ButtonGroup" -export const SPECTRUM_MODAL_INPUT = ".spectrum-Modal input" - -//AddMultiOptionDatatype -export const CATEGORY_DATA = '[data-cy="category-Data"]' -export const COMPONENT_DATA_PROVIDER = '[data-cy="component-Data Provider"]' -export const DATASOURCE_PROP_CONTROL = '[data-cy="dataSource-prop-control"]' -export const DROPDOWN = ".dropdown" -export const SPECTRUM_PICKER_LABEL = ".spectrum-Picker-label" -export const DATASOURCE_FIELD_CONTROL = '[data-cy="field-prop-control"]' -export const OPTION_TYPE_PROP_CONTROL = '[data-cy="optionsType-prop-control' - -//AddRadioButtons -export const SPECTRUM_POPOVER = ".spectrum-Popover" -export const OPTION_SOURCE_PROP_CONROL = '[data-cy="optionsSource-prop-control' -export const APP_TABLE_STATUS = ".appTable .app-status" -export const APP_TABLE_ROW_ACTION = ".appTable .app-row-actions" -export const APP_TABLE_APP_NAME = '[data-cy="app-name-link"]' -export const DEPLOYMENT_TOP_NAV_GLOBESTRIKE = - ".deployment-top-nav svg[aria-label=GlobeStrike]" -export const DEPLOYMENT_TOP_GLOBE = ".deployment-top-nav svg[aria-label=Globe]" -export const PUBLISH_POPOVER_MENU = '[data-cy="publish-popover-menu"]' -export const PUBLISH_POPOVER_ACTION = '[data-cy="publish-popover-action"]' -export const PUBLISH_POPOVER_MESSAGE = ".publish-popover-message" -export const SPECTRUM_BUTTON = ".spectrum-Button" -export const SPECTRUM_LINK = ".spectrum-Link" -export const TOPRIGHTNAV_BUTTON_SPECTRUM = ".toprightnav button.spectrum-Button" - -//createComponents -export const SETTINGS = "[data-cy=Settings]" -export const SETTINGS_INPUT = "[data-cy=setting-text] input" -export const DESIGN = "[data-cy=Design]" -export const FONT_SIZE_PROP_CONTROL = "[data-cy=font-size-prop-control]" -export const DATA_CY_DATASOURCE = "[data-cy=setting-dataSource]" -export const DROPDOWN_CONTAINER = ".dropdown-container" -export const SPECTRUM_PICKER = ".spectrum-Picker" - -//autoScreens -export const LABEL_ADD_CIRCLE = "[aria-label=AddCircle]" -export const ITEM_DISABLED = ".item.disabled" -export const CONFIRM_WRAP_SPE_BUTTON = ".confirm-wrap .spectrum-Button" -export const DATA_SOURCE_ENTRY = ".data-source-entry" -export const BODY = ".body" - -//publishWorkFlow -export const DEPLOY_APP_MODAL = ".spectrum-Modal [data-cy=deploy-app-modal]" -export const DEPLOY_SUCCESS_MODAL = - ".spectrum-Modal [data-cy=deploy-app-success-modal]" -export const DEPLOY_APP_URL_INPUT = "[data-cy=deployed-app-url] input" -export const GLOBESTRIKE = "svg[aria-label=GlobeStrike]" -export const GLOBE = "svg[aria-label=Globe]" -export const UNPUBLISH_MODAL = "[data-cy=unpublish-modal]" -export const CONFIRM_WRAP_BUTTON = ".confirm-wrap button" -export const DEPLOYMENT_TOP_NAV = ".deployment-top-nav" - -//changeAppiconAndColour -export const APP_ROW_ACTION = ".app-row-actions-icon" -export const SPECTRUM_MENU = ".spectrum-Menu" -export const ICON_ITEM = ".icon-item" -export const FILL = ".fill" -export const COLOURSS = ".colors" -export const AREA_LABEL = "[aria-label]" -export const TITLE = ".title" -export const GRID = ".grid" -export const COLOUR = ".color" - -//createAutomation -export const ADD_BUTTON_SPECTRUM = ".add-button .spectrum-Icon" -export const MODAL_INNER_WRAPPER = ".modal-inner-wrapper" -export const SPECTRUM_BUTTON_CTA = ".spectrum-Button--cta" -export const SPECTRUM_TEXTFIELD_INPUT = ".spectrum-Textfield-input" - -//createTable -export const TABLE_TITLE_H1 = ".table-title h1" -export const TABLE_TITLE = ".title" -export const SPECTRUM_TABLE_EDIT = ".spectrum-Table-editIcon > use" -export const SPECTRUM_SWITCH_INPUT = ".spectrum-Switch-input" -export const SPECTRUM_CHECKBOX_INPUT = ".spectrum-Checkbox-input" -export const SPECTRUM_PAGINATION = ".spectrum-Pagination" -export const SPECTRUM_ACTION_BUTTON = ".spectrum-ActionButton" -export const SPECTRUM_BODY_SECOND = ".spectrum-Body--secondary" -export const POPOVERS = ".popovers" -export const SPECTRUM_DIALOG_GRID = ".spectrum-Dialog-grid" -export const DELETE_COLUMN_CONFIRM = '[data-cy="delete-column-confirm"]' -export const NAV_ITEM = ".nav-item" -export const ACTION_SPECTRUM_ICON = ".actions .spectrum-Icon" -export const SPECTRUM_MENU_CHILD2 = ".spectrum-Menu > :nth-child(2)" -export const DELETE_TABLE_CONFIRM = '[data-cy="delete-table-confirm"]' - -//adminAndManagement Folder -export const SPECTRUM_TABLE = ".spectrum-Table" -export const SPECTRUM_SIDENAV = ".spectrum-SideNav" -export const SPECTRUM_TABLE_ROW = ".spectrum-Table-row" -export const SPECTRUM_TABLE_CELL = ".spectrum-Table-cell" -export const FIELD = ".field" -export const CONTAINER = ".container" -export const REGENERATE = ".regenerate" -export const SPECTRUM_DIALOG_CONTENT = ".spectrum-Dialog-content" -export const SPECTRUM_ICON = ".spectrum-Icon" -export const SPECTRUM_HEADING = ".spectrum-Heading" -export const SPECTRUM_FORM_ITEMFIELD = ".spectrum-Form-itemField" -export const LIST_ITEMS = ".list-items" - -//createView -export const SPECTRUM_MENU_ITEM_LABEL = ".spectrum-Menu-itemLabel" - -//revertApp -export const TOP_RIGHT_NAV = ".toprightnav" -export const AREA_LABEL_REVERT = "[aria-label=Revert]" -export const ROOT = ".root" - -//queryLevelTransformers -export const SPECTRUM_TABS_ITEM = ".spectrum-Tabs-itemLabel" -export const CODEMIRROR_TEXTAREA = ".CodeMirror textarea" - -//renameApplication -export const WRAPPER = ".wrapper" -export const ERROR = ".error" -export const AREA_LABEL_MORE = "[aria-label=More]" -export const APP_ROW_ACTION_MENU_POPOVER = - '[data-cy="app-row-actions-menu-popover"]' -export const SPECTRUM_MENU_ITEM = ".spectrum-Menu-item" - -//commands -export const HOME_LOGO = ".home-logo" diff --git a/packages/builder/cypress/support/queryLevelTransformerFunction.js b/packages/builder/cypress/support/queryLevelTransformerFunction.js deleted file mode 100644 index 7dc05018f8..0000000000 --- a/packages/builder/cypress/support/queryLevelTransformerFunction.js +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -const breweries = data -const totals = {} - -for (let brewery of breweries) - {const state = brewery.state - if (totals[state] == null) - {totals[state] = 1 - } else - {totals[state]++ - } -} -const entries = Object.entries(totals) -return entries.map(([state, count]) => ({ state, count })) diff --git a/packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js b/packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js deleted file mode 100644 index fcf50b4412..0000000000 --- a/packages/builder/cypress/support/queryLevelTransformerFunctionWithData.js +++ /dev/null @@ -1,31 +0,0 @@ -/* eslint-disable */ -const breweries = data -const totals = {} -for (let brewery of breweries) - {const state = brewery.state - if (totals[state] == null) - {totals[state] = 1 - } else - {totals[state]++ - } -} -const stateCodes = - {texas: "tx", - colorado: "co", - florida: "fl", - iwoa: "ia", - louisiana: "la", - california: "ca", - pennsylvania: "pa", - georgia: "ga", - "new hampshire": "nh", - virginia: "va", - michigan: "mi", - maryland: "md", - ohio: "oh", -} -const entries = Object.entries(totals) -return entries.map(([state, count]) => - {stateCodes[state.toLowerCase()] - return { state, count, flag: "http://flags.ox3.in/svg/us/${stateCode}.svg" } -}) diff --git a/packages/builder/cypress/ts/setup.ts b/packages/builder/cypress/ts/setup.ts deleted file mode 100644 index b6b12bf730..0000000000 --- a/packages/builder/cypress/ts/setup.ts +++ /dev/null @@ -1,4 +0,0 @@ -// @ts-ignore -import { run } from "../setup" - -run("../../server/src/index", "../../worker/src/index") From 4b20eb8e7ec5d6a7b4a4109afb578ce8bf645e31 Mon Sep 17 00:00:00 2001 From: Budibase Release Bot <> Date: Tue, 31 Jan 2023 16:49:44 +0000 Subject: [PATCH 200/386] Update pro version to 2.2.25 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index a96a33a5b8..b4434d0513 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "^2.2.25", "@budibase/client": "^2.2.25", - "@budibase/pro": "2.2.24", + "@budibase/pro": "2.2.25", "@budibase/string-templates": "^2.2.25", "@budibase/types": "^2.2.25", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 6576ea789a..c2fb3c26b0 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1273,13 +1273,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.24.tgz#147139525357e6191afd39201ef0b835176acdde" - integrity sha512-sYxGsrPuKtN29x1BG34MrQJAOYJEaeL5aH6d2+QAhiSJM057megYckRr/OsUsy7ui0DDNUgOKfqi1warlfQknA== +"@budibase/backend-core@2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.25.tgz#893ba0be13d6681a74bc1d648cbadcb083d03ec7" + integrity sha512-QJQ2HfJ7x+w4W9hx9WJssN7gSLi8a3Lf5A3VriH+57echOZWYLIQhcnSiFt/AWALLGMjugUFnqPGmgdgY58ETg== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "^2.2.24" + "@budibase/types" "^2.2.25" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-sdk "2.1030.0" @@ -1372,13 +1372,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.24.tgz#b9b48f32a236fdfe0592759461cd97225bc1a2ff" - integrity sha512-LBo/FF0unKBmorhAx7jLDf5BJ6pQVymCzGG82b+gYUQD89A4ox8UKO8DcxCo03e89RLrHSIWcaRsbQ7Og7BvWQ== +"@budibase/pro@2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.25.tgz#f4b265c0435e6e05690d05959109518a742e3d22" + integrity sha512-78ioGU7v9PftIel9DfBj2CW6GtvrWuk5ZZP6vELQh3bB7b8nlY0EuQzbmIizmFnO1xn4Ceahkv1qs7XGjiNbUA== dependencies: - "@budibase/backend-core" "2.2.24" - "@budibase/types" "2.2.24" + "@budibase/backend-core" "2.2.25" + "@budibase/types" "2.2.25" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1402,10 +1402,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.24", "@budibase/types@^2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.24.tgz#d72e02ff04d40fb4947c22dc9c95e55abf6effcf" - integrity sha512-iOtRxGaqhlBbC0vGqxpUFZk+xLXeYnjGHJ3jOJAJ101SYPXDJX9HDo3WOkHNWy7XyF/02zRyl3/gac/da04uKg== +"@budibase/types@2.2.25", "@budibase/types@^2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.25.tgz#0701dff01883b2bcfb7f432413c9ff5ca217e3c7" + integrity sha512-jIvrsaxxFRbnayPTYxmLr/9pSjxW7XIXJfTC7Cc5VfaDerrDj+W8gpy8HNg6MucNlPasTuMDAu3/m6JKZ8P5Fg== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index ad5e9dc17d..bce8ef6218 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "^2.2.25", - "@budibase/pro": "2.2.24", + "@budibase/pro": "2.2.25", "@budibase/string-templates": "^2.2.25", "@budibase/types": "^2.2.25", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index 2e3ab78145..b1ddf7f50e 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -470,13 +470,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.24.tgz#147139525357e6191afd39201ef0b835176acdde" - integrity sha512-sYxGsrPuKtN29x1BG34MrQJAOYJEaeL5aH6d2+QAhiSJM057megYckRr/OsUsy7ui0DDNUgOKfqi1warlfQknA== +"@budibase/backend-core@2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.25.tgz#893ba0be13d6681a74bc1d648cbadcb083d03ec7" + integrity sha512-QJQ2HfJ7x+w4W9hx9WJssN7gSLi8a3Lf5A3VriH+57echOZWYLIQhcnSiFt/AWALLGMjugUFnqPGmgdgY58ETg== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "^2.2.24" + "@budibase/types" "^2.2.25" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-sdk "2.1030.0" @@ -519,22 +519,22 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.24.tgz#b9b48f32a236fdfe0592759461cd97225bc1a2ff" - integrity sha512-LBo/FF0unKBmorhAx7jLDf5BJ6pQVymCzGG82b+gYUQD89A4ox8UKO8DcxCo03e89RLrHSIWcaRsbQ7Og7BvWQ== +"@budibase/pro@2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.25.tgz#f4b265c0435e6e05690d05959109518a742e3d22" + integrity sha512-78ioGU7v9PftIel9DfBj2CW6GtvrWuk5ZZP6vELQh3bB7b8nlY0EuQzbmIizmFnO1xn4Ceahkv1qs7XGjiNbUA== dependencies: - "@budibase/backend-core" "2.2.24" - "@budibase/types" "2.2.24" + "@budibase/backend-core" "2.2.25" + "@budibase/types" "2.2.25" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" node-fetch "^2.6.1" -"@budibase/types@2.2.24", "@budibase/types@^2.2.24": - version "2.2.24" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.24.tgz#d72e02ff04d40fb4947c22dc9c95e55abf6effcf" - integrity sha512-iOtRxGaqhlBbC0vGqxpUFZk+xLXeYnjGHJ3jOJAJ101SYPXDJX9HDo3WOkHNWy7XyF/02zRyl3/gac/da04uKg== +"@budibase/types@2.2.25", "@budibase/types@^2.2.25": + version "2.2.25" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.25.tgz#0701dff01883b2bcfb7f432413c9ff5ca217e3c7" + integrity sha512-jIvrsaxxFRbnayPTYxmLr/9pSjxW7XIXJfTC7Cc5VfaDerrDj+W8gpy8HNg6MucNlPasTuMDAu3/m6JKZ8P5Fg== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From e90a3b08f4e67d9932f90dbdc32a78f6a096322c Mon Sep 17 00:00:00 2001 From: Mitch-Budibase Date: Tue, 31 Jan 2023 16:51:00 +0000 Subject: [PATCH 201/386] Updating builder/package.json Removing lines related to Cypress that we no longer need --- packages/builder/package.json | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/packages/builder/package.json b/packages/builder/package.json index 27ee30f56d..21e016ea09 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -9,20 +9,7 @@ "dev:builder": "routify -c dev:vite", "dev:vite": "vite --host 0.0.0.0", "rollup": "rollup -c -w", - "test": "jest", - "cy:setup": "ts-node ./cypress/ts/setup.ts", - "cy:setup:ci": "node ./cypress/setup.js", - "cy:open": "cypress open", - "cy:run": "cypress run", - "cy:run:ci": "cypress run --headed --browser chrome --spec cypress/integration/createApp.spec.js", - "cy:run:ci:record": "xvfb-run cypress run --headed --browser chrome --record", - "cy:test": "start-server-and-test cy:setup http://localhost:4100/builder cy:run", - "cy:ci": "start-server-and-test cy:setup:ci http://localhost:4100/builder cy:run:ci", - "cy:ci:record": "start-server-and-test cy:setup:ci http://localhost:4100/builder cy:run:ci:record; npm run cy:ci:report", - "cy:ci:report": "mochawesome-merge cypress/reports/*.json > cypress/reports/testReport.json && marge cypress/reports/testReport.json --reportDir cypress/reports --inline", - "cy:ci:notify": "node scripts/cypressResultsWebhook", - "cy:debug": "start-server-and-test cy:setup http://localhost:4100/builder cy:open", - "cy:debug:ci": "start-server-and-test cy:setup:ci http://localhost:4100/builder cy:open" + "test": "jest" }, "jest": { "globals": { @@ -124,4 +111,4 @@ "vite": "^3.0.8" }, "gitHead": "115189f72a850bfb52b65ec61d932531bf327072" -} +} \ No newline at end of file From abdd658012183b1e78509cb6ce49761bdb057557 Mon Sep 17 00:00:00 2001 From: adrinr Date: Tue, 31 Jan 2023 16:51:08 +0000 Subject: [PATCH 202/386] Prepopulate dbs --- .../server/src/tests/utilities/TestConfiguration.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/server/src/tests/utilities/TestConfiguration.ts b/packages/server/src/tests/utilities/TestConfiguration.ts index e6f8ac9c68..6726de5bca 100644 --- a/packages/server/src/tests/utilities/TestConfiguration.ts +++ b/packages/server/src/tests/utilities/TestConfiguration.ts @@ -11,7 +11,7 @@ mocks.licenses.useUnlimited() import { init as dbInit } from "../../db" dbInit() import env from "../../environment" -import { env as coreEnv } from "@budibase/backend-core" +import { db, env as coreEnv, StaticDatabases } from "@budibase/backend-core" import { basicTable, basicRow, @@ -151,7 +151,16 @@ class TestConfiguration { this.defaultUserValues = this.populateDefaultUserValues() if (context.isMultiTenant()) { this.tenantId = `tenant-${newid()}` - context.updateTenantId(this.tenantId) + } + + try { + // Prepopulate dbs to avoid race conditions + await db.getDB(StaticDatabases.PLATFORM_INFO.name).checkSetup() + await db.getDB(StaticDatabases.PLATFORM_INFO.docs.install).checkSetup() + } catch (err: any) { + if (err.status !== 409) { + throw err + } } if (!this.started) { From a8656c0f10d602aef896b3435269ac5aa95c834c Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 16:55:07 +0000 Subject: [PATCH 203/386] v2.2.12-alpha.51 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index 0360b2e821..b24e3bc52c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 81898f6d0b..f891756772 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.50", + "@budibase/types": "2.2.12-alpha.51", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 18092ae2a5..e3281c05fd 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.51", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index 27ee30f56d..a099c7324b 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.50", - "@budibase/client": "2.2.12-alpha.50", - "@budibase/frontend-core": "2.2.12-alpha.50", - "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/bbui": "2.2.12-alpha.51", + "@budibase/client": "2.2.12-alpha.51", + "@budibase/frontend-core": "2.2.12-alpha.51", + "@budibase/string-templates": "2.2.12-alpha.51", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 19fb9e4df8..627e80225d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.50", - "@budibase/string-templates": "2.2.12-alpha.50", - "@budibase/types": "2.2.12-alpha.50", + "@budibase/backend-core": "2.2.12-alpha.51", + "@budibase/string-templates": "2.2.12-alpha.51", + "@budibase/types": "2.2.12-alpha.51", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 79016b204e..992e107b63 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.50", - "@budibase/frontend-core": "2.2.12-alpha.50", - "@budibase/string-templates": "2.2.12-alpha.50", + "@budibase/bbui": "2.2.12-alpha.51", + "@budibase/frontend-core": "2.2.12-alpha.51", + "@budibase/string-templates": "2.2.12-alpha.51", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 3821337599..cb94e37af0 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.50", + "@budibase/bbui": "2.2.12-alpha.51", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 5b91148966..a0f714cd88 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index 94b5f563cf..5eba6f75d4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.50", - "@budibase/client": "2.2.12-alpha.50", + "@budibase/backend-core": "2.2.12-alpha.51", + "@budibase/client": "2.2.12-alpha.51", "@budibase/pro": "2.2.12-alpha.50", - "@budibase/string-templates": "2.2.12-alpha.50", - "@budibase/types": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.51", + "@budibase/types": "2.2.12-alpha.51", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 21ca20ad27..e268e5bd2a 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index d7b648264e..cc30804846 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index cb98ce525b..e3a5d43928 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.50", + "version": "2.2.12-alpha.51", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.50", + "@budibase/backend-core": "2.2.12-alpha.51", "@budibase/pro": "2.2.12-alpha.50", - "@budibase/string-templates": "2.2.12-alpha.50", - "@budibase/types": "2.2.12-alpha.50", + "@budibase/string-templates": "2.2.12-alpha.51", + "@budibase/types": "2.2.12-alpha.51", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From 4ed237ed836b19458e615616a2ca23e281d490af Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 16:58:46 +0000 Subject: [PATCH 204/386] Update pro version to 2.2.12-alpha.51 --- packages/server/package.json | 2 +- packages/server/yarn.lock | 30 +++++++++++++++--------------- packages/worker/package.json | 2 +- packages/worker/yarn.lock | 30 +++++++++++++++--------------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 5eba6f75d4..98a5c50463 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ "@apidevtools/swagger-parser": "10.0.3", "@budibase/backend-core": "2.2.12-alpha.51", "@budibase/client": "2.2.12-alpha.51", - "@budibase/pro": "2.2.12-alpha.50", + "@budibase/pro": "2.2.12-alpha.51", "@budibase/string-templates": "2.2.12-alpha.51", "@budibase/types": "2.2.12-alpha.51", "@bull-board/api": "3.7.0", diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index bdf6187969..16bddaef18 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1273,13 +1273,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.50.tgz#39f228904cf39de2dbb51900df4494267ac72381" - integrity sha512-ysVJ6Eul7o+LZRoilFr7bk1/gkoxSqM30yBbRhKxIhH2IOk0qd9LAaNQiTnwn4ZzU+tJWSkyAsJAQdTnX8/i9g== +"@budibase/backend-core@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.51.tgz#086dd2566be016683e5e3ae4ce8e8996aec35f7b" + integrity sha512-XWsiELOdi+292nTBT2rWz4vc2gs8YfRKKC2TE6a/4cc7kzuX/Sj88cY6l8wHYb1TVlMG+i9gLHRIxaI+w3cb9Q== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.50" + "@budibase/types" "2.2.12-alpha.51" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -1374,13 +1374,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.50.tgz#599edc75363b323f613a0d56e5173150582b13bb" - integrity sha512-eeKY9P4Zi81AlU6vYWVcffMwkyUrNv6PcNjdKZZNBuIgNfOVejy9vmpIukx43LpHUOsk6FKxHFNVDN1txnYRkg== +"@budibase/pro@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.51.tgz#a0b5dd3d5c023d147f008b0eda05bfa1bcdca56c" + integrity sha512-jBV92QxtQuABLACiLT7iWI9S/yesm+OUKqPAz5hSc9EfqRS4L8jP/OOxoEkhj9lK8vi7qbeHijlarna6JqNnRA== dependencies: - "@budibase/backend-core" "2.2.12-alpha.50" - "@budibase/types" "2.2.12-alpha.50" + "@budibase/backend-core" "2.2.12-alpha.51" + "@budibase/types" "2.2.12-alpha.51" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -1406,10 +1406,10 @@ svelte-apexcharts "^1.0.2" svelte-flatpickr "^3.1.0" -"@budibase/types@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.50.tgz#ef07d4593c1ea0da6a6b75004d1319d7621cd910" - integrity sha512-LU+G7gQffBvnLvWfzpxUNcrCZFP/ZNQqAjB2KJxgq9pfeynU3MWAwut1tjKpp8eduuu7GnfBT1uvet9jM87FKA== +"@budibase/types@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.51.tgz#2595094cb737397091744515e9b0a9141de5cba9" + integrity sha512-mzsPC8BLaUQwayfqLlv+Q2E986Axh429o+x3r2OhkfaoHyioiE3TBtI7hLHoBExGHm1tKycRQojkRnwcuWHbWQ== "@bull-board/api@3.7.0": version "3.7.0" diff --git a/packages/worker/package.json b/packages/worker/package.json index e3a5d43928..cc39afd0d0 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -37,7 +37,7 @@ "license": "GPL-3.0", "dependencies": { "@budibase/backend-core": "2.2.12-alpha.51", - "@budibase/pro": "2.2.12-alpha.50", + "@budibase/pro": "2.2.12-alpha.51", "@budibase/string-templates": "2.2.12-alpha.51", "@budibase/types": "2.2.12-alpha.51", "@koa/router": "8.0.8", diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock index d0a31fc49f..353fe2a698 100644 --- a/packages/worker/yarn.lock +++ b/packages/worker/yarn.lock @@ -470,13 +470,13 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/backend-core@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.50.tgz#39f228904cf39de2dbb51900df4494267ac72381" - integrity sha512-ysVJ6Eul7o+LZRoilFr7bk1/gkoxSqM30yBbRhKxIhH2IOk0qd9LAaNQiTnwn4ZzU+tJWSkyAsJAQdTnX8/i9g== +"@budibase/backend-core@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.2.12-alpha.51.tgz#086dd2566be016683e5e3ae4ce8e8996aec35f7b" + integrity sha512-XWsiELOdi+292nTBT2rWz4vc2gs8YfRKKC2TE6a/4cc7kzuX/Sj88cY6l8wHYb1TVlMG+i9gLHRIxaI+w3cb9Q== dependencies: "@budibase/nano" "10.1.1" - "@budibase/types" "2.2.12-alpha.50" + "@budibase/types" "2.2.12-alpha.51" "@shopify/jest-koa-mocks" "5.0.1" "@techpass/passport-openidconnect" "0.3.2" aws-cloudfront-sign "2.2.0" @@ -521,13 +521,13 @@ qs "^6.11.0" tough-cookie "^4.1.2" -"@budibase/pro@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.50.tgz#599edc75363b323f613a0d56e5173150582b13bb" - integrity sha512-eeKY9P4Zi81AlU6vYWVcffMwkyUrNv6PcNjdKZZNBuIgNfOVejy9vmpIukx43LpHUOsk6FKxHFNVDN1txnYRkg== +"@budibase/pro@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.2.12-alpha.51.tgz#a0b5dd3d5c023d147f008b0eda05bfa1bcdca56c" + integrity sha512-jBV92QxtQuABLACiLT7iWI9S/yesm+OUKqPAz5hSc9EfqRS4L8jP/OOxoEkhj9lK8vi7qbeHijlarna6JqNnRA== dependencies: - "@budibase/backend-core" "2.2.12-alpha.50" - "@budibase/types" "2.2.12-alpha.50" + "@budibase/backend-core" "2.2.12-alpha.51" + "@budibase/types" "2.2.12-alpha.51" "@koa/router" "8.0.8" bull "4.10.1" joi "17.6.0" @@ -535,10 +535,10 @@ lru-cache "^7.14.1" node-fetch "^2.6.1" -"@budibase/types@2.2.12-alpha.50": - version "2.2.12-alpha.50" - resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.50.tgz#ef07d4593c1ea0da6a6b75004d1319d7621cd910" - integrity sha512-LU+G7gQffBvnLvWfzpxUNcrCZFP/ZNQqAjB2KJxgq9pfeynU3MWAwut1tjKpp8eduuu7GnfBT1uvet9jM87FKA== +"@budibase/types@2.2.12-alpha.51": + version "2.2.12-alpha.51" + resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.2.12-alpha.51.tgz#2595094cb737397091744515e9b0a9141de5cba9" + integrity sha512-mzsPC8BLaUQwayfqLlv+Q2E986Axh429o+x3r2OhkfaoHyioiE3TBtI7hLHoBExGHm1tKycRQojkRnwcuWHbWQ== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" From 0164ca443b8de77b7bc67b381ad7aef5b7c52d86 Mon Sep 17 00:00:00 2001 From: Mitch-Budibase Date: Tue, 31 Jan 2023 17:05:41 +0000 Subject: [PATCH 205/386] Update smoke_test.yaml Removing Cypress from smoke_test.yaml file - No longer needed --- .github/workflows/smoke_test.yaml | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/.github/workflows/smoke_test.yaml b/.github/workflows/smoke_test.yaml index cffb914aaf..29c7f5f85a 100644 --- a/.github/workflows/smoke_test.yaml +++ b/.github/workflows/smoke_test.yaml @@ -18,30 +18,18 @@ jobs: - run: yarn - run: yarn bootstrap - run: yarn build - - name: Pull cypress.env.yaml from budibase-infra + - name: Pull from budibase-infra run: | curl -H "Authorization: token ${{ secrets.GH_PERSONAL_TOKEN }}" \ -H 'Accept: application/vnd.github.v3.raw' \ - -o packages/builder/cypress.env.json \ - -L https://api.github.com/repos/budibase/budibase-infra/contents/test/cypress.env.json - wc -l packages/builder/cypress.env.json - - - name: Cypress run - id: cypress - continue-on-error: true - uses: cypress-io/github-action@v2 - with: - record: true - install: false - tag: nightly - command: yarn test:e2e:ci:record - env: - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + -o + -L + wc -l - uses: actions/upload-artifact@v3 with: name: Test Reports - path: packages/builder/cypress/reports/testReport.html + path: # TODO: enable once running in QA test env # - name: Configure AWS Credentials @@ -54,11 +42,3 @@ jobs: # - name: Upload test results HTML # uses: aws-actions/configure-aws-credentials@v1 # run: aws s3 cp packages/builder/cypress/reports/testReport.html s3://{{ secrets.BUDI_QA_REPORTS_BUCKET_NAME }}/$GITHUB_RUN_ID/index.html - - - name: Cypress Discord Notify - run: yarn test:e2e:ci:notify - env: - CYPRESS_WEBHOOK_URL: ${{ secrets.BUDI_QA_WEBHOOK }} - CYPRESS_OUTCOME: ${{ steps.cypress.outcome }} - CYPRESS_DASHBOARD_URL: ${{ steps.cypress.outputs.dashboardUrl }} - GITHUB_RUN_URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID From 09ed767d0b28b3b85bc26e7bff3cfe58ffbbb986 Mon Sep 17 00:00:00 2001 From: Gerard Burns Date: Tue, 31 Jan 2023 17:18:22 +0000 Subject: [PATCH 206/386] New Help Menu (#9371) * New Help Menu * design PR feedback * Feedback updates * Feedback updates, font awesome enhancement, upgrade button hidden if licensing is disabled --------- Co-authored-by: Dean --- packages/builder/package.json | 3 + packages/builder/src/App.svelte | 2 - .../components/common/FontAwesomeIcon.svelte | 31 + .../src/components/common/HelpIcon.svelte | 42 - .../src/components/common/HelpMenu.svelte | 182 + .../portal/_components/UpgradeButton.svelte | 43 +- .../src/pages/builder/portal/_layout.svelte | 2 + packages/builder/yarn.lock | 4337 +++++++++++------ 8 files changed, 3091 insertions(+), 1551 deletions(-) create mode 100644 packages/builder/src/components/common/FontAwesomeIcon.svelte delete mode 100644 packages/builder/src/components/common/HelpIcon.svelte create mode 100644 packages/builder/src/components/common/HelpMenu.svelte diff --git a/packages/builder/package.json b/packages/builder/package.json index a099c7324b..2fa8c23776 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -75,6 +75,9 @@ "@budibase/client": "2.2.12-alpha.51", "@budibase/frontend-core": "2.2.12-alpha.51", "@budibase/string-templates": "2.2.12-alpha.51", + "@fortawesome/fontawesome-svg-core": "^6.2.1", + "@fortawesome/free-brands-svg-icons": "^6.2.1", + "@fortawesome/free-solid-svg-icons": "^6.2.1", "@sentry/browser": "5.19.1", "@spectrum-css/accordion": "^3.0.24", "@spectrum-css/page": "^3.0.1", diff --git a/packages/builder/src/App.svelte b/packages/builder/src/App.svelte index 04846e01bf..f31f45bb84 100644 --- a/packages/builder/src/App.svelte +++ b/packages/builder/src/App.svelte @@ -3,7 +3,6 @@ import { routes } from "../.routify/routes" import { NotificationDisplay, BannerDisplay } from "@budibase/bbui" import { parse, stringify } from "qs" - import HelpIcon from "components/common/HelpIcon.svelte" import LicensingOverlays from "components/portal/licensing/LicensingOverlays.svelte" const queryHandler = { parse, stringify } @@ -15,7 +14,6 @@
+ + + + + + + + + + + + + {#each rows as row} + + {#each Object.values(row) as value} + + {/each} + + {/each} + +
FIRST NAMELAST NAMEEMAILADDRESSCITYPOSTCODEPHONE
{value}
+
+

{rows[0].firstName}

+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ + diff --git a/packages/builder/src/pages/builder/portal/apps/onboarding/_components/NamePanel.svelte b/packages/builder/src/pages/builder/portal/apps/onboarding/_components/NamePanel.svelte new file mode 100644 index 0000000000..740cfda8f2 --- /dev/null +++ b/packages/builder/src/pages/builder/portal/apps/onboarding/_components/NamePanel.svelte @@ -0,0 +1,60 @@ + + +
+ + + + + + {#if url} +

{window.location.origin}/app/{url}

+ {:else} +

‎

+ {/if} + +
+ + diff --git a/packages/builder/src/pages/builder/portal/apps/onboarding/_components/PanelHeader.svelte b/packages/builder/src/pages/builder/portal/apps/onboarding/_components/PanelHeader.svelte new file mode 100644 index 0000000000..34d612dc9e --- /dev/null +++ b/packages/builder/src/pages/builder/portal/apps/onboarding/_components/PanelHeader.svelte @@ -0,0 +1,49 @@ + + +
+ +
+ {#if onBack} + + {/if} + {title} +
+ {subtitle} +
+ + diff --git a/packages/builder/src/pages/builder/portal/apps/onboarding/index.svelte b/packages/builder/src/pages/builder/portal/apps/onboarding/index.svelte new file mode 100644 index 0000000000..6df756f119 --- /dev/null +++ b/packages/builder/src/pages/builder/portal/apps/onboarding/index.svelte @@ -0,0 +1,202 @@ + + + + goToApp(appId)} + /> + + + + {#if stage === "name"} + (stage = "data")} /> + {:else if integrationsLoading} +

loading...

+ {:else if stage === "data"} + (stage = "name")}> +
+ handleCreateApp({ useSampleData: true })}> +
+
+ +
+ Budibase Sample data +
+
+
+
+ +
+
+ +
+ Upload file +
+
+
+ {#each Object.entries(plusIntegrations) as [integrationType, schema]} +
+ (stage = integrationType)}> +
+
+ +
+ {schema.friendlyName} +
+
+
+ {/each} +
+ {:else if stage in plusIntegrations} + (stage = "data")} + onNext={data => handleCreateApp({ datasourceConfig: data })} + /> + {:else} +

There was an problem. Please refresh the page and try again.

+ {/if} +
+ +
+
+ + diff --git a/packages/builder/vite.config.js b/packages/builder/vite.config.js index 95e2908995..c02f13e193 100644 --- a/packages/builder/vite.config.js +++ b/packages/builder/vite.config.js @@ -1,9 +1,16 @@ import { svelte } from "@sveltejs/vite-plugin-svelte" import replace from "@rollup/plugin-replace" import { defineConfig, loadEnv } from "vite" - import path from "path" +const ignoredWarnings = [ + "unused-export-let", + "css-unused-selector", + "module-script-reactive-declaration", + "a11y-no-onchange", + "a11y-click-events-have-key-events", +] + export default defineConfig(({ mode }) => { const isProduction = mode === "production" const env = loadEnv(mode, process.cwd()) @@ -29,6 +36,12 @@ export default defineConfig(({ mode }) => { svelte({ hot: !isProduction, emitCss: true, + onwarn: (warning, handler) => { + // Ignore some warnings + if (!ignoredWarnings.includes(warning.code)) { + handler(warning) + } + }, }), replace({ preventAssignment: true, diff --git a/packages/client/rollup.config.js b/packages/client/rollup.config.js index a69de38799..f56714b51a 100644 --- a/packages/client/rollup.config.js +++ b/packages/client/rollup.config.js @@ -17,6 +17,7 @@ const ignoredWarnings = [ "css-unused-selector", "module-script-reactive-declaration", "a11y-no-onchange", + "a11y-click-events-have-key-events", ] export default { @@ -88,7 +89,9 @@ export default { dedupe: ["svelte", "svelte/internal"], }), svg(), - image(), + image({ + exclude: "**/*.svg", + }), json(), production && terser(), !production && visualizer(), diff --git a/packages/frontend-core/src/components/SplitPage.svelte b/packages/frontend-core/src/components/SplitPage.svelte index 08ec519715..79886845de 100644 --- a/packages/frontend-core/src/components/SplitPage.svelte +++ b/packages/frontend-core/src/components/SplitPage.svelte @@ -9,7 +9,8 @@
- background + +
@@ -30,6 +31,7 @@ overflow-y: auto; } .right { + overflow: hidden; position: relative; } .right img { From 1909407ab1cf6da7f1ad829e976a26c5a3a8f690 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Tue, 31 Jan 2023 19:45:03 +0000 Subject: [PATCH 214/386] v2.2.12-alpha.53 --- lerna.json | 2 +- packages/backend-core/package.json | 4 ++-- packages/bbui/package.json | 4 ++-- packages/builder/package.json | 10 +++++----- packages/cli/package.json | 8 ++++---- packages/client/package.json | 8 ++++---- packages/frontend-core/package.json | 4 ++-- packages/sdk/package.json | 2 +- packages/server/package.json | 10 +++++----- packages/string-templates/package.json | 2 +- packages/types/package.json | 2 +- packages/worker/package.json | 8 ++++---- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lerna.json b/lerna.json index 88005cc266..6f2cf29a7f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 1d2328c530..c0c9bcdd52 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase backend core libraries used in server and worker", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", @@ -23,7 +23,7 @@ }, "dependencies": { "@budibase/nano": "10.1.1", - "@budibase/types": "2.2.12-alpha.52", + "@budibase/types": "2.2.12-alpha.53", "@shopify/jest-koa-mocks": "5.0.1", "@techpass/passport-openidconnect": "0.3.2", "aws-cloudfront-sign": "2.2.0", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 7392a22185..16bf4ee6a3 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "1.2.1", - "@budibase/string-templates": "2.2.12-alpha.52", + "@budibase/string-templates": "2.2.12-alpha.53", "@spectrum-css/accordion": "3.0.24", "@spectrum-css/actionbutton": "1.0.1", "@spectrum-css/actiongroup": "1.0.1", diff --git a/packages/builder/package.json b/packages/builder/package.json index 142fcee4b3..0e85314ad5 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "license": "GPL-3.0", "private": true, "scripts": { @@ -71,10 +71,10 @@ } }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.52", - "@budibase/client": "2.2.12-alpha.52", - "@budibase/frontend-core": "2.2.12-alpha.52", - "@budibase/string-templates": "2.2.12-alpha.52", + "@budibase/bbui": "2.2.12-alpha.53", + "@budibase/client": "2.2.12-alpha.53", + "@budibase/frontend-core": "2.2.12-alpha.53", + "@budibase/string-templates": "2.2.12-alpha.53", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-solid-svg-icons": "^6.2.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index ac24542ed0..0a7df43473 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { @@ -26,9 +26,9 @@ "outputPath": "build" }, "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.52", - "@budibase/string-templates": "2.2.12-alpha.52", - "@budibase/types": "2.2.12-alpha.52", + "@budibase/backend-core": "2.2.12-alpha.53", + "@budibase/string-templates": "2.2.12-alpha.53", + "@budibase/types": "2.2.12-alpha.53", "axios": "0.21.2", "chalk": "4.1.0", "cli-progress": "3.11.2", diff --git a/packages/client/package.json b/packages/client/package.json index 0265f23608..4dffbef085 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,9 +19,9 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "2.2.12-alpha.52", - "@budibase/frontend-core": "2.2.12-alpha.52", - "@budibase/string-templates": "2.2.12-alpha.52", + "@budibase/bbui": "2.2.12-alpha.53", + "@budibase/frontend-core": "2.2.12-alpha.53", + "@budibase/string-templates": "2.2.12-alpha.53", "@spectrum-css/button": "^3.0.3", "@spectrum-css/card": "^3.0.3", "@spectrum-css/divider": "^1.0.3", diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 0f5327e5f3..c8523c3a7c 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "MPL-2.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "2.2.12-alpha.52", + "@budibase/bbui": "2.2.12-alpha.53", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 52ac20c70a..363e56d8af 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/sdk", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase Public API SDK", "author": "Budibase", "license": "MPL-2.0", diff --git a/packages/server/package.json b/packages/server/package.json index 9d0bc27b0c..8ba86d5f7a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -43,11 +43,11 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "10.0.3", - "@budibase/backend-core": "2.2.12-alpha.52", - "@budibase/client": "2.2.12-alpha.52", + "@budibase/backend-core": "2.2.12-alpha.53", + "@budibase/client": "2.2.12-alpha.53", "@budibase/pro": "2.2.12-alpha.52", - "@budibase/string-templates": "2.2.12-alpha.52", - "@budibase/types": "2.2.12-alpha.52", + "@budibase/string-templates": "2.2.12-alpha.53", + "@budibase/types": "2.2.12-alpha.53", "@bull-board/api": "3.7.0", "@bull-board/koa": "3.9.4", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 44bfa48ebf..35eab64384 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/types/package.json b/packages/types/package.json index ce7ad9c492..4c0801b5a7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/types", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase types", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index 93b526b6a1..f29af7d8bb 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "2.2.12-alpha.52", + "version": "2.2.12-alpha.53", "description": "Budibase background service", "main": "src/index.ts", "repository": { @@ -36,10 +36,10 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "2.2.12-alpha.52", + "@budibase/backend-core": "2.2.12-alpha.53", "@budibase/pro": "2.2.12-alpha.52", - "@budibase/string-templates": "2.2.12-alpha.52", - "@budibase/types": "2.2.12-alpha.52", + "@budibase/string-templates": "2.2.12-alpha.53", + "@budibase/types": "2.2.12-alpha.53", "@koa/router": "8.0.8", "@sentry/node": "6.17.7", "@techpass/passport-openidconnect": "0.3.2", From f4379fcb4f2f516f1d208a2cafce508bc9ce52a5 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 31 Jan 2023 19:49:31 +0000 Subject: [PATCH 215/386] Updates to use our new Nano layer for CouchDB integration rather than PouchDB. --- .../backend-core/src/db/couch/DatabaseImpl.ts | 47 +- .../backend-core/src/db/couch/connections.ts | 4 +- packages/builder/yarn.lock | 1007 +---------------- packages/server/src/integrations/couchdb.ts | 58 +- .../src/integrations/tests/couchdb.spec.ts | 46 +- 5 files changed, 124 insertions(+), 1038 deletions(-) diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 9b4761d961..2dbb061863 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -15,18 +15,36 @@ import { getCouchInfo } from "./connections" import { directCouchCall } from "./utils" import { getPouchDB } from "./pouchDB" import { WriteStream, ReadStream } from "fs" +import { newid } from "../../newid" + +function buildNano(couchInfo: { url: string; cookie: string }) { + return Nano({ + url: couchInfo.url, + requestDefaults: { + headers: { + Authorization: couchInfo.cookie, + }, + }, + parseUrl: false, + }) +} export class DatabaseImpl implements Database { public readonly name: string private static nano: Nano.ServerScope + private readonly instanceNano?: Nano.ServerScope private readonly pouchOpts: DatabaseOpts - constructor(dbName?: string, opts?: DatabaseOpts) { + constructor(dbName?: string, opts?: DatabaseOpts, connection?: string) { if (dbName == null) { throw new Error("Database name cannot be undefined.") } this.name = dbName this.pouchOpts = opts || {} + if (connection) { + const couchInfo = getCouchInfo(connection) + this.instanceNano = buildNano(couchInfo) + } if (!DatabaseImpl.nano) { DatabaseImpl.init() } @@ -34,15 +52,7 @@ export class DatabaseImpl implements Database { static init() { const couchInfo = getCouchInfo() - DatabaseImpl.nano = Nano({ - url: couchInfo.url, - requestDefaults: { - headers: { - Authorization: couchInfo.cookie, - }, - }, - parseUrl: false, - }) + DatabaseImpl.nano = buildNano(couchInfo) } async exists() { @@ -50,6 +60,10 @@ export class DatabaseImpl implements Database { return response.status === 200 } + private nano() { + return this.instanceNano || DatabaseImpl.nano + } + async checkSetup() { let shouldCreate = !this.pouchOpts?.skip_setup // check exists in a lightweight fashion @@ -58,9 +72,9 @@ export class DatabaseImpl implements Database { throw new Error("DB does not exist") } if (!exists) { - await DatabaseImpl.nano.db.create(this.name) + await this.nano().db.create(this.name) } - return DatabaseImpl.nano.db.use(this.name) + return this.nano().db.use(this.name) } private async updateOutput(fnc: any) { @@ -101,6 +115,13 @@ export class DatabaseImpl implements Database { return this.updateOutput(() => db.destroy(_id, _rev)) } + async post(document: AnyDocument, opts?: DatabasePutOpts) { + if (!document._id) { + document._id = newid() + } + return this.put(document, opts) + } + async put(document: AnyDocument, opts?: DatabasePutOpts) { if (!document._id) { throw new Error("Cannot store document without _id field.") @@ -146,7 +167,7 @@ export class DatabaseImpl implements Database { async destroy() { try { - await DatabaseImpl.nano.db.destroy(this.name) + await this.nano().db.destroy(this.name) } catch (err: any) { // didn't exist, don't worry if (err.statusCode === 404) { diff --git a/packages/backend-core/src/db/couch/connections.ts b/packages/backend-core/src/db/couch/connections.ts index a2206de634..06c661f350 100644 --- a/packages/backend-core/src/db/couch/connections.ts +++ b/packages/backend-core/src/db/couch/connections.ts @@ -1,7 +1,7 @@ import env from "../../environment" -export const getCouchInfo = () => { - const urlInfo = getUrlInfo() +export const getCouchInfo = (connection?: string) => { + const urlInfo = getUrlInfo(connection) let username let password if (env.COUCH_DB_USERNAME) { diff --git a/packages/builder/yarn.lock b/packages/builder/yarn.lock index cc6d28b11f..20fc29b0e3 100644 --- a/packages/builder/yarn.lock +++ b/packages/builder/yarn.lock @@ -7,11 +7,6 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.1.0.tgz#417fef4a143f4396ad0b3b4351fee21323f15aa8" integrity sha512-mMVJ/j/GbZ/De4ZHWbQAQO1J6iVnjtZLc9WEdkUQb8S/Bu2cAF2bETXUgMAdvMG3/ngtKmcNBe+Zms9bg6jnQQ== -"@adobe/spectrum-css-workflow-icons@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@adobe/spectrum-css-workflow-icons/-/spectrum-css-workflow-icons-1.2.1.tgz#7e2cb3fcfb5c8b12d7275afafbb6ec44913551b4" - integrity sha512-uVgekyBXnOVkxp+CUssjN/gefARtudZC8duEn1vm0lBQFwGRZFlDEzU1QC+aIRWCrD1Z8OgRpmBYlSZ7QS003w== - "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -945,137 +940,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@budibase/bbui@2.2.12-alpha.51": - version "2.2.12-alpha.51" - resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-2.2.12-alpha.51.tgz#c346501eeb4daba522794a6fd6063b387100454b" - integrity sha512-Eajnvt/kMl7kN/UhBB22DkHwItglk4PYwAxaaNa2OIUyl9NYYkDKDCvjCm+NeIgTZNmk+1FXsGN6FFcufbn+Og== - dependencies: - "@adobe/spectrum-css-workflow-icons" "1.2.1" - "@budibase/string-templates" "2.2.12-alpha.51" - "@spectrum-css/accordion" "3.0.24" - "@spectrum-css/actionbutton" "1.0.1" - "@spectrum-css/actiongroup" "1.0.1" - "@spectrum-css/avatar" "3.0.2" - "@spectrum-css/button" "3.0.1" - "@spectrum-css/buttongroup" "3.0.2" - "@spectrum-css/checkbox" "3.0.2" - "@spectrum-css/dialog" "3.0.1" - "@spectrum-css/divider" "1.0.3" - "@spectrum-css/dropzone" "3.0.2" - "@spectrum-css/fieldgroup" "3.0.2" - "@spectrum-css/fieldlabel" "3.0.1" - "@spectrum-css/icon" "3.0.1" - "@spectrum-css/illustratedmessage" "3.0.2" - "@spectrum-css/inlinealert" "2.0.1" - "@spectrum-css/inputgroup" "3.0.2" - "@spectrum-css/label" "2.0.10" - "@spectrum-css/link" "3.1.1" - "@spectrum-css/menu" "3.0.1" - "@spectrum-css/modal" "3.0.1" - "@spectrum-css/pagination" "3.0.3" - "@spectrum-css/picker" "1.0.1" - "@spectrum-css/popover" "3.0.1" - "@spectrum-css/progressbar" "1.0.2" - "@spectrum-css/progresscircle" "1.0.2" - "@spectrum-css/radio" "3.0.2" - "@spectrum-css/search" "3.0.2" - "@spectrum-css/sidenav" "3.0.2" - "@spectrum-css/slider" "3.0.1" - "@spectrum-css/statuslight" "3.0.2" - "@spectrum-css/stepper" "3.0.3" - "@spectrum-css/switch" "1.0.2" - "@spectrum-css/table" "3.0.1" - "@spectrum-css/tabs" "3.2.12" - "@spectrum-css/tags" "3.0.2" - "@spectrum-css/textfield" "3.0.1" - "@spectrum-css/toast" "3.0.1" - "@spectrum-css/tooltip" "3.0.3" - "@spectrum-css/treeview" "3.0.2" - "@spectrum-css/typography" "3.0.1" - "@spectrum-css/underlay" "2.0.9" - "@spectrum-css/vars" "3.0.1" - dayjs "^1.10.4" - easymde "^2.16.1" - svelte-flatpickr "^3.2.3" - svelte-portal "^1.0.0" - -"@budibase/client@2.2.12-alpha.51": - version "2.2.12-alpha.51" - resolved "https://registry.yarnpkg.com/@budibase/client/-/client-2.2.12-alpha.51.tgz#3177ceee2bc37c27c49ba2afc1de3d9274cfbe42" - integrity sha512-WlPWYtUtYMfP6RI9F+FazRP06Y1Ay6pZA3/4Kxy+Gw4B78Qvf9OEj14DO++4raZP507d94TyGbewxq/EfTfEng== - dependencies: - "@budibase/bbui" "2.2.12-alpha.51" - "@budibase/frontend-core" "2.2.12-alpha.51" - "@budibase/string-templates" "2.2.12-alpha.51" - "@spectrum-css/button" "^3.0.3" - "@spectrum-css/card" "^3.0.3" - "@spectrum-css/divider" "^1.0.3" - "@spectrum-css/link" "^3.1.3" - "@spectrum-css/page" "^3.0.1" - "@spectrum-css/tag" "^3.1.4" - "@spectrum-css/typography" "^3.0.2" - "@spectrum-css/vars" "^3.0.1" - apexcharts "^3.22.1" - dayjs "^1.10.5" - downloadjs "1.4.7" - html5-qrcode "^2.2.1" - leaflet "^1.7.1" - regexparam "^1.3.0" - sanitize-html "^2.7.0" - screenfull "^6.0.1" - shortid "^2.2.15" - socket.io-client "^4.5.1" - svelte "^3.49.0" - svelte-apexcharts "^1.0.2" - svelte-flatpickr "^3.1.0" - svelte-spa-router "^3.0.5" - -"@budibase/frontend-core@2.2.12-alpha.51": - version "2.2.12-alpha.51" - resolved "https://registry.yarnpkg.com/@budibase/frontend-core/-/frontend-core-2.2.12-alpha.51.tgz#029b84a5427113b36d8d72861cf6b7e43cde09b3" - integrity sha512-iO4dIxKbfcQIsHkaSYmvsPi5btOXEgu3+Gb1RRMJ6x/H3Mn17tHUXG1q+zkRLszXurR/h1Z/YzF60wUYxJzm7A== - dependencies: - "@budibase/bbui" "2.2.12-alpha.51" - lodash "^4.17.21" - svelte "^3.46.2" - -"@budibase/handlebars-helpers@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.8.tgz#6953d29673a8c5c407e096c0a84890465c7ce841" - integrity sha512-ggWJUt0GqsHFAEup5tlWlcrmYML57nKhpNGGLzVsqXVYN8eVmf3xluYmmMe7fDYhQH0leSprrdEXmsdFQF3HAQ== - dependencies: - array-sort "^1.0.0" - define-property "^2.0.2" - extend-shallow "^3.0.2" - for-in "^1.0.2" - get-object "^0.2.0" - get-value "^3.0.1" - handlebars "^4.7.7" - handlebars-utils "^1.0.6" - has-value "^2.0.2" - helper-md "^0.2.2" - html-tag "^2.0.0" - is-even "^1.0.0" - is-glob "^4.0.1" - kind-of "^6.0.3" - micromatch "^3.1.5" - relative "^3.0.2" - striptags "^3.1.1" - to-gfm-code-block "^0.1.1" - year "^0.2.1" - -"@budibase/string-templates@2.2.12-alpha.51": - version "2.2.12-alpha.51" - resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-2.2.12-alpha.51.tgz#13fd7ac4bfe628b517541974aa560d75129a7d31" - integrity sha512-fgJJopKfc/VHCYLE7KRda6bJzrHyn0wBJfo3DImogPE2cfAxdXTMpMj2IX4dza8mePJC6WjtJbtc2NLZtg7u2w== - dependencies: - "@budibase/handlebars-helpers" "^0.11.8" - dayjs "^1.10.4" - handlebars "^4.7.6" - handlebars-utils "^1.0.6" - lodash "^4.17.20" - vm2 "^3.9.4" - "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1603,140 +1467,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@spectrum-css/accordion@3.0.24": - version "3.0.24" - resolved "https://registry.yarnpkg.com/@spectrum-css/accordion/-/accordion-3.0.24.tgz#f89066c120c57b0cfc9aba66d60c39fc1cf69f74" - integrity sha512-jNOmUsxmiT3lRLButnN5KKHM94fd+87fjiF8L0c4uRNgJl6ZsBuxPXrM15lV4y1f8D2IACAw01/ZkGRAeaCOFA== - "@spectrum-css/accordion@^3.0.24": version "3.0.30" resolved "https://registry.yarnpkg.com/@spectrum-css/accordion/-/accordion-3.0.30.tgz#0893a6db28bab984bf5adaf7e1ba194e741db615" integrity sha512-J9zw5blM72pl+mtticqJKwLHaQYBwtrfwDXwQuz3lOTUcedzxQ0Pk2lZ1P46+98hdJzxTXZ5RjIyXre3TPEq1w== -"@spectrum-css/actionbutton@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/actionbutton/-/actionbutton-1.0.1.tgz#9c75da37ea6915919fb574c74bd60dacc03b6577" - integrity sha512-AUqtyNabHF451Aj9i3xz82TxS5Z6k1dttA68/1hMeU9kbPCSS4P6Viw3vaRGs9CSspuR8xnnhDgrq+F+zMy2Hw== - -"@spectrum-css/actiongroup@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/actiongroup/-/actiongroup-1.0.1.tgz#b95b86e7af229e90fe1e70399d8d4b547b4bd31c" - integrity sha512-5Q6uMjzv5BFA2TwGASr/jAtJpTWl26fhWvgGY8kOA0RCSij35l+YJg/FPXf6Nnj2qCOl8DkNycjT9YXJ+bhyVA== - -"@spectrum-css/avatar@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/avatar/-/avatar-3.0.2.tgz#4f1826223eae330e64b6d3cc899e9bc2e98dac95" - integrity sha512-wEczvSqxttTWSiL3cOvXV/RmGRwSkw2w6+slcHhnf0kb7ovymMM+9oz8vvEpEsSeo5u598bc+7ktrKFpAd6soQ== - -"@spectrum-css/button@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.1.tgz#6db8c3e851baecd0f1c2d88fef37d49d01c6e643" - integrity sha512-YXrBtjIYisk4Vaxnp0RiE4gdElQX04P2mc4Pi2GlQ27dJKlHmufYcF+kAqGdtiyK5yjdN/vKRcC8y13aA4rusA== - -"@spectrum-css/button@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.3.tgz#2df1efaab6c7e0b3b06cb4b59e1eae59c7f1fc84" - integrity sha512-6CnLPqqtaU/PcSSIGeGRi0iFIIxIUByYLKFO6zn5NEUc12KQ28dJ4PLwB6WBa0L8vRoAGlnWWH2ZZweTijbXgg== - -"@spectrum-css/buttongroup@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/buttongroup/-/buttongroup-3.0.2.tgz#fd3387973ca3131609e32112de42a1c0400a48d8" - integrity sha512-Wu7B4GJ/SAeVHz9SUGAkeIH8pLaZh4t+w2ykSKOPQIRuK2jCBoudkEClVxviNVwqekccf5XLFXg9GpYF1a3Uaw== - -"@spectrum-css/card@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/card/-/card-3.0.3.tgz#56b2e2da6b80c1583228baa279de7407383bfb6b" - integrity sha512-+oKLUI2a0QmQP9EzySeq/G4FpUkkdaDNbuEbqCj2IkPMc/2v/nwzsPhh1fj2UIghGAiiUwXfPpzax1e8fyhQUg== - -"@spectrum-css/checkbox@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/checkbox/-/checkbox-3.0.2.tgz#53ca2fba0d9faa1fead10e7206eb1f6cdcfd6ddd" - integrity sha512-hPbGcnm7kJvJS4jp/P/bdaZvbyR1eIE9mteuZqcBgdmyp9m/k6+mW5jmsbtqb3Y4mMPWvOJFfz/sIvWJP0F0Zg== - -"@spectrum-css/dialog@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/dialog/-/dialog-3.0.1.tgz#33aae036282159f6aa998848b8c0828640a9620a" - integrity sha512-hUFbRR6RGT63MNuP7wP+k9KU+uRuICsduMihskh700e+jiQ+Gsv53fBFDlB843FoZYlIXzFQXgtjMUC5a4Qibw== - -"@spectrum-css/divider@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/divider/-/divider-1.0.3.tgz#639e2ebaa0834efa40f42397668bbd5c153ea385" - integrity sha512-Zy4Rn40w8UtzMh3wx/U9+CepSCpm1aOCGftHgWDub0XZuVTzh0c1WwyzTuLCx2Hf21z5VRGNiDh8bGEEzSbtNA== - dependencies: - "@spectrum-css/vars" "^3.0.2" - -"@spectrum-css/divider@^1.0.3": - version "1.0.27" - resolved "https://registry.yarnpkg.com/@spectrum-css/divider/-/divider-1.0.27.tgz#435bf738a65b4eb15c899edf5c536bea22f2d679" - integrity sha512-hWKPHOEo9lkOGN5zecpVVwVxE3x0SJHQJKDNx1g0xs/P/AthAboK+L1c9Rq29czNfcQ2kUjumi4igzQzcqABMQ== - dependencies: - "@spectrum-css/vars" "^8.0.0" - -"@spectrum-css/dropzone@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/dropzone/-/dropzone-3.0.2.tgz#34f137851054442b219fed7f32006b93fc5e0bcf" - integrity sha512-BuBBzm5re6lM0AWgd6V+mI5eEGnnmFEtcFiJBEn9jYNEQYgflFhvnERUt89jMX5WmspiecwI2JBWJFrtFsOzug== - -"@spectrum-css/fieldgroup@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/fieldgroup/-/fieldgroup-3.0.2.tgz#1c1afd3c444d8650fefac275dc66a7a913933846" - integrity sha512-Vyw0kQJdLW18J6w4H+YAsoLntvkw5rXmW3CH5H3SDTXkBztxtHSSe3e106Nw5MoZxTfHlom6CxbYXYCTjQfqGw== - -"@spectrum-css/fieldlabel@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/fieldlabel/-/fieldlabel-3.0.1.tgz#39f7c0f25cc2ff402afeff005341b0832f7c588c" - integrity sha512-LMfwrwIq8wEEvxFLobdLvXRwKrp8o9Fty4iJ9aYl2Rj1uXkfRd8qLz9HGZjLEE1OuJgoTBgamYABl7EvoA5PLw== - -"@spectrum-css/icon@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/icon/-/icon-3.0.1.tgz#e300a6fc353c85c6b5d6e7a364408a940c31b177" - integrity sha512-cGFtIrcQ/7tthdkHK1npuEFiCdYVHLqwmLxghUYQw8Tb8KgJaw3OBO1tpjgsUizexNgu26BjVRIbGxNWuBXIHQ== - -"@spectrum-css/illustratedmessage@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/illustratedmessage/-/illustratedmessage-3.0.2.tgz#6a480be98b027e050b086e7899e40d87adb0a8c0" - integrity sha512-dqnE8X27bGcO0HN8+dYx8O4o0dNNIAqeivOzDHhe2El+V4dTzMrNIerF6G0NLm3GjVf6XliwmitsZK+K6FmbtA== - -"@spectrum-css/inlinealert@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/inlinealert/-/inlinealert-2.0.1.tgz#7521f88f6c845806403cc7d925773c7414e204a2" - integrity sha512-Xy5RCOwgurqUXuGQCsEDUduDd5408bmEpmFg+feynG7VFUgLFZWBeylSENB/OqjlFtO76PHXNVdHkhDscPIHTA== - -"@spectrum-css/inputgroup@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/inputgroup/-/inputgroup-3.0.2.tgz#f1b13603832cbd22394f3d898af13203961f8691" - integrity sha512-O0G3Lw9gxsh8gTLQWIAKkN1O8cWhjpEUl+oR1PguIKFni72uNr2ikU9piOwy/r0gJG2Q/TVs6hAshoAAkmsSzw== - -"@spectrum-css/label@2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@spectrum-css/label/-/label-2.0.10.tgz#2368651d7636a19385b5d300cdf6272db1916001" - integrity sha512-xCbtEiQkZIlLdWFikuw7ifDCC21DOC/KMgVrrVJHXFc4KRQe9LTZSqmGF3tovm+CSq1adE59mYoTbojVQ9YuEQ== - -"@spectrum-css/link@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.1.tgz#cb526a2e10b50ef5a7ae29cca7272e2610d597eb" - integrity sha512-Bi88lRhTY7g6nM/ryW1yY4Cji211ZYNtRxkxbV7n2lPvwMAAQtyx0qVD3ru4kTGj/FFVvmPR3XiOE10K13HSNA== - -"@spectrum-css/link@^3.1.3": - version "3.1.23" - resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.23.tgz#9d9ff64c41366edbfdb19d04a5deec88bf2ea8fd" - integrity sha512-CAJQGnGTrTtR4tF1L94ou9Y+c4vnx9d5rWhb3AMzKb2Focqz02xSkTyaCCH7OM/3CwD8TCLOMANon8LcRpGAjA== - -"@spectrum-css/menu@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/menu/-/menu-3.0.1.tgz#2a376f991acc24e12ec892bb6b9db2650fc41fbe" - integrity sha512-Qjg0+1O0eC89sb/bRFq2AGnQ8XqhVy23TUXHyffNM8qdcMssnlny3QmhzjURCZKvx/Y5UytCpzhedPQqSpQwZg== - -"@spectrum-css/modal@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/modal/-/modal-3.0.1.tgz#613a6b83d0330a4d38db41a98090800751c56d8d" - integrity sha512-F7D99F3cjDGT9DM9sogx/p49jrNYT7a1J6TUoqV73wUf+0gP+dTsskBOo9jB8VbUE+POQPjiDLB+SWLp6iBB+w== - "@spectrum-css/page@^3.0.1": version "3.0.9" resolved "https://registry.yarnpkg.com/@spectrum-css/page/-/page-3.0.9.tgz#f8a705dee90af958e2ee20307218e4f82a018c36" @@ -1744,127 +1479,7 @@ dependencies: "@spectrum-css/vars" "^4.3.1" -"@spectrum-css/pagination@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/pagination/-/pagination-3.0.3.tgz#b204c3ada384c4af751a354bc428346d82eeea65" - integrity sha512-OJ/v9GeNXJOZ9Yr9LDBYPrR2NCiLOWP9wANT/a5sqFuugRnQbn/HYMnRp9TBxwpDY6ihaPo0T/wi7kLiAJFdDw== - -"@spectrum-css/picker@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/picker/-/picker-1.0.1.tgz#98991198576d26bd14160824e7b6f3c278ff930b" - integrity sha512-Rv4/UBOdNW1gs7WVBCJnPD5VFly8MqP++psDX6kcugUIcfJy0GC3acvElotmKRlCDk8Qxks2W2A0jKeSgphTmA== - -"@spectrum-css/popover@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/popover/-/popover-3.0.1.tgz#5863c1efc53f98f9aba2de9186666780041303fc" - integrity sha512-LmOSj/yCwQQ9iGmCYnHiJsJR/HfPiGqI1Jl7pkKxBOCxYBMS/5+ans9vfCN2Qnd0eK7WSbfPg72S6mjye7db2Q== - -"@spectrum-css/progressbar@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/progressbar/-/progressbar-1.0.2.tgz#b5a59432517f9ae6dad49d9504691bc5ac42b424" - integrity sha512-+jExeBLtVCqo3BqtFq5WCtZ028Dzk+oUnX6y4z6ZamKPqOyOELOtFnhYnyhyRndQOqYwKUTXx9zsaWA/lpJOHw== - -"@spectrum-css/progresscircle@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/progresscircle/-/progresscircle-1.0.2.tgz#258ea9170fb70f795edda03e38a61d93bef4487c" - integrity sha512-JLULpyzjIY95lzlWR1yE1gv4l1K6p+scQ+edmuZZUHBzwM3pUtkvHJmUlA9TYdResUYW6Uka60VRdY6lZ8gnFQ== - -"@spectrum-css/radio@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/radio/-/radio-3.0.2.tgz#9c1386894920bbed604e4e174fbbd45d9d762152" - integrity sha512-0TDdzC9omNXnpKHEXNuuGeXdNh4x8jvTKVUqMRLb7vY4hY94hAdt6X01NBqka+jzK35HxGzpDdPADAz62yZLPQ== - -"@spectrum-css/search@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/search/-/search-3.0.2.tgz#70e93e321032d40b399498b2324e3b70e050551e" - integrity sha512-3UbT8yZmNOwrZxq+CUmumE+26ZySZ8OoKNM6U20SLMPLgdx6MrRugVE88r3Bl0sJ0RZX/5bU8nausdiHeX+Jlw== - -"@spectrum-css/sidenav@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/sidenav/-/sidenav-3.0.2.tgz#9d70f408d588ee79c69857751010333671f32713" - integrity sha512-YpIdH/F0jEICYmoduGrnkTmxwJq1kfKxEp0wOs+ZkQOsvKMv1an7nyhsfOKCQqcGNfYzJ9mJAk7/u5+vsxHa8g== - -"@spectrum-css/slider@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/slider/-/slider-3.0.1.tgz#5281e6f47eb5a4fd3d1816c138bf66d01d7f2e49" - integrity sha512-DI2dtMRnQuDM1miVzl3SGyR1khUEKnwdXfO5EHDFwkC3yav43F5QogkfjmjFmWWobMVovdJlAuiaaJ/IHejD0Q== - -"@spectrum-css/statuslight@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/statuslight/-/statuslight-3.0.2.tgz#dc54b6cd113413dcdb909c486b5d7bae60db65c5" - integrity sha512-xodB8g8vGJH20XmUj9ZsPlM1jHrGeRbvmVXkz0q7YvQrYAhim8pP3W+XKKZAletPFAuu8cmUOc6SWn6i4X4z6w== - -"@spectrum-css/stepper@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/stepper/-/stepper-3.0.3.tgz#ae89846886431e3edeee060207b8f81540f73a34" - integrity sha512-prAD61ImlOTs9b6PfB3cB08x4lAfxtvnW+RZiTYky0E8GgZdrc/MfCkL5/oqQaIQUtyQv/3Lb7ELAf/0K8QTXw== - -"@spectrum-css/switch@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/switch/-/switch-1.0.2.tgz#f0b4c69271964573e02b08e90998096e49e1de44" - integrity sha512-zqmHpgWPNg1gEwdUNFYV3CBX5JaeALfIqcJIxE0FLZqr9d1C4+oLE0ItIFzt1bwr4bFAOmkEpvtiY+amluzGxQ== - -"@spectrum-css/table@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/table/-/table-3.0.1.tgz#753e0e2498082c0c36b9600828516aff3ac338cd" - integrity sha512-XQ+srMTv9hK1H0nctWUtqyzitmvyb5TNR+7mjAmKRdkBRSTQQSipDhenxZp72ekzMtMoSYZVZ77kgo0Iw3Fpug== - -"@spectrum-css/tabs@3.2.12": - version "3.2.12" - resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.2.12.tgz#9b08f23d5aa881b3441af7757800c7173e5685ff" - integrity sha512-rPFUW9SSW4+3/UJ3UrtY2/l3sQvlqB1fqxHLPDjgykvbfrnMejcCTNV4ZrFNHXpE/6+kGnk+yVViSPtWGwJzkA== - -"@spectrum-css/tag@^3.1.4": - version "3.3.15" - resolved "https://registry.yarnpkg.com/@spectrum-css/tag/-/tag-3.3.15.tgz#971184fd8cb977b85a529f808313851863123278" - integrity sha512-pF6Wh61Z7hmAy20twIlpjdDuivYj6UPtWIzK7giyJKr/qcn20BjVN2ChIeFB1N+vBamJdLsuQOewv4AJ3+LZ2Q== - -"@spectrum-css/tags@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/tags/-/tags-3.0.2.tgz#5bf35fb79c97cd9344de485bd4626ad5b9f07757" - integrity sha512-HbvMk+QHvCDD1/ScvSErpKROcpAbXuMD4Hl/Gz/1A1lQ0fJ/CJeCq/MMsL7zjK1nlItU/ySu8r8KIuRF+6F8SQ== - -"@spectrum-css/textfield@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/textfield/-/textfield-3.0.1.tgz#e875b8e37817378ad08fc4af7d53026df38911e5" - integrity sha512-MUV5q87CVxbkNdSNoxGrFbgyKc51ft/WWf3aVEoPdPw5yBnXqFe1w1YmAit5zYDOOhhs58sCLAlUcCMlOpkgrA== - -"@spectrum-css/toast@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/toast/-/toast-3.0.1.tgz#36f62ea05302761e59b9d53e05f6c04423861796" - integrity sha512-jov++S358BrN2tmMfaoYk1N6u9HojgeuQk61keXrK2m3VE5/n94x7Lg3kIPeSWO0odyDfBlMqT9jacbRey3QTg== - -"@spectrum-css/tooltip@3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/tooltip/-/tooltip-3.0.3.tgz#26b8ca3b3d30e29630244d85eb4fc11d0c841281" - integrity sha512-ztRF7WW1FzyNavXBRc+80z67UoOrY9wl3cMYsVD3MpDnyxdzP8cjza1pCcolKBaFqRTcQKkxKw3GWtGICRKR5A== - -"@spectrum-css/treeview@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/treeview/-/treeview-3.0.2.tgz#d54d8f17290babb1c885f5d9355e225421beb0d2" - integrity sha512-foO7UBJv1JMFaKgDPVt8jBghZSVbqhXR8TaGaxHSnMubv7ygmKkc1AITrWC2STILCn84ju2vchOohMZfW6sYwg== - -"@spectrum-css/typography@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.1.tgz#957dafd9b18c314fa37a88b549042ba2175f5b3f" - integrity sha512-XyR68K2rIZX3u4j7HhMLOqLVHDJZcapp3XUqgYMzMWccBFleA0qPxKpfRWqVIA5DzTMSIw0wEcZPYKWFZ2e6dA== - -"@spectrum-css/typography@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.2.tgz#ea3ca0a60e18064527819d48c8c4364cab4fcd38" - integrity sha512-5ZOLmQe0edzsDMyhghUd4hBb5uxGsFrxzf+WasfcUw9klSfTsRZ09n1BsaaWbgrLjlMQ+EEHS46v5VNo0Ms2CA== - -"@spectrum-css/underlay@2.0.9": - version "2.0.9" - resolved "https://registry.yarnpkg.com/@spectrum-css/underlay/-/underlay-2.0.9.tgz#fc10f971d1325cc844b727e6260f7217844060e8" - integrity sha512-X86xd0PG4QobmUyXA90BFGnyygaI8kW64dA4ysf4z0cOvUWjNbAAl3a/DB/WRyrnp63Zqv83T/cgNbetagTbWg== - -"@spectrum-css/vars@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-3.0.1.tgz#561fd69098f896a647242dd8d6108af603bfa31e" - integrity sha512-l4oRcCOqInChYXZN6OQhpe3isk6l4OE6Ys8cgdlsiKp53suNoQxyyd9p/eGRbCjZgH3xQ8nK0t4DHa7QYC0S6w== - -"@spectrum-css/vars@^3.0.1", "@spectrum-css/vars@^3.0.2": +"@spectrum-css/vars@^3.0.1": version "3.0.2" resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-3.0.2.tgz#ea9062c3c98dfc6ba59e5df14a03025ad8969999" integrity sha512-vzS9KqYXot4J3AEER/u618MXWAS+IoMvYMNrOoscKiLLKYQWenaueakUWulFonToPd/9vIpqtdbwxznqrK5qDw== @@ -1874,11 +1489,6 @@ resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-4.3.1.tgz#d333fa41909f691c8750b5c15ad9ba029df2248e" integrity sha512-rX6Iasu9BsFMVgEN0vGRPm9dmSxva+IK/uqQAa9HM0lliwqUiFrJxrFXHHpiAgNuux/U4srEJwbSpGzfF+CegQ== -"@spectrum-css/vars@^8.0.0": - version "8.0.3" - resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-8.0.3.tgz#a5da23c58861b36ee48b9cd5983f956d2bb7977f" - integrity sha512-LoSPi5273u21O5ItFr3FuLZS3D0y9dlmJImmat8W66r6dPaFJhHDRAbIB93hGOk5mPxqrQb8guAUx7FmvZrbuQ== - "@sveltejs/vite-plugin-svelte@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz#7f468f03c933fcdfc60d4773671c73f33b9ef4d6" @@ -1990,18 +1600,6 @@ dependencies: "@babel/types" "^7.3.0" -"@types/codemirror@^5.60.4": - version "5.60.7" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.7.tgz#efbb78e5e79f90c6762c2127c02096648e600808" - integrity sha512-QXIC+RPzt/1BGSuD6iFn6UMC9TDp+9hkOANYNPVsjjrDdzKphfRkwQDKGp2YaC54Yhz0g6P5uYTCCibZZEiMAA== - dependencies: - "@types/tern" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -2056,11 +1654,6 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/marked@^4.0.7": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-4.0.8.tgz#b316887ab3499d0a8f4c70b7bd8508f92d477955" - integrity sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw== - "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -2106,13 +1699,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/tern@*": - version "0.23.4" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" - integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== - dependencies: - "@types/estree" "*" - "@types/testing-library__jest-dom@^5.9.1": version "5.14.5" resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" @@ -2164,7 +1750,7 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn-walk@^8.1.1, acorn-walk@^8.2.0: +acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== @@ -2174,7 +1760,7 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: +acorn@^8.2.4, acorn@^8.4.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -2246,18 +1832,6 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -apexcharts@^3.19.2, apexcharts@^3.22.1: - version "3.36.3" - resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.36.3.tgz#debd58ded07163d51e00aeb15827d594e0cc8129" - integrity sha512-8/FXEs0ohXMff07Gv28XjhPwEJphIUdq2/wii/pcvi54Tw6z1mjrV8ydN8rlWi/ve8BAPBefJkLmRWv7UOBsLw== - dependencies: - svg.draggable.js "^2.2.2" - svg.easing.js "^2.0.0" - svg.filter.js "^2.0.2" - svg.pathmorphing.js "^0.1.3" - svg.resize.js "^1.4.3" - svg.select.js "^3.0.1" - arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" @@ -2273,7 +1847,7 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -argparse@^1.0.10, argparse@^1.0.7: +argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -2302,15 +1876,6 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-sort@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" - integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== - dependencies: - default-compare "^1.0.0" - get-value "^2.0.6" - kind-of "^5.0.2" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -2363,13 +1928,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autolinker@~0.28.0: - version "0.28.1" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47" - integrity sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ== - dependencies: - gulp-header "^1.7.1" - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -2773,14 +2331,7 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -codemirror-spell-checker@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/codemirror-spell-checker/-/codemirror-spell-checker-1.1.2.tgz#1c660f9089483ccb5113b9ba9ca19c3f4993371e" - integrity sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ== - dependencies: - typo-js "*" - -codemirror@^5.59.0, codemirror@^5.63.1: +codemirror@^5.59.0: version "5.65.11" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.11.tgz#c818edc3274788c008f636520c5490a1f7009b4f" integrity sha512-Gp62g2eKSCHYt10axmGhKq3WoJSvVpvhXmowNq7pZdRVowwtvBR/hi2LSP5srtctKkRT33T6/n8Kv1UGp7JW4A== @@ -2864,13 +2415,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-with-sourcemaps@*: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - configent@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/configent/-/configent-2.2.0.tgz#2de230fc43f22c47cfd99016aa6962d6f9546994" @@ -2900,11 +2444,6 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -3037,12 +2576,12 @@ dateformat@^4.5.1: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -dayjs@^1.10.4, dayjs@^1.10.5, dayjs@^1.11.2: +dayjs@^1.10.4, dayjs@^1.11.2: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3111,13 +2650,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== -default-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" - integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== - dependencies: - kind-of "^5.0.2" - define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -3190,20 +2722,6 @@ dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -3211,22 +2729,6 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^5.0.1, domhandler@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" @@ -3242,17 +2744,6 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -easymde@^2.16.1: - version "2.18.0" - resolved "https://registry.yarnpkg.com/easymde/-/easymde-2.18.0.tgz#ff1397d07329b1a7b9187d2d0c20766fa16b3b1b" - integrity sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA== - dependencies: - "@types/codemirror" "^5.60.4" - "@types/marked" "^4.0.7" - codemirror "^5.63.1" - codemirror-spell-checker "1.1.2" - marked "^4.1.0" - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -3283,22 +2774,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458" - integrity sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" - xmlhttprequest-ssl "~2.0.0" - -engine.io-parser@~5.0.3: - version "5.0.6" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" - integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== - enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -3306,16 +2781,6 @@ enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -ent@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== - -entities@^4.2.0, entities@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3486,11 +2951,6 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -3786,11 +3246,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flatpickr@^4.5.2: - version "4.6.13" - resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94" - integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== - fn-name@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c" @@ -3857,11 +3312,6 @@ from@~0: resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -3943,14 +3393,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" -get-object@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c" - integrity sha512-7P6y6k6EzEFmO/XyUyFlXm1YLJy9xeA1x/grNV8276abX5GuwUtYgKFkRFkLixw4hf4Pz9q2vgv/8Ar42R0HuQ== - dependencies: - is-number "^2.0.2" - isobject "^0.2.0" - get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -3980,13 +3422,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -get-value@^3.0.0, get-value@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8" - integrity sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA== - dependencies: - isobject "^3.0.1" - getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -4063,35 +3498,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== -gulp-header@^1.7.1: - version "1.8.12" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84" - integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ== - dependencies: - concat-with-sourcemaps "*" - lodash.template "^4.4.0" - through2 "^2.0.0" - -handlebars-utils@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/handlebars-utils/-/handlebars-utils-1.0.6.tgz#cb9db43362479054782d86ffe10f47abc76357f9" - integrity sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw== - dependencies: - kind-of "^6.0.0" - typeof-article "^0.1.1" - -handlebars@^4.7.6, handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -4149,14 +3555,6 @@ has-value@^1.0.0: has-values "^1.0.0" isobject "^3.0.0" -has-value@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-2.0.2.tgz#d0f12e8780ba8e90e66ad1a21c707fdb67c25658" - integrity sha512-ybKOlcRsK2MqrM3Hmz/lQxXHZ6ejzSPzpNabKB45jb5qDgJvKPa3SdapTsTLwEb9WltgWpOmNax7i+DzNOk4TA== - dependencies: - get-value "^3.0.0" - has-values "^2.0.1" - has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" @@ -4170,13 +3568,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has-values@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d" - integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w== - dependencies: - kind-of "^6.0.2" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -4184,16 +3575,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -helper-md@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/helper-md/-/helper-md-0.2.2.tgz#c1f59d7e55bbae23362fd8a0e971607aec69d41f" - integrity sha512-49TaQzK+Ic7ZVTq4i1UZxRUJEmAilTk8hz7q4I0WNUaTclLR8ArJV5B3A1fe1xF2HtsDTr2gYKLaVTof/Lt84Q== - dependencies: - ent "^2.2.0" - extend-shallow "^2.0.1" - fs-exists-sync "^0.1.0" - remarkable "^1.6.2" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -4211,29 +3592,6 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-tag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed" - integrity sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g== - dependencies: - is-self-closing "^1.0.1" - kind-of "^6.0.0" - -html5-qrcode@^2.2.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/html5-qrcode/-/html5-qrcode-2.3.4.tgz#7e2b4575a23b10ff5e26d2bf147c8027c1ece389" - integrity sha512-VPZrOTG8XR9HmIAhSSiGtJVPErZxKy/DuGc9cPQLburCWZEbvxQGJP9y4K4P+8vdalLtYB/vM5YP1BdWQKZ8jQ== - -htmlparser2@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -4320,7 +3678,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4465,13 +3823,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-even@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-even/-/is-even-1.0.0.tgz#76b5055fbad8d294a86b6a949015e1c97b717c06" - integrity sha512-LEhnkAdJqic4Dbqn58A0y52IXoHWlsueqQkKfMfdEnIYG8A1sm/GHidKkS6yvXlMoRrkM34csHnXQtOqcb+Jzg== - dependencies: - is-odd "^0.1.2" - is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -4526,13 +3877,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -4545,13 +3889,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-odd@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-0.1.2.tgz#bc573b5ce371ef2aad6e6f49799b72bef13978a7" - integrity sha512-Ri7C2K7o5IrUU9UEI8losXJCCD/UtsaIrkR5sxIcFg4xQ9cRJXlWA5DQvTE0yDc0krvSNLsRGXN11UPS6KyfBw== - dependencies: - is-number "^3.0.0" - is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -4569,11 +3906,6 @@ is-plain-object@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b" integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g== -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" @@ -4587,13 +3919,6 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-self-closing@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-self-closing/-/is-self-closing-1.0.1.tgz#5f406b527c7b12610176320338af0fa3896416e4" - integrity sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg== - dependencies: - self-closing-tags "^1.0.1" - is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" @@ -4676,7 +4001,7 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -4691,11 +4016,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-0.2.0.tgz#a3432192f39b910b5f02cc989487836ec70aa85e" - integrity sha512-VaWq6XYAsbvM0wf4dyBO7WH9D7GosB7ZZlqrawI9BBiTMINBeCyqSKBa35m870MY3O4aM31pYyZi9DfGrYMJrQ== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -5308,7 +4628,7 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== @@ -5322,12 +4642,12 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0, kind-of@^5.0.2: +kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -5347,11 +4667,6 @@ lazy-ass@1.6.0, lazy-ass@^1.6.0: resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== -leaflet@^1.7.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.9.3.tgz#52ec436954964e2d3d39e0d433da4b2500d74414" - integrity sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ== - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5396,11 +4711,6 @@ lodash-es@^4.17.11: resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -5431,22 +4741,7 @@ lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash.template@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5552,11 +4847,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^4.1.0: - version "4.2.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" - integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -5572,7 +4862,7 @@ methods@^1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^3.1.4, micromatch@^3.1.5: +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5628,7 +4918,7 @@ minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== @@ -5736,11 +5026,6 @@ ncp@^2.0.0: resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -5959,11 +5244,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-srcset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" - integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== - parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -6053,7 +5333,7 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== -postcss@^8.3.11, postcss@^8.4.18: +postcss@^8.4.18: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -6109,11 +5389,6 @@ pretty-format@^29.0.0, pretty-format@^29.4.1: ansi-styles "^5.0.0" react-is "^18.0.0" -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -6217,19 +5492,6 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - 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" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -6279,16 +5541,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexparam@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-2.0.1.tgz#c912f5dae371e3798100b3c9ce22b7414d0889fa" - integrity sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw== - -regexparam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-1.3.0.tgz#2fe42c93e32a40eff6235d635e0ffa344b92965f" - integrity sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g== - regexpu-core@^5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" @@ -6313,21 +5565,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -relative@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f" - integrity sha512-Q5W2qeYtY9GbiR8z1yHNZ1DGhyjb4AnLEjt8iE6XfcC1QIu+FAtj3HQaO0wH28H1mX6cqNLvAqWhP402dxJGyA== - dependencies: - isobject "^2.0.0" - -remarkable@^1.6.2: - version "1.7.4" - resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00" - integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg== - dependencies: - argparse "^1.0.10" - autolinker "~0.28.0" - remixicon@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/remixicon/-/remixicon-2.5.0.tgz#b5e245894a1550aa23793f95daceadbf96ad1a41" @@ -6480,11 +5717,6 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -6512,18 +5744,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize-html@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.8.1.tgz#319c4fdba67e1edf35b1fd6d9362210044826d47" - integrity sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg== - dependencies: - deepmerge "^4.2.2" - escape-string-regexp "^4.0.0" - htmlparser2 "^8.0.0" - is-plain-object "^5.0.0" - parse-srcset "^1.0.2" - postcss "^8.3.11" - saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -6531,16 +5751,6 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -screenfull@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-6.0.2.tgz#3dbe4b8c4f8f49fb8e33caa8f69d0bca730ab238" - integrity sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw== - -self-closing-tags@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/self-closing-tags/-/self-closing-tags-1.0.1.tgz#6c5fa497994bb826b484216916371accee490a5d" - integrity sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA== - "semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -6609,13 +5819,6 @@ shortid@2.2.15: dependencies: nanoid "^2.1.0" -shortid@^2.2.15: - version "2.2.16" - resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.16.tgz#b742b8f0cb96406fd391c76bfc18a67a57fe5608" - integrity sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g== - dependencies: - nanoid "^2.1.0" - side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -6688,24 +5891,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-client@^4.5.1: - version "4.5.4" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.4.tgz#d3cde8a06a6250041ba7390f08d2468ccebc5ac9" - integrity sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.2" - engine.io-client "~6.2.3" - socket.io-parser "~4.2.1" - -socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -6875,13 +6060,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -6916,11 +6094,6 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -striptags@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" - integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6955,25 +6128,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svelte-apexcharts@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/svelte-apexcharts/-/svelte-apexcharts-1.0.2.tgz#4e000f8b8f7c901c05658c845457dfc8314d54c1" - integrity sha512-6qlx4rE+XsonZ0FZudfwqOQ34Pq+3wpxgAD75zgEmGoYhYBJcwmikTuTf3o8ZBsZue9U/pAwhNy3ed1Bkq1gmA== - dependencies: - apexcharts "^3.19.2" - svelte-dnd-action@^0.9.8: version "0.9.22" resolved "https://registry.yarnpkg.com/svelte-dnd-action/-/svelte-dnd-action-0.9.22.tgz#003eee9dddb31d8c782f6832aec8b1507fff194d" integrity sha512-lOQJsNLM1QWv5mdxIkCVtk6k4lHCtLgfE59y8rs7iOM6erchbLC9hMEFYSveZz7biJV0mpg7yDSs4bj/RT/YkA== -svelte-flatpickr@^3.1.0, svelte-flatpickr@^3.2.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.3.1.tgz#2f2fb60d8190e583ff62d82162a5c2f3fd7824a8" - integrity sha512-cKHET/oFoGA/qIoAX87+XvC5n3KuFrCSYBTzI1gl1TKZsTiVnbQkJOIsIa96S19tbnyyPKn+tdt028vzBA3qyA== - dependencies: - flatpickr "^4.5.2" - svelte-hmr@^0.14.12: version "0.14.12" resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.14.12.tgz#a127aec02f1896500b10148b2d4d21ddde39973f" @@ -6989,78 +6148,16 @@ svelte-loading-spinners@^0.1.1: resolved "https://registry.yarnpkg.com/svelte-loading-spinners/-/svelte-loading-spinners-0.1.7.tgz#3fa6fa0ef67ab635773bf20b07d0b071debbadaa" integrity sha512-EKCId1DjVL2RSUVJJsvtNcqQHox03XIgh4xh/4p7r6ST7d8mut6INY9/LqK4A17PFU64+3quZmqiSfOlf480CA== -svelte-portal@1.0.0, svelte-portal@^1.0.0: +svelte-portal@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svelte-portal/-/svelte-portal-1.0.0.tgz#36a47c5578b1a4d9b4dc60fa32a904640ec4cdd3" integrity sha512-nHf+DS/jZ6jjnZSleBMSaZua9JlG5rZv9lOGKgJuaZStfevtjIlUJrkLc3vbV8QdBvPPVmvcjTlazAzfKu0v3Q== -svelte-spa-router@^3.0.5: - version "3.3.0" - resolved "https://registry.yarnpkg.com/svelte-spa-router/-/svelte-spa-router-3.3.0.tgz#2fc0967a49dc361dfe4d38dddad6e662eed5b42c" - integrity sha512-cwRNe7cxD43sCvSfEeaKiNZg3FCizGxeMcf7CPiWRP3jKXjEma3vxyyuDtPOam6nWbVxl9TNM3hlE/i87ZlqcQ== - dependencies: - regexparam "2.0.1" - -svelte@^3.46.2, svelte@^3.48.0, svelte@^3.49.0: +svelte@^3.48.0: version "3.55.1" resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.55.1.tgz#6f93b153e5248039906ce5fe196efdb9e05dfce8" integrity sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ== -svg.draggable.js@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" - integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== - dependencies: - svg.js "^2.0.1" - -svg.easing.js@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" - integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== - dependencies: - svg.js ">=2.3.x" - -svg.filter.js@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" - integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== - dependencies: - svg.js "^2.2.5" - -svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" - integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== - -svg.pathmorphing.js@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" - integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== - dependencies: - svg.js "^2.4.0" - -svg.resize.js@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" - integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== - dependencies: - svg.js "^2.6.5" - svg.select.js "^2.1.2" - -svg.select.js@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" - integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== - dependencies: - svg.js "^2.2.5" - -svg.select.js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917" - integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== - dependencies: - svg.js "^2.6.5" - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -7110,14 +6207,6 @@ throttleit@^1.0.0: resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - through@2, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7140,11 +6229,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-gfm-code-block@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz#25d045a5fae553189e9637b590900da732d8aa82" - integrity sha512-LQRZWyn8d5amUKnfR9A9Uu7x9ss7Re8peuWR2gkh1E+ildOfv2aF26JpuDg8JtvCduu5+hOrMIH+XstZtnagqg== - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -7296,28 +6380,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typeof-article@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af" - integrity sha512-Vn42zdX3FhmUrzEmitX3iYyLb+Umwpmv8fkZRIknYh84lmdrwqZA5xYaoKiIj2Rc5i/5wcDrpUmZcbk1U51vTw== - dependencies: - kind-of "^3.1.0" - typescript@4.7.3: version "4.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== -typo-js@*: - version "1.2.2" - resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.2.2.tgz#340484d81fe518e77c81a5a770162b14492f183b" - integrity sha512-C7pYBQK17EjSg8tVNY91KHdUt5Nf6FMJ+c3js076quPmBML57PmNMzAcIq/2kf/hSYtFABNDIYNYlJRl5BJhGw== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -7412,11 +6479,6 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.3.0" -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - uuid@8.3.1: version "8.3.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" @@ -7475,14 +6537,6 @@ vite@^3.0.8: optionalDependencies: fsevents "~2.3.2" -vm2@^3.9.4: - version "3.9.13" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.13.tgz#774a1a3d73b9b90b1aa45bcc5f25e349f2eef649" - integrity sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -7616,11 +6670,6 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -7659,11 +6708,6 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -7674,16 +6718,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmlhttprequest-ssl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" - integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== - -xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -7755,11 +6789,6 @@ yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -year@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/year/-/year-0.2.1.tgz#4083ae520a318b23ec86037f3000cb892bdf9bb0" - integrity sha512-9GnJUZ0QM4OgXuOzsKNzTJ5EOkums1Xc+3YQXp+Q+UxFjf7zLucp9dQ8QMIft0Szs1E1hUiXFim1OYfEKFq97w== - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" diff --git a/packages/server/src/integrations/couchdb.ts b/packages/server/src/integrations/couchdb.ts index 67be21c9d1..8c1e71ef14 100644 --- a/packages/server/src/integrations/couchdb.ts +++ b/packages/server/src/integrations/couchdb.ts @@ -1,11 +1,11 @@ import { - Integration, DatasourceFieldType, - QueryType, + Document, + Integration, IntegrationBase, + QueryType, } from "@budibase/types" - -const PouchDB = require("pouchdb") +import { db as dbCore } from "@budibase/backend-core" interface CouchDBConfig { url: string @@ -39,6 +39,15 @@ const SCHEMA: Integration = { update: { type: QueryType.JSON, }, + get: { + type: QueryType.FIELDS, + fields: { + id: { + type: DatasourceFieldType.STRING, + required: true, + }, + }, + }, delete: { type: QueryType.FIELDS, fields: { @@ -57,7 +66,11 @@ class CouchDBIntegration implements IntegrationBase { constructor(config: CouchDBConfig) { this.config = config - this.client = new PouchDB(`${config.url}/${config.database}`) + this.client = new dbCore.DatabaseImpl( + config.database, + undefined, + config.url + ) } async query( @@ -66,31 +79,48 @@ class CouchDBIntegration implements IntegrationBase { query: { json?: object; id?: string } ) { try { - const response = await this.client[command](query.id || query.json) - await this.client.close() - return response + return await this.client[command](query.id || query.json) } catch (err) { console.error(errorMsg, err) throw err } } - async create(query: { json: object }) { - return this.query("post", "Error writing to couchDB", query) + private parse(query: { json: string | object }) { + return typeof query.json === "string" ? JSON.parse(query.json) : query.json } - async read(query: { json: object }) { + async create(query: { json: string | object }) { + const parsed = this.parse(query) + return this.query("post", "Error writing to couchDB", { json: parsed }) + } + + async read(query: { json: string | object }) { + const parsed = this.parse(query) const result = await this.query("allDocs", "Error querying couchDB", { json: { include_docs: true, - ...query.json, + ...parsed, }, }) return result.rows.map((row: { doc: object }) => row.doc) } - async update(query: { json: object }) { - return this.query("put", "Error updating couchDB document", query) + async update(query: { json: string | object }) { + const parsed: Document = this.parse(query) + if (!parsed?._rev && parsed?._id) { + const oldDoc = await this.get({ id: parsed._id }) + parsed._rev = oldDoc._rev + } + return this.query("put", "Error updating couchDB document", { + json: parsed, + }) + } + + async get(query: { id: string }) { + return this.query("get", "Error retrieving couchDB document by ID", { + id: query.id, + }) } async delete(query: { id: string }) { diff --git a/packages/server/src/integrations/tests/couchdb.spec.ts b/packages/server/src/integrations/tests/couchdb.spec.ts index e05a2bd247..9bbb4fa211 100644 --- a/packages/server/src/integrations/tests/couchdb.spec.ts +++ b/packages/server/src/integrations/tests/couchdb.spec.ts @@ -1,16 +1,19 @@ -jest.mock( - "pouchdb", - () => - function CouchDBMock(this: any) { - this.post = jest.fn() - this.allDocs = jest.fn(() => ({ rows: [] })) - this.put = jest.fn() - this.get = jest.fn() - this.remove = jest.fn() - this.plugin = jest.fn() - this.close = jest.fn() - } -) +jest.mock("@budibase/backend-core", () => { + const core = jest.requireActual("@budibase/backend-core") + return { + ...core, + db: { + ...core.db, + DatabaseImpl: function () { + this.post = jest.fn() + this.allDocs = jest.fn().mockReturnValue({ rows: [] }) + this.put = jest.fn() + this.get = jest.fn().mockReturnValue({ _rev: "a" }) + this.remove = jest.fn() + }, + }, + } +}) import { default as CouchDBIntegration } from "../couchdb" @@ -33,8 +36,8 @@ describe("CouchDB Integration", () => { const doc = { test: 1, } - const response = await config.integration.create({ - json: doc, + await config.integration.create({ + json: JSON.stringify(doc), }) expect(config.integration.client.post).toHaveBeenCalledWith(doc) }) @@ -44,8 +47,8 @@ describe("CouchDB Integration", () => { name: "search", } - const response = await config.integration.read({ - json: doc, + await config.integration.read({ + json: JSON.stringify(doc), }) expect(config.integration.client.allDocs).toHaveBeenCalledWith({ @@ -60,11 +63,14 @@ describe("CouchDB Integration", () => { name: "search", } - const response = await config.integration.update({ - json: doc, + await config.integration.update({ + json: JSON.stringify(doc), }) - expect(config.integration.client.put).toHaveBeenCalledWith(doc) + expect(config.integration.client.put).toHaveBeenCalledWith({ + ...doc, + _rev: "a", + }) }) it("calls the delete method with the correct params", async () => { From abe3e2921fee36b1e87631b500c950101bc9c4e8 Mon Sep 17 00:00:00 2001 From: adrinr Date: Tue, 31 Jan 2023 22:50:52 +0000 Subject: [PATCH 216/386] Race conditions --- .../src/api/routes/tests/{query.spec.js => query.seq.spec.js} | 0 packages/server/src/db/tests/linkController.spec.js | 1 + packages/worker/src/tests/TestConfiguration.ts | 1 + 3 files changed, 2 insertions(+) rename packages/server/src/api/routes/tests/{query.spec.js => query.seq.spec.js} (100%) diff --git a/packages/server/src/api/routes/tests/query.spec.js b/packages/server/src/api/routes/tests/query.seq.spec.js similarity index 100% rename from packages/server/src/api/routes/tests/query.spec.js rename to packages/server/src/api/routes/tests/query.seq.spec.js diff --git a/packages/server/src/db/tests/linkController.spec.js b/packages/server/src/db/tests/linkController.spec.js index 919a104ad2..13f7b34381 100644 --- a/packages/server/src/db/tests/linkController.spec.js +++ b/packages/server/src/db/tests/linkController.spec.js @@ -10,6 +10,7 @@ describe("test the link controller", () => { let table1, table2, appId beforeEach(async () => { + config.modeCloud() const app = await config.init() appId = app.appId const { _id } = await config.createTable() diff --git a/packages/worker/src/tests/TestConfiguration.ts b/packages/worker/src/tests/TestConfiguration.ts index 11ec56c408..74fb2dd477 100644 --- a/packages/worker/src/tests/TestConfiguration.ts +++ b/packages/worker/src/tests/TestConfiguration.ts @@ -147,6 +147,7 @@ class TestConfiguration { await this.createSession(this.tenant1User!) }) } catch (e: any) { + console.log(e) throw new Error(e.message) } } From 6e12c3fa3caf5e2677abc3e6d03d0283de90257c Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 1 Feb 2023 08:20:46 +0000 Subject: [PATCH 217/386] Remove most traces of data-cy attributes --- .../bbui/src/ActionButton/ActionButton.svelte | 2 -- .../bbui/src/ActionMenu/ActionMenu.svelte | 3 +-- packages/bbui/src/Button/Button.svelte | 2 -- .../bbui/src/Form/Core/EnvDropdown.svelte | 2 -- packages/bbui/src/Form/Core/Switch.svelte | 2 -- packages/bbui/src/Form/Core/TextField.svelte | 2 -- packages/bbui/src/Form/EnvDropdown.svelte | 2 -- packages/bbui/src/Form/Input.svelte | 2 -- packages/bbui/src/Form/InputDropdown.svelte | 2 -- packages/bbui/src/Form/PickerDropdown.svelte | 2 -- packages/bbui/src/Form/Toggle.svelte | 3 +-- packages/bbui/src/Menu/Item.svelte | 2 -- packages/bbui/src/Modal/ModalContent.svelte | 3 +-- packages/bbui/src/Popover/Popover.svelte | 2 -- packages/bbui/src/SideNavigation/Item.svelte | 2 -- .../backend/DataTable/RowFieldControl.svelte | 19 +++---------------- .../DataTable/modals/CreateEditColumn.svelte | 6 +----- .../DataTable/modals/CreateEditUser.svelte | 1 - .../backend/DataTable/modals/EditRow.svelte | 2 +- .../modals/UpdateDatasourceModal.svelte | 1 - .../backend/TableNavigator/ListItem.svelte | 8 +------- .../modals/CreateTableModal.svelte | 1 - .../popovers/EditTablePopover.svelte | 6 +----- .../src/components/common/AppLockModal.svelte | 1 - .../components/common/ConfirmDialog.svelte | 2 -- .../src/components/common/DashCard.svelte | 3 +-- .../components/common/TemplateDisplay.svelte | 2 +- .../bindings/DrawerBindableCombobox.svelte | 6 +----- .../components/common/inputs/CopyInput.svelte | 3 +-- .../src/components/deploy/DeployModal.svelte | 14 ++------------ .../components/deploy/DeployNavigation.svelte | 3 --- .../src/components/deploy/RevertModal.svelte | 1 - .../settings/controls/DataSourceSelect.svelte | 6 +----- .../controls/IconSelect/IconSelect.svelte | 7 +------ .../settings/controls/PropertyControl.svelte | 8 ++------ .../portal/onboarding/TourPopover.svelte | 1 - .../components/settings/ProfileModal.svelte | 12 ++---------- .../src/components/start/AppRow.svelte | 6 +++--- .../app/[application]/data/_layout.svelte | 4 +--- .../[screenId]/_components/AppPreview.svelte | 2 +- .../new/_components/NewComponentPanel.svelte | 1 - .../_components/DatasourceModal.svelte | 2 +- .../screens/_components/NewScreenModal.svelte | 4 ++-- .../src/pages/builder/apps/index.svelte | 2 +- .../portal/_components/UserDropdown.svelte | 18 +++++------------- .../pages/builder/portal/apps/create.svelte | 14 ++------------ .../pages/builder/portal/apps/index.svelte | 15 ++------------- .../portal/overview/[appId]/_layout.svelte | 9 ++------- .../portal/overview/[appId]/overview.svelte | 11 +++-------- .../builder/portal/settings/auth/index.svelte | 5 ----- .../builder/portal/users/users/index.svelte | 7 +------ 51 files changed, 46 insertions(+), 200 deletions(-) diff --git a/packages/bbui/src/ActionButton/ActionButton.svelte b/packages/bbui/src/ActionButton/ActionButton.svelte index cc4417be2a..bf962d6913 100644 --- a/packages/bbui/src/ActionButton/ActionButton.svelte +++ b/packages/bbui/src/ActionButton/ActionButton.svelte @@ -9,7 +9,6 @@ export let longPressable = false export let disabled = false export let icon = "" - export let dataCy = null export let size = "M" export let active = false export let fullWidth = false @@ -37,7 +36,6 @@ diff --git a/packages/builder/src/pages/builder/invite/index.svelte b/packages/builder/src/pages/builder/invite/index.svelte index 4b786db497..35231117c4 100644 --- a/packages/builder/src/pages/builder/invite/index.svelte +++ b/packages/builder/src/pages/builder/invite/index.svelte @@ -68,7 +68,7 @@ - + logo Join {company} @@ -175,6 +175,7 @@
{/if} + {#if editableColumn.type === AUTO_TYPE || editableColumn.autocolumn} +