diff --git a/.discourse-compatibility b/.discourse-compatibility
index b53ff04d..01ce2cde 100644
--- a/.discourse-compatibility
+++ b/.discourse-compatibility
@@ -1,2 +1,3 @@
+3.1.999: 1f35b80f85e5fd1efb7f4851f0845700432febdc
2.7.99: e07a57e398b6b1676ab42a7e34467556fca5416b
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c
diff --git a/.github/workflows/discourse-plugin.yml b/.github/workflows/discourse-plugin.yml
new file mode 100644
index 00000000..13850e3e
--- /dev/null
+++ b/.github/workflows/discourse-plugin.yml
@@ -0,0 +1,13 @@
+name: Discourse Plugin
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ schedule:
+ - cron: "0 0 * * *"
+
+jobs:
+ ci:
+ uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1
diff --git a/.github/workflows/plugin-linting.yml b/.github/workflows/plugin-linting.yml
deleted file mode 100644
index acb85230..00000000
--- a/.github/workflows/plugin-linting.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-name: Linting
-
-on:
- push:
- branches:
- - main
- - stable
- pull_request:
-
-concurrency:
- group: plugin-linting-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }}
- cancel-in-progress: true
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v3
-
- - name: Set up Node.js
- uses: actions/setup-node@v3
- with:
- node-version: 16
- cache: yarn
-
- - name: Yarn install
- run: yarn install
-
- - name: Set up ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: 2.7
- bundler-cache: true
-
- - name: ESLint
- if: ${{ always() }}
- run: yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern {test,assets}/javascripts
-
- - name: Prettier
- if: ${{ always() }}
- shell: bash
- run: |
- yarn prettier -v
- if [ 0 -lt $(find assets -type f \( -name "*.scss" -or -name "*.js" -or -name "*.es6" \) 2> /dev/null | wc -l) ]; then
- yarn prettier --list-different "assets/**/*.{scss,js,es6}"
- fi
- if [ 0 -lt $(find test -type f \( -name "*.js" -or -name "*.es6" \) 2> /dev/null | wc -l) ]; then
- yarn prettier --list-different "test/**/*.{js,es6}"
- fi
-
- - name: Rubocop
- if: ${{ always() }}
- run: bundle exec rubocop .
diff --git a/.github/workflows/plugin-tests.yml b/.github/workflows/plugin-tests.yml
deleted file mode 100644
index f58f1b64..00000000
--- a/.github/workflows/plugin-tests.yml
+++ /dev/null
@@ -1,136 +0,0 @@
-name: Plugin Tests
-
-on:
- push:
- branches:
- - main
- - stable
- pull_request:
-
-concurrency:
- group: tests-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }}
- cancel-in-progress: true
-
-jobs:
- build:
- name: ${{ matrix.build_type }}
- runs-on: ubuntu-latest
- container: discourse/discourse_test:slim${{ startsWith(matrix.build_type, 'frontend') && '-browsers' || '' }}
- timeout-minutes: 30
-
- env:
- DISCOURSE_HOSTNAME: www.example.com
- RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
- RAILS_ENV: test
- PGUSER: discourse
- PGPASSWORD: discourse
-
- strategy:
- fail-fast: false
-
- matrix:
- build_type: ["backend", "frontend"]
-
- steps:
- - uses: actions/checkout@v3
- with:
- repository: discourse/discourse
- fetch-depth: 1
-
- - name: Install plugin
- uses: actions/checkout@v3
- with:
- path: plugins/${{ github.event.repository.name }}
- fetch-depth: 1
-
- - name: Setup Git
- run: |
- git config --global user.email "ci@ci.invalid"
- git config --global user.name "Discourse CI"
-
- - name: Start redis
- run: |
- redis-server /etc/redis/redis.conf &
-
- - name: Start Postgres
- run: |
- chown -R postgres /var/run/postgresql
- sudo -E -u postgres script/start_test_db.rb
- sudo -u postgres psql -c "CREATE ROLE $PGUSER LOGIN SUPERUSER PASSWORD '$PGPASSWORD';"
-
- - name: Bundler cache
- uses: actions/cache@v3
- with:
- path: vendor/bundle
- key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
- restore-keys: |
- ${{ runner.os }}-gem-
-
- - name: Setup gems
- run: |
- gem install bundler --conservative -v $(awk '/BUNDLED WITH/ { getline; gsub(/ /,""); print $0 }' Gemfile.lock)
- bundle config --local path vendor/bundle
- bundle config --local deployment true
- bundle config --local without development
- bundle install --jobs 4
- bundle clean
-
- - name: Lint English locale
- if: matrix.build_type == 'backend'
- run: bundle exec ruby script/i18n_lint.rb "plugins/${{ github.event.repository.name }}/locales/{client,server}.en.yml"
-
- - name: Get yarn cache directory
- id: yarn-cache-dir
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - name: Yarn cache
- uses: actions/cache@v3
- id: yarn-cache
- with:
- path: ${{ steps.yarn-cache-dir.outputs.dir }}
- key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-yarn-
-
- - name: Yarn install
- run: yarn install
-
- - name: Fetch app state cache
- uses: actions/cache@v3
- id: app-cache
- with:
- path: tmp/app-cache
- key: >-
- ${{ hashFiles('.github/workflows/tests.yml') }}-
- ${{ hashFiles('db/**/*', 'plugins/**/db/**/*') }}-
-
- - name: Restore database from cache
- if: steps.app-cache.outputs.cache-hit == 'true'
- run: psql -f tmp/app-cache/cache.sql postgres
-
- - name: Restore uploads from cache
- if: steps.app-cache.outputs.cache-hit == 'true'
- run: rm -rf public/uploads && cp -r tmp/app-cache/uploads public/uploads
-
- - name: Create and migrate database
- if: steps.app-cache.outputs.cache-hit != 'true'
- run: |
- bin/rake db:create
- bin/rake db:migrate
-
- - name: Dump database for cache
- if: steps.app-cache.outputs.cache-hit != 'true'
- run: mkdir -p tmp/app-cache && pg_dumpall > tmp/app-cache/cache.sql
-
- - name: Dump uploads for cache
- if: steps.app-cache.outputs.cache-hit != 'true'
- run: rm -rf tmp/app-cache/uploads && cp -r public/uploads tmp/app-cache/uploads
-
- - name: Plugin RSpec
- if: matrix.build_type == 'backend'
- run: bin/rake plugin:spec[${{ github.event.repository.name }}]
-
- - name: Plugin QUnit
- if: matrix.build_type == 'frontend'
- run: QUNIT_EMBER_CLI=1 bundle exec rake plugin:qunit['${{ github.event.repository.name }}','1200000']
- timeout-minutes: 10
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
index 48cea364..66b401ac 100644
--- a/COPYRIGHT.txt
+++ b/COPYRIGHT.txt
@@ -1,4 +1,4 @@
-All code in this repository is Copyright 2018 by Angus McLeod.
+All code in this repository is Copyright 2023 by Angus McLeod.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/README.md b/README.md
index 0190f16e..0c454685 100644
--- a/README.md
+++ b/README.md
@@ -4,22 +4,24 @@ The Custom Wizard Plugin lets you make forms for your Discourse forum. Better us
+👋 Looking to report an issue? We're managing issues for this plugin using our [bug report wizard](https://coop.pavilion.tech/w/bug-report).
+
## Install
If you're not sure how to install a plugin in Discourse, please follow the [plugin installation guide](https://meta.discourse.org/t/install-a-plugin/19157) or contact your Discourse hosting provider.
## Documentation
-[Read the full documentation here](https://discourse.pluginmanager.org/c/discourse-custom-wizard/documentation), or go directly to the relevant section
+[Read the full documentation here](https://coop.pavilion.tech/c/82), or go directly to the relevant section
-- [Wizard Administration](https://discourse.pluginmanager.org/t/wizard-administration)
-- [Wizard Settings](https://discourse.pluginmanager.org/t/wizard-settings)
-- [Step Settings](https://discourse.pluginmanager.org/t/step-settings)
-- [Field Settings](https://discourse.pluginmanager.org/t/field-settings)
-- [Conditional Settings](https://discourse.pluginmanager.org/t/conditional-settings)
-- [Field Interpolation](https://discourse.pluginmanager.org/t/field-interpolation)
-- [Wizard Examples and Templates](https://discourse.pluginmanager.org/t/wizard-examples-and-templates)
+- [Wizard Administration](https://coop.pavilion.tech/t/1602)
+- [Wizard Settings](https://coop.pavilion.tech/t/1614)
+- [Step Settings](https://coop.pavilion.tech/t/1735)
+- [Field Settings](https://coop.pavilion.tech/t/1580)
+- [Conditional Settings](https://coop.pavilion.tech/t/1673)
+- [Field Interpolation](https://coop.pavilion.tech/t/1557)
+- [Handling Dates and Times](https://coop.pavilion.tech/t/1708)
## Support
-- [Report a bug](https://discourse.pluginmanager.org/w/bug-report)
+- [Report an issue](https://coop.pavilion.tech/w/bug-report)
diff --git a/app/controllers/custom_wizard/admin/admin.rb b/app/controllers/custom_wizard/admin/admin.rb
index 867be56c..aa8862b6 100644
--- a/app/controllers/custom_wizard/admin/admin.rb
+++ b/app/controllers/custom_wizard/admin/admin.rb
@@ -8,7 +8,7 @@ class CustomWizard::AdminController < ::Admin::AdminController
subscribed: subcription.subscribed?,
subscription_type: subcription.type,
subscription_attributes: CustomWizard::Subscription.attributes,
- subscription_client_installed: subcription.client_installed?
+ subscription_client_installed: CustomWizard::Subscription.client_installed?
)
end
diff --git a/app/controllers/custom_wizard/steps.rb b/app/controllers/custom_wizard/steps.rb
index df3c2cb3..2a4305c7 100644
--- a/app/controllers/custom_wizard/steps.rb
+++ b/app/controllers/custom_wizard/steps.rb
@@ -1,6 +1,5 @@
# frozen_string_literal: true
-class CustomWizard::StepsController < ::ApplicationController
- before_action :ensure_logged_in
+class CustomWizard::StepsController < ::CustomWizard::WizardClientController
before_action :ensure_can_update
def update
@@ -22,7 +21,7 @@ class CustomWizard::StepsController < ::ApplicationController
if updater.success?
wizard_id = update_params[:wizard_id]
- builder = CustomWizard::Builder.new(wizard_id, current_user)
+ builder = CustomWizard::Builder.new(wizard_id, current_user, guest_id)
@wizard = builder.build(force: true)
current_step = @wizard.find_step(update[:step_id])
@@ -85,7 +84,6 @@ class CustomWizard::StepsController < ::ApplicationController
private
def ensure_can_update
- @builder = CustomWizard::Builder.new(update_params[:wizard_id], current_user)
raise Discourse::InvalidParameters.new(:wizard_id) if @builder.template.nil?
raise Discourse::InvalidAccess.new if !@builder.wizard || !@builder.wizard.can_access?
diff --git a/app/controllers/custom_wizard/wizard.rb b/app/controllers/custom_wizard/wizard.rb
index 7aafdd3b..dd4ea4ca 100644
--- a/app/controllers/custom_wizard/wizard.rb
+++ b/app/controllers/custom_wizard/wizard.rb
@@ -1,8 +1,5 @@
# frozen_string_literal: true
-class CustomWizard::WizardController < ::ApplicationController
- before_action :ensure_plugin_enabled
- before_action :ensure_logged_in, only: [:skip]
-
+class CustomWizard::WizardController < ::CustomWizard::WizardClientController
def show
if wizard.present?
render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
@@ -35,19 +32,8 @@ class CustomWizard::WizardController < ::ApplicationController
def wizard
@wizard ||= begin
- builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
- return nil unless builder.present?
- opts = {}
- opts[:reset] = params[:reset]
- builder.build(opts, params)
- end
- end
-
- private
-
- def ensure_plugin_enabled
- unless SiteSetting.custom_wizard_enabled
- redirect_to path("/")
+ return nil unless @builder.present?
+ @builder.build({ reset: params[:reset] }, params)
end
end
end
diff --git a/app/controllers/custom_wizard/wizard_client.rb b/app/controllers/custom_wizard/wizard_client.rb
new file mode 100644
index 00000000..e898852a
--- /dev/null
+++ b/app/controllers/custom_wizard/wizard_client.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+class CustomWizard::WizardClientController < ::ApplicationController
+ before_action :ensure_plugin_enabled
+ before_action :set_builder
+
+ private
+
+ def ensure_plugin_enabled
+ unless SiteSetting.custom_wizard_enabled
+ redirect_to path("/")
+ end
+ end
+
+ def guest_id
+ return nil if current_user.present?
+ cookies[:custom_wizard_guest_id] ||= CustomWizard::Wizard.generate_guest_id
+ cookies[:custom_wizard_guest_id]
+ end
+
+ def set_builder
+ @builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user, guest_id)
+ end
+end
diff --git a/app/serializers/custom_wizard/submission_serializer.rb b/app/serializers/custom_wizard/submission_serializer.rb
index 732d6743..ed9ad411 100644
--- a/app/serializers/custom_wizard/submission_serializer.rb
+++ b/app/serializers/custom_wizard/submission_serializer.rb
@@ -2,12 +2,15 @@
class CustomWizard::SubmissionSerializer < ApplicationSerializer
attributes :id,
:fields,
- :submitted_at
-
- has_one :user, serializer: ::BasicUserSerializer, embed: :objects
+ :submitted_at,
+ :user
def include_user?
- object.user.present?
+ object.wizard.user.present?
+ end
+
+ def user
+ ::BasicUserSerializer.new(object.wizard.user, root: false).as_json
end
def fields
diff --git a/assets/javascripts/discourse/components/custom-user-selector.js.es6 b/assets/javascripts/discourse/components/custom-user-selector.js.es6
index 3bb1fb3d..59711ec2 100644
--- a/assets/javascripts/discourse/components/custom-user-selector.js.es6
+++ b/assets/javascripts/discourse/components/custom-user-selector.js.es6
@@ -7,7 +7,7 @@ import userSearch from "discourse/lib/user-search";
import I18n from "I18n";
import Handlebars from "handlebars";
import { isEmpty } from "@ember/utils";
-import TextField from "@ember/component/text-field";
+import TextField from "discourse/components/text-field";
const template = function (params) {
const options = params.options;
diff --git a/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6 b/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
index 5e2ef424..e52f2382 100644
--- a/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
@@ -12,14 +12,16 @@ import { alias } from "@ember/object/computed";
import Site from "discourse/models/site";
import { uploadIcon } from "discourse/lib/uploads";
import { dasherize } from "@ember/string";
+import showModal from "discourse/lib/show-modal";
-const IMAGE_MARKDOWN_REGEX = /!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
+const IMAGE_MARKDOWN_REGEX =
+ /!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
export default ComposerEditor.extend({
+
classNameBindings: ["fieldClass"],
allowUpload: true,
showLink: false,
- showHyperlinkBox: false,
topic: null,
showToolbar: true,
focusTarget: "reply",
@@ -29,6 +31,7 @@ export default ComposerEditor.extend({
draftStatus: "null",
replyPlaceholder: alias("field.translatedPlaceholder"),
wizardEventFieldId: null,
+ composerEventPrefix: "wizard-editor",
@on("didInsertElement")
_composerEditorInit() {
@@ -77,24 +80,13 @@ export default ComposerEditor.extend({
$input.on("scroll", this._throttledSyncEditorAndPreviewScroll);
this._bindUploadTarget();
- const wizardEventNames = ["insert-text", "replace-text"];
- const eventPrefix = this.eventPrefix;
- this.appEvents.reopen({
- trigger(name, ...args) {
- let eventParts = name.split(":");
- let currentEventPrefix = eventParts[0];
- let currentEventName = eventParts[1];
+ const field = this.field;
+ this.editorInputClass = `.${dasherize(field.type)}-${dasherize(
+ field.id
+ )} .d-editor-input`;
- if (
- currentEventPrefix !== "wizard-editor" &&
- wizardEventNames.some((wen) => wen === currentEventName)
- ) {
- let wizardEventName = name.replace(eventPrefix, "wizard-editor");
- return this._super(wizardEventName, ...args);
- } else {
- return this._super(name, ...args);
- }
- },
+ this._uppyInstance.on("file-added", () => {
+ this.session.set("wizardEventFieldId", field.id);
});
},
@@ -116,12 +108,6 @@ export default ComposerEditor.extend({
return uploadIcon(false, this.siteSettings);
},
- click(e) {
- if ($(e.target).hasClass("wizard-composer-hyperlink")) {
- this.set("showHyperlinkBox", false);
- }
- },
-
@bind
_handleImageDeleteButtonClick(event) {
if (!event.target.classList.contains("delete-image-button")) {
@@ -132,9 +118,8 @@ export default ComposerEditor.extend({
event.target.closest(".button-wrapper").dataset.imageIndex,
10
);
- const matchingPlaceholder = this.get("composer.reply").match(
- IMAGE_MARKDOWN_REGEX
- );
+ const matchingPlaceholder =
+ this.get("composer.reply").match(IMAGE_MARKDOWN_REGEX);
this.session.set("wizardEventFieldId", this.field.id);
this.appEvents.trigger(
@@ -165,7 +150,7 @@ export default ComposerEditor.extend({
shortcut: "K",
trimLeading: true,
unshift: true,
- sendAction: () => component.set("showHyperlinkBox", true),
+ sendAction: (event) => component.send("showLinkModal", event),
});
if (this.siteSettings.mentionables_enabled) {
@@ -206,17 +191,17 @@ export default ComposerEditor.extend({
this._super(...arguments);
},
- addLink(linkName, linkUrl) {
- let link = `[${linkName}](${linkUrl})`;
- this.appEvents.trigger("wizard-editor:insert-text", {
- fieldId: this.field.id,
- text: link,
- });
- this.set("showHyperlinkBox", false);
- },
+ showLinkModal(toolbarEvent) {
+ let linkText = "";
+ this._lastSel = toolbarEvent.selected;
- hideBox() {
- this.set("showHyperlinkBox", false);
+ if (this._lastSel) {
+ linkText = this._lastSel.value;
+ }
+ showModal("insert-hyperlink").setProperties({
+ linkText,
+ toolbarEvent,
+ });
},
showUploadModal() {
diff --git a/assets/javascripts/discourse/components/custom-wizard-composer-hyperlink.js.es6 b/assets/javascripts/discourse/components/custom-wizard-composer-hyperlink.js.es6
deleted file mode 100644
index a56b7aff..00000000
--- a/assets/javascripts/discourse/components/custom-wizard-composer-hyperlink.js.es6
+++ /dev/null
@@ -1,15 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- classNames: ["wizard-composer-hyperlink"],
-
- actions: {
- addLink() {
- this.addLink(this.linkName, this.linkUrl);
- },
-
- hideBox() {
- this.hideBox();
- },
- },
-});
diff --git a/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6 b/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
index 9c8e4bff..2805c370 100644
--- a/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
@@ -3,6 +3,7 @@ import discourseComputed from "discourse-common/utils/decorators";
export default DateInput.extend({
useNativePicker: false,
+ classNameBindings: ["fieldClass"],
@discourseComputed()
placeholder() {
diff --git a/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6 b/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
index 44b675b0..1fcb62f5 100644
--- a/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
@@ -2,6 +2,8 @@ import DateTimeInput from "discourse/components/date-time-input";
import discourseComputed from "discourse-common/utils/decorators";
export default DateTimeInput.extend({
+ classNameBindings: ["fieldClass"],
+
@discourseComputed("timeFirst", "tabindex")
timeTabindex(timeFirst, tabindex) {
return timeFirst ? tabindex : tabindex + 1;
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
index 82f9c68b..1406d63b 100644
--- a/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
@@ -2,6 +2,8 @@ import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
+ classNameBindings: ["fieldClass"],
+
@observes("time")
setValue() {
this.set("field.value", this.time.format(this.field.format));
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
index eb5d318b..990d7daa 100644
--- a/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
@@ -4,7 +4,7 @@ import { computed } from "@ember/object";
export default Component.extend(UppyUploadMixin, {
classNames: ["wizard-field-upload"],
- classNameBindings: ["isImage"],
+ classNameBindings: ["isImage", "fieldClass"],
uploading: false,
type: computed(function () {
return `wizard_${this.field.id}`;
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
index 87d5ddb0..64741c6b 100644
--- a/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
@@ -1,3 +1,5 @@
import Component from "@ember/component";
-export default Component.extend({});
+export default Component.extend({
+ classNameBindings: ["fieldClass"],
+});
diff --git a/assets/javascripts/discourse/components/custom-wizard-step.js.es6 b/assets/javascripts/discourse/components/custom-wizard-step.js.es6
index b98db1ab..7c933771 100644
--- a/assets/javascripts/discourse/components/custom-wizard-step.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-step.js.es6
@@ -9,6 +9,7 @@ import CustomWizard, {
updateCachedWizard,
} from "discourse/plugins/discourse-custom-wizard/discourse/models/custom-wizard";
import { alias, not } from "@ember/object/computed";
+import discourseLater from "discourse-common/lib/later";
const alreadyWarned = {};
@@ -110,29 +111,22 @@ export default Component.extend({
},
autoFocus() {
- schedule("afterRender", () => {
- const $invalid = $(
- ".wizard-field.invalid:nth-of-type(1) .wizard-focusable"
- );
-
- if ($invalid.length) {
- return $invalid.focus();
- }
-
- $(".wizard-focusable:first").focus();
+ discourseLater(() => {
+ schedule("afterRender", () => {
+ if ($(".invalid .wizard-focusable").length) {
+ this.animateInvalidFields();
+ }
+ });
});
},
animateInvalidFields() {
schedule("afterRender", () => {
- let $element = $(
- ".invalid input[type=text],.invalid textarea,.invalid input[type=checkbox],.invalid .select-kit"
- );
-
- if ($element.length) {
+ let $invalid = $(".invalid .wizard-focusable");
+ if ($invalid.length) {
$([document.documentElement, document.body]).animate(
{
- scrollTop: $element.offset().top - 200,
+ scrollTop: $invalid.offset().top - 200,
},
400
);
diff --git a/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6 b/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
index 32a1fd6a..8d439aa4 100644
--- a/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
@@ -4,7 +4,10 @@ export default TagChooser.extend({
searchTags(url, data, callback) {
if (this.tagGroups) {
let tagGroupsString = this.tagGroups.join(",");
- data.tag_groups = tagGroupsString;
+ data.filterForInput = {
+ name: "custom-wizard-tag-chooser",
+ groups: tagGroupsString,
+ };
}
return this._super(url, data, callback);
diff --git a/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6 b/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
index e8c22e93..d2832282 100644
--- a/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
@@ -1,7 +1,7 @@
import computed from "discourse-common/utils/decorators";
import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction";
import I18n from "I18n";
-import TextField from "@ember/component/text-field";
+import TextField from "discourse/components/text-field";
export default TextField.extend({
attributeBindings: [
diff --git a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
index a257ed12..e19e4917 100644
--- a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
+++ b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
@@ -15,6 +15,7 @@ import {
import Component from "@ember/component";
import { bind, later } from "@ember/runloop";
import I18n from "I18n";
+import Subscription from "../mixins/subscription";
const customFieldActionMap = {
topic: ["create_topic", "send_message"],
@@ -26,7 +27,7 @@ const customFieldActionMap = {
const values = ["present", "true", "false"];
-export default Component.extend({
+export default Component.extend(Subscription, {
classNameBindings: [":mapper-selector", "activeType"],
showText: computed("activeType", function () {
@@ -116,6 +117,9 @@ export default Component.extend({
groupEnabled: computed("options.groupSelection", "inputType", function () {
return this.optionEnabled("groupSelection");
}),
+ guestGroup: computed("options.guestGroup", "inputType", function () {
+ return this.optionEnabled("guestGroup");
+ }),
userEnabled: computed("options.userSelection", "inputType", function () {
return this.optionEnabled("userSelection");
}),
@@ -126,7 +130,29 @@ export default Component.extend({
return this.connector === "is";
}),
- groups: alias("site.groups"),
+ @discourseComputed("site.groups", "guestGroup", "subscriptionType")
+ groups(groups, guestGroup, subscriptionType) {
+ let result = groups;
+ if (!guestGroup) {
+ return result;
+ }
+
+ if (["standard", "business"].includes(subscriptionType)) {
+ let guestIndex;
+ result.forEach((r, index) => {
+ if (r.id === 0) {
+ r.name = I18n.t("admin.wizard.selector.label.users");
+ guestIndex = index;
+ }
+ });
+ result.splice(guestIndex, 0, {
+ id: -1,
+ name: I18n.t("admin.wizard.selector.label.guests"),
+ });
+ }
+
+ return result;
+ },
categories: alias("site.categories"),
showComboBox: or(
"showWizardField",
diff --git a/assets/javascripts/discourse/components/wizard-mapper.js.es6 b/assets/javascripts/discourse/components/wizard-mapper.js.es6
index 95aabb1c..ec58e3f2 100644
--- a/assets/javascripts/discourse/components/wizard-mapper.js.es6
+++ b/assets/javascripts/discourse/components/wizard-mapper.js.es6
@@ -32,6 +32,7 @@ export default Component.extend({
pairConnector: options.pairConnector || null,
outputConnector: options.outputConnector || null,
context: options.context || null,
+ guestGroup: options.guestGroup || false,
};
let inputTypes = ["key", "value", "output"];
diff --git a/assets/javascripts/discourse/components/wizard-subscription-container.js.es6 b/assets/javascripts/discourse/components/wizard-subscription-container.js.es6
index 5cc6b17c..3a1eac9c 100644
--- a/assets/javascripts/discourse/components/wizard-subscription-container.js.es6
+++ b/assets/javascripts/discourse/components/wizard-subscription-container.js.es6
@@ -7,7 +7,7 @@ export default Component.extend(Subscription, {
@discourseComputed("subscribed")
subscribedIcon(subscribed) {
- return subscribed ? "check" : "dash";
+ return subscribed ? "check" : "times";
},
@discourseComputed("subscribed")
diff --git a/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6 b/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6
index 53f7d19c..351b5782 100644
--- a/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6
+++ b/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6
@@ -1,6 +1,6 @@
import SingleSelectComponent from "select-kit/components/single-select";
import Subscription from "../mixins/subscription";
-import wizardSchema from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
+import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
import discourseComputed from "discourse-common/utils/decorators";
import I18n from "I18n";
@@ -40,9 +40,9 @@ export default SingleSelectComponent.extend(Subscription, {
return allowedTypes;
},
- @discourseComputed("feature", "attribute")
+ @discourseComputed("feature", "attribute", "wizard.allowGuests")
content(feature, attribute) {
- return wizardSchema[feature][attribute]
+ return filterValues(this.wizard, feature, attribute)
.map((value) => {
let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
feature,
diff --git a/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs b/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
index f893d4ac..0aef2dcb 100644
--- a/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
+++ b/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
@@ -4,4 +4,4 @@
{{#if wizardErrorNotice}}
{{d-icon "exclaimation-circle"}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
index 5ce96f2f..2c6a6975 100644
--- a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
+++ b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
@@ -9,8 +9,7 @@
value=wizardListVal
content=wizardList
onChange=(action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
index 70c0b7c4..10057345 100644
--- a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
+++ b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
@@ -1,7 +1,10 @@
{{#each site.complete_custom_wizard as |wizard|}}
-{{/each}}
+{{/each}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
index b89cc447..c08e820c 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
@@ -4,6 +4,7 @@ import CustomWizardApi from "../models/custom-wizard-api";
import { default as discourseComputed } from "discourse-common/utils/decorators";
import { and, equal, not } from "@ember/object/computed";
import { selectKitContent } from "../lib/wizard";
+import { underscore } from "@ember/string";
import Controller from "@ember/controller";
import I18n from "I18n";
@@ -20,29 +21,8 @@ export default Controller.extend({
"application/x-www-form-urlencoded",
]),
successCodes: selectKitContent([
- 100,
- 101,
- 102,
- 200,
- 201,
- 202,
- 203,
- 204,
- 205,
- 206,
- 207,
- 208,
- 226,
- 300,
- 301,
- 302,
- 303,
- 303,
- 304,
- 305,
- 306,
- 307,
- 308,
+ 100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301,
+ 302, 303, 303, 304, 305, 306, 307, 308,
]),
@discourseComputed(
@@ -118,7 +98,7 @@ export default Controller.extend({
if (authType === "oauth_2") {
this.set("authorizing", true);
- ajax(`/admin/wizards/apis/${name.underscore()}/authorize`)
+ ajax(`/admin/wizards/apis/${underscore(name)}/authorize`)
.catch(popupAjaxError)
.then((result) => {
if (result.success) {
@@ -187,11 +167,11 @@ export default Controller.extend({
if (!api[rp]) {
let key = rp.replace("auth", "");
error = `${I18n.t(
- `admin.wizard.api.auth.${key.underscore()}`
+ `admin.wizard.api.auth.${underscore(key)}`
)} is required for ${authType}`;
break;
}
- data[rp.underscore()] = api[rp];
+ data[underscore(rp)] = api[rp];
}
}
@@ -221,7 +201,7 @@ export default Controller.extend({
this.set("updating", true);
- ajax(`/admin/wizards/api/${name.underscore()}`, {
+ ajax(`/admin/wizards/api/${underscore(name)}`, {
type: "PUT",
data,
})
@@ -244,7 +224,7 @@ export default Controller.extend({
this.set("updating", true);
- ajax(`/admin/wizards/api/${name.underscore()}`, {
+ ajax(`/admin/wizards/api/${underscore(name)}`, {
type: "DELETE",
})
.catch(popupAjaxError)
@@ -262,7 +242,7 @@ export default Controller.extend({
return;
}
- ajax(`/admin/wizards/api/${name.underscore()}/logs`, {
+ ajax(`/admin/wizards/api/${underscore(name)}/logs`, {
type: "DELETE",
})
.catch(popupAjaxError)
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
index c9a80e0e..75ea0ff7 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
@@ -10,6 +10,7 @@ import { later, scheduleOnce } from "@ember/runloop";
import Controller from "@ember/controller";
import copyText from "discourse/lib/copy-text";
import I18n from "I18n";
+import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
export default Controller.extend({
hasName: notEmpty("wizard.name"),
@@ -59,6 +60,19 @@ export default Controller.extend({
}
return wizardFieldList(steps);
},
+
+ @discourseComputed("fieldTypes", "wizard.allowGuests")
+ filteredFieldTypes(fieldTypes) {
+ const fieldTypeIds = fieldTypes.map((f) => f.id);
+ const allowedTypeIds = filterValues(
+ this.wizard,
+ "field",
+ "type",
+ fieldTypeIds
+ );
+ return fieldTypes.filter((f) => allowedTypeIds.includes(f.id));
+ },
+
getErrorMessage(result) {
if (result.backend_validation_error) {
return result.backend_validation_error;
diff --git a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 b/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6
index 4ea22d38..b8f51d1f 100644
--- a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6
+++ b/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6
@@ -5,7 +5,10 @@ export default Controller.extend({
title: "admin.wizard.after_time_modal.title",
setup() {
- this.set("bufferedDateTime", moment(this.model.dateTime));
+ this.set(
+ "bufferedDateTime",
+ this.model.dateTime ? moment(this.model.dateTime) : moment(Date.now())
+ );
},
@discourseComputed("bufferedDateTime")
diff --git a/assets/javascripts/discourse/helpers/char-counter.js.es6 b/assets/javascripts/discourse/helpers/char-counter.js.es6
deleted file mode 100644
index a700a432..00000000
--- a/assets/javascripts/discourse/helpers/char-counter.js.es6
+++ /dev/null
@@ -1,22 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import I18n from "I18n";
-import Handlebars from "handlebars";
-
-export default registerUnbound("char-counter", function (body, maxLength) {
- let bodyLength = body ? body.length : 0;
- let finalString;
-
- if (maxLength) {
- let isOverMax = bodyLength > maxLength ? "true" : "false";
- finalString = `${bodyLength} / ${I18n.t(
- "wizard.x_characters",
- { count: parseInt(maxLength, 10) }
- )}
`;
- } else {
- finalString = `${I18n.t("wizard.x_characters", {
- count: parseInt(bodyLength, 10),
- })}
`;
- }
-
- return new Handlebars.SafeString(finalString);
-});
diff --git a/assets/javascripts/discourse/helpers/wizard-char-counter.js.es6 b/assets/javascripts/discourse/helpers/wizard-char-counter.js.es6
new file mode 100644
index 00000000..1e194314
--- /dev/null
+++ b/assets/javascripts/discourse/helpers/wizard-char-counter.js.es6
@@ -0,0 +1,25 @@
+import { registerUnbound } from "discourse-common/lib/helpers";
+import I18n from "I18n";
+import Handlebars from "handlebars";
+
+export default registerUnbound(
+ "wizard-char-counter",
+ function (body, maxLength) {
+ let bodyLength = body ? body.length : 0;
+ let finalString;
+
+ if (maxLength) {
+ let isOverMax = bodyLength > maxLength ? "true" : "false";
+ finalString = `${bodyLength} / ${I18n.t(
+ "wizard.x_characters",
+ { count: parseInt(maxLength, 10) }
+ )}
`;
+ } else {
+ finalString = `${I18n.t("wizard.x_characters", {
+ count: parseInt(bodyLength, 10),
+ })}
`;
+ }
+
+ return new Handlebars.SafeString(finalString);
+ }
+);
diff --git a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
index 2d13e703..c974fafb 100644
--- a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
+++ b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
@@ -69,7 +69,10 @@ export default {
},
_wizardInsertText(text, options) {
- if (this.session.wizardEventFieldId === this.fieldId) {
+ if (
+ this.session.wizardEventFieldId === this.fieldId &&
+ this.element
+ ) {
this.insertText(text, options);
}
},
diff --git a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
index 5667bdf8..70676bb0 100644
--- a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
+++ b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
@@ -1,14 +1,16 @@
-import ApplicationRoute from "discourse/routes/application";
+import DiscourseURL from "discourse/lib/url";
+import { withPluginApi } from "discourse/lib/plugin-api";
+import { dasherize } from "@ember/string";
export default {
name: "custom-wizard-redirect",
after: "message-bus",
- initialize: function (container) {
+ initialize(container) {
const messageBus = container.lookup("service:message-bus");
const siteSettings = container.lookup("service:site-settings");
- if (!siteSettings.custom_wizard_enabled || !messageBus) {
+ if (!siteSettings.custom_wizard_enabled) {
return;
}
@@ -17,28 +19,26 @@ export default {
window.location.href = wizardUrl;
});
- ApplicationRoute.reopen({
- actions: {
- willTransition(transition) {
- const redirectToWizard = this.get("currentUser.redirect_to_wizard");
- const excludedPaths = this.siteSettings.wizard_redirect_exclude_paths
+ withPluginApi("0.8.36", (api) => {
+ api.onAppEvent("page:changed", (data) => {
+ const currentUser = api.getCurrentUser();
+
+ if (currentUser) {
+ const redirectToWizard = currentUser.redirect_to_wizard;
+ const excludedPaths = siteSettings.wizard_redirect_exclude_paths
.split("|")
.concat(["loading"]);
-
if (
redirectToWizard &&
- (!transition.intent.name ||
- !excludedPaths.find((p) => {
- return transition.intent.name.indexOf(p) > -1;
- }))
+ data.currentRouteName !== "customWizardStep" &&
+ !excludedPaths.find((p) => {
+ return data.currentRouteName.indexOf(p) > -1;
+ })
) {
- transition.abort();
- window.location = "/w/" + redirectToWizard.dasherize();
+ DiscourseURL.routeTo(`/w/${dasherize(redirectToWizard)}`);
}
-
- return this._super(transition);
- },
- },
+ }
+ });
});
},
};
diff --git a/assets/javascripts/discourse/lib/wizard-mapper.js.es6 b/assets/javascripts/discourse/lib/wizard-mapper.js.es6
index c398eaf4..9037bec5 100644
--- a/assets/javascripts/discourse/lib/wizard-mapper.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-mapper.js.es6
@@ -35,6 +35,7 @@ function inputTypesContent(options = {}) {
const connectors = {
pair: [
"equal",
+ "not_equal",
"greater",
"less",
"greater_or_equal",
diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6
index 8c3323ff..47257d82 100644
--- a/assets/javascripts/discourse/lib/wizard-schema.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6
@@ -72,6 +72,7 @@ const field = {
required: null,
type: null,
condition: null,
+ tag_groups: null,
},
types: {},
mapped: ["prefill", "content", "condition", "index"],
@@ -210,11 +211,42 @@ const action = {
objectArrays: {},
};
+const filters = {
+ allow_guests: {
+ field: {
+ type: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "url",
+ "dropdown",
+ "tag",
+ "category",
+ "group",
+ "user_selector",
+ ],
+ },
+ action: {
+ type: ["route_to", "send_message"],
+ },
+ },
+};
+
const custom_field = {
klass: ["topic", "post", "group", "category"],
type: ["string", "boolean", "integer", "json"],
};
+export function buildFieldTypes(types) {
+ wizardSchema.field.types = types;
+ wizardSchema.field.type = Object.keys(types);
+}
+
field.type = Object.keys(field.types);
action.type = Object.keys(action.types);
@@ -224,16 +256,29 @@ const wizardSchema = {
field,
custom_field,
action,
+ filters,
};
-export function buildFieldTypes(types) {
- wizardSchema.field.types = types;
-}
-
export function buildFieldValidations(validations) {
wizardSchema.field.validations = validations;
}
+export function filterValues(currentWizard, feature, attribute, values = null) {
+ values = values || wizardSchema[feature][attribute];
+
+ if (currentWizard && currentWizard.allowGuests) {
+ const filteredFeature = wizardSchema.filters.allow_guests[feature];
+ if (filteredFeature) {
+ const filtered = filteredFeature[attribute];
+ if (filtered) {
+ values = values.filter((v) => filtered.includes(v));
+ }
+ }
+ }
+
+ return values;
+}
+
const siteSettings = getOwner(this).lookup("service:site-settings");
if (siteSettings.wizard_apis_enabled) {
wizardSchema.action.types.send_to_api = {
diff --git a/assets/javascripts/discourse/mixins/undo-changes.js.es6 b/assets/javascripts/discourse/mixins/undo-changes.js.es6
index b2ab322d..e98cfb0e 100644
--- a/assets/javascripts/discourse/mixins/undo-changes.js.es6
+++ b/assets/javascripts/discourse/mixins/undo-changes.js.es6
@@ -4,6 +4,8 @@ import { get, set } from "@ember/object";
import Mixin from "@ember/object/mixin";
import { deepEqual } from "discourse-common/lib/object";
+const observedCache = [];
+
export default Mixin.create({
didInsertElement() {
this._super(...arguments);
@@ -32,7 +34,13 @@ export default Mixin.create({
};
listProperties(componentType, opts).forEach((property) => {
- obj.removeObserver(property, this, this.toggleUndo);
+ if (observedCache.includes(property)) {
+ obj.removeObserver(property, this, this.toggleUndo);
+ let index = observedCache.indexOf(property);
+ if (index !== -1) {
+ observedCache.splice(index, 1);
+ }
+ }
});
},
@@ -45,6 +53,9 @@ export default Mixin.create({
};
listProperties(componentType, opts).forEach((property) => {
+ if (observedCache.indexOf(property) === -1) {
+ observedCache.push(property);
+ }
obj.addObserver(property, this, this.toggleUndo);
});
},
diff --git a/assets/javascripts/discourse/models/custom-wizard-admin.js.es6 b/assets/javascripts/discourse/models/custom-wizard-admin.js.es6
index 65c7aa7f..afca4833 100644
--- a/assets/javascripts/discourse/models/custom-wizard-admin.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-admin.js.es6
@@ -5,8 +5,20 @@ import wizardSchema from "../lib/wizard-schema";
import { Promise } from "rsvp";
import { ajax } from "discourse/lib/ajax";
import { popupAjaxError } from "discourse/lib/ajax-error";
+import discourseComputed from "discourse-common/utils/decorators";
+
+const GUEST_GROUP_ID = -1;
const CustomWizardAdmin = EmberObject.extend({
+ @discourseComputed("permitted.@each.output")
+ allowGuests(permitted) {
+ return (
+ permitted &&
+ permitted.filter((p) => p.output && p.output.includes(GUEST_GROUP_ID))
+ .length
+ );
+ },
+
save(opts) {
return new Promise((resolve, reject) => {
let wizard = this.buildJson(this, "wizard");
diff --git a/assets/javascripts/discourse/models/custom-wizard-field.js.es6 b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
index a03c7c9e..2afe79d9 100644
--- a/assets/javascripts/discourse/models/custom-wizard-field.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
@@ -72,7 +72,7 @@ export default EmberObject.extend(ValidState, {
valid = true;
}
- this.setValid(valid);
+ this.setValid(Boolean(valid));
return valid;
},
diff --git a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
index 6c0ed7a8..bfe90f72 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
@@ -10,6 +10,12 @@ export default DiscourseRoute.extend({
}
},
+ afterModel(model) {
+ if (model === null) {
+ return this.transitionTo("adminWizardsApi");
+ }
+ },
+
setupController(controller, model) {
controller.set("api", model);
},
diff --git a/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6
index 474360ec..e1f53c8f 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6
@@ -7,6 +7,12 @@ export default DiscourseRoute.extend({
return CustomWizardLogs.list(params.wizardId);
},
+ afterModel(model) {
+ if (model === null) {
+ return this.transitionTo("adminWizardsLogs");
+ }
+ },
+
setupController(controller, model) {
controller.setProperties({
wizard: model.wizard,
diff --git a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
index b616b5be..b9dbd90f 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
@@ -8,6 +8,12 @@ export default DiscourseRoute.extend({
return CustomWizardAdmin.submissions(params.wizardId);
},
+ afterModel(model) {
+ if (model === null) {
+ return this.transitionTo("adminWizardsSubmissions");
+ }
+ },
+
setupController(controller, model) {
const { fields, submissions } = formatModel(model);
diff --git a/assets/javascripts/discourse/routes/custom-wizard-index.js.es6 b/assets/javascripts/discourse/routes/custom-wizard-index.js.es6
index 1d5a71c7..5ffe83c6 100644
--- a/assets/javascripts/discourse/routes/custom-wizard-index.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard-index.js.es6
@@ -4,13 +4,7 @@ import Route from "@ember/routing/route";
export default Route.extend({
beforeModel() {
const wizard = getCachedWizard();
- if (
- wizard &&
- wizard.user &&
- wizard.permitted &&
- !wizard.completed &&
- wizard.start
- ) {
+ if (wizard && wizard.permitted && !wizard.completed && wizard.start) {
this.replaceWith("customWizardStep", wizard.start);
}
},
@@ -26,7 +20,7 @@ export default Route.extend({
const wizardId = model.get("id");
const user = model.get("user");
const name = model.get("name");
- const requiresLogin = !user;
+ const requiresLogin = !user && !permitted;
const notPermitted = !permitted;
const props = {
diff --git a/assets/javascripts/discourse/routes/custom-wizard-step.js.es6 b/assets/javascripts/discourse/routes/custom-wizard-step.js.es6
index 969df1eb..a882340b 100644
--- a/assets/javascripts/discourse/routes/custom-wizard-step.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard-step.js.es6
@@ -1,13 +1,15 @@
import I18n from "I18n";
import { getCachedWizard } from "../models/custom-wizard";
import Route from "@ember/routing/route";
+import { scrollTop } from "discourse/mixins/scroll-top";
+import { action } from "@ember/object";
export default Route.extend({
beforeModel() {
const wizard = getCachedWizard();
this.set("wizard", wizard);
- if (!wizard || !wizard.user || !wizard.permitted || wizard.completed) {
+ if (!wizard || !wizard.permitted || wizard.completed) {
this.replaceWith("customWizard");
}
},
@@ -48,4 +50,10 @@ export default Route.extend({
controller.setProperties(props);
},
+
+ @action
+ didTransition() {
+ scrollTop();
+ return true;
+ },
});
diff --git a/assets/javascripts/discourse/routes/custom-wizard.js.es6 b/assets/javascripts/discourse/routes/custom-wizard.js.es6
index d03714a2..1a214a2d 100644
--- a/assets/javascripts/discourse/routes/custom-wizard.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard.js.es6
@@ -1,6 +1,7 @@
import { findCustomWizard, updateCachedWizard } from "../models/custom-wizard";
import I18n from "I18n";
import DiscourseRoute from "discourse/routes/discourse";
+import bootbox from "bootbox";
export default DiscourseRoute.extend({
titleToken() {
diff --git a/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
index 303b3f6d..5270aa28 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
@@ -8,7 +8,12 @@
{{/if}}
{{/if}}
- {{d-button label="admin.wizard.api.save" action=(action "save") class="btn-primary" disabled=saveDisabled}}
+ {{d-button
+ label="admin.wizard.api.save"
+ action=(action "save")
+ class="btn-primary"
+ disabled=saveDisabled
+ }}
{{#if showRemove}}
{{d-button action=(action "remove") label="admin.wizard.api.remove"}}
@@ -32,13 +37,19 @@
@@ -104,7 +116,7 @@
{{/if}}
@@ -112,21 +124,21 @@
@@ -135,12 +147,26 @@
{{/if}}
@@ -149,14 +175,14 @@
{{/if}}
@@ -225,7 +251,11 @@
- {{d-button action=(action "addEndpoint") label="admin.wizard.api.endpoint.add" icon="plus"}}
+ {{d-button
+ action=(action "addEndpoint")
+ label="admin.wizard.api.endpoint.add"
+ icon="plus"
+ }}
{{#if api.endpoints}}
@@ -235,38 +265,43 @@
@@ -284,7 +319,8 @@
{{d-button
action=(action "clearLogs")
class="clear-logs"
- label="admin.wizard.api.log.clear"}}
+ label="admin.wizard.api.log.clear"
+ }}
@@ -304,7 +340,10 @@
{{logentry.time}}
{{logentry.status}}
@@ -315,4 +354,4 @@
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-api.hbs b/assets/javascripts/discourse/templates/admin-wizards-api.hbs
index af91d0fb..6a6c5832 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-api.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-api.hbs
@@ -3,16 +3,16 @@
value=apiName
content=apiList
onChange=(route-action "changeApi")
- options=(hash
- none="admin.wizard.api.select"
- )}}
+ options=(hash none="admin.wizard.api.select")
+ }}
{{d-button
action=(route-action "createApi")
label="admin.wizard.api.create"
- icon="plus"}}
+ icon="plus"
+ }}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
index a90f6299..4dda0ac8 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
@@ -5,7 +5,8 @@
{{d-button
label="admin.wizard.custom_field.add"
icon="plus"
- action=(action "addField")}}
+ action=(action "addField")
+ }}
@@ -14,7 +15,8 @@
opts=messageOpts
type=messageType
url=documentationUrl
- component="custom_fields"}}
+ component="custom_fields"
+}}
{{#if customFields}}
@@ -32,9 +34,10 @@
{{custom-field-input
field=field
removeField=(action "removeField")
- saveField=(action "saveField")}}
+ saveField=(action "saveField")
+ }}
{{/each}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs
index 270d5c21..deb7ed8b 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs
@@ -9,7 +9,8 @@
label="refresh"
icon="sync"
action=(action "refresh")
- class="refresh"}}
+ class="refresh"
+ }}
@@ -31,7 +32,10 @@
{{#each logs as |log|}}
{{#each-in log as |field value|}}
- {{wizard-table-field field=field value=value}}
+ {{wizard-table-field
+ field=field
+ value=value
+ }}
{{/each-in}}
{{/each}}
@@ -42,4 +46,4 @@
{{conditional-loading-spinner condition=refreshing}}
{{/load-more}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-logs.hbs b/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
index 45738a9f..703f4fa3 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
@@ -3,17 +3,17 @@
value=wizardId
content=wizardList
onChange=(route-action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
{{wizard-message
key=messageKey
opts=messageOpts
url=documentationUrl
- component="logs"}}
+ component="logs"
+}}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-manager.hbs b/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
index 4b91bd3d..f2de0783 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
@@ -11,30 +11,35 @@
{{/if}}
- {{input
+
{{d-button
id="upload-button"
label="admin.wizard.manager.upload"
- action=(action "upload")}}
+ action=(action "upload")
+ }}
{{d-button
id="import-button"
label="admin.wizard.manager.import"
action=(action "import")
- disabled=importDisabled}}
+ disabled=importDisabled
+ }}
{{d-button
id="export-button"
label="admin.wizard.manager.export"
action=(action "export")
- disabled=exportDisabled}}
+ disabled=exportDisabled
+ }}
{{d-button
id="destroy-button"
label="admin.wizard.manager.destroy"
action=(action "destroy")
- disabled=destoryDisabled}}
+ disabled=destoryDisabled
+ }}
@@ -45,7 +50,8 @@
opts=messageOpts
items=messageItems
loading=loading
- component="manager"}}
+ component="manager"
+}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
index 72ec7c38..96a24a9d 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
@@ -58,4 +58,4 @@
{{conditional-loading-spinner condition=loadingMore}}
{{/load-more}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs b/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
index 07dd1682..1ccaa3b8 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
@@ -3,17 +3,17 @@
value=wizardId
content=wizardList
onChange=(route-action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
{{wizard-message
key=messageKey
opts=messageOpts
url=documentationUrl
- component="submissions"}}
+ component="submissions"
+}}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
index 11a2b415..053deb73 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
@@ -1,18 +1,31 @@
{{#if wizard}}
@@ -23,11 +36,12 @@
{{i18n "admin.wizard.background"}}
- {{input
+
@@ -41,9 +55,8 @@
valueProperty="id"
value=wizard.theme_id
onChange=(action (mut wizard.theme_id))
- options=(hash
- none="admin.wizard.no_theme"
- )}}
+ options=(hash none="admin.wizard.no_theme")
+ }}
@@ -58,7 +71,7 @@
{{i18n "admin.wizard.save_submissions"}}
- {{input type="checkbox" checked=wizard.save_submissions}}
+
{{i18n "admin.wizard.save_submissions_label"}}
@@ -68,7 +81,7 @@
{{i18n "admin.wizard.multiple_submissions"}}
- {{input type="checkbox" checked=wizard.multiple_submissions}}
+
{{i18n "admin.wizard.multiple_submissions_label"}}
@@ -78,7 +91,7 @@
{{i18n "admin.wizard.after_signup"}}
- {{input type="checkbox" checked=wizard.after_signup}}
+
{{i18n "admin.wizard.after_signup_label"}}
@@ -88,7 +101,7 @@
{{i18n "admin.wizard.prompt_completion"}}
- {{input type="checkbox" checked=wizard.prompt_completion}}
+
{{i18n "admin.wizard.prompt_completion_label"}}
@@ -98,13 +111,14 @@
{{i18n "admin.wizard.after_time"}}
- {{input type="checkbox" checked=wizard.after_time}}
+
{{i18n "admin.wizard.after_time_label"}}
{{d-button
action=(action "setNextSessionScheduled")
translatedLabel=nextSessionScheduledLabel
class="btn-after-time"
- icon="far-calendar"}}
+ icon="far-calendar"
+ }}
@@ -114,7 +128,7 @@
{{i18n "admin.wizard.required"}}
- {{input type="checkbox" checked=wizard.required}}
+
{{i18n "admin.wizard.required_label"}}
@@ -124,7 +138,7 @@
{{i18n "admin.wizard.restart_on_revisit"}}
- {{input type="checkbox" checked=wizard.restart_on_revisit}}
+
{{i18n "admin.wizard.restart_on_revisit_label"}}
@@ -140,19 +154,18 @@
context="wizard"
inputTypes="assignment,validation"
groupSelection="output"
+ guestGroup=true
userFieldSelection="key"
textSelection="value"
inputConnector="and"
- )}}
+ )
+ }}
{{/wizard-subscription-container}}
- {{wizard-links
- itemType="step"
- current=currentStep
- items=wizard.steps}}
+ {{wizard-links itemType="step" current=currentStep items=wizard.steps}}
{{#if currentStep}}
{{wizard-custom-step
@@ -160,15 +173,17 @@
wizard=wizard
currentField=currentField
wizardFields=wizardFields
- fieldTypes=fieldTypes
- subscribed=subscribed}}
+ fieldTypes=filteredFieldTypes
+ subscribed=subscribed
+ }}
{{/if}}
{{wizard-links
itemType="action"
current=currentAction
items=wizard.actions
- generateLabels=true}}
+ generateLabels=true
+ }}
{{#each wizard.actions as |wizardAction|}}
{{wizard-custom-action
@@ -178,11 +193,17 @@
apis=apis
removeAction="removeAction"
wizardFields=wizardFields
- fieldTypes=fieldTypes}}
+ fieldTypes=filteredFieldTypes
+ }}
{{/each}}
-
+
{{i18n "admin.wizard.save"}}
@@ -198,4 +219,4 @@
{{d-icon "times"}}{{error}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs b/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
index c96f8009..7a33dac1 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
@@ -3,21 +3,18 @@
value=wizardListVal
content=wizardList
onChange=(route-action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
{{d-button
action=(route-action "createWizard")
label="admin.wizard.create"
- icon="plus"}}
+ icon="plus"
+ }}
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="wizard"}}
+{{wizard-message key=messageKey url=messageUrl component="wizard"}}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards.hbs b/assets/javascripts/discourse/templates/admin-wizards.hbs
index cea77942..452193b1 100644
--- a/assets/javascripts/discourse/templates/admin-wizards.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards.hbs
@@ -1,12 +1,21 @@
{{#admin-nav}}
{{nav-item route="adminWizardsWizard" label="admin.wizard.nav_label"}}
- {{nav-item route="adminWizardsCustomFields" label="admin.wizard.custom_field.nav_label"}}
- {{nav-item route="adminWizardsSubmissions" label="admin.wizard.submissions.nav_label"}}
+ {{nav-item
+ route="adminWizardsCustomFields"
+ label="admin.wizard.custom_field.nav_label"
+ }}
+ {{nav-item
+ route="adminWizardsSubmissions"
+ label="admin.wizard.submissions.nav_label"
+ }}
{{#if showApi}}
{{nav-item route="adminWizardsApi" label="admin.wizard.api.nav_label"}}
{{/if}}
{{nav-item route="adminWizardsLogs" label="admin.wizard.log.nav_label"}}
- {{nav-item route="adminWizardsManager" label="admin.wizard.manager.nav_label"}}
+ {{nav-item
+ route="adminWizardsManager"
+ label="admin.wizard.manager.nav_label"
+ }}
{{wizard-subscription-badge}}
@@ -16,4 +25,4 @@
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-field-input.hbs b/assets/javascripts/discourse/templates/components/custom-field-input.hbs
index c0bdaaff..4e3fa2f0 100644
--- a/assets/javascripts/discourse/templates/components/custom-field-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-field-input.hbs
@@ -5,9 +5,8 @@
feature="custom_field"
attribute="klass"
onChange=(action (mut field.klass))
- options=(hash
- none="admin.wizard.custom_field.klass.select"
- )}}
+ options=(hash none="admin.wizard.custom_field.klass.select")
+ }}
{{wizard-subscription-selector
@@ -15,23 +14,22 @@
feature="custom_field"
attribute="type"
onChange=(action (mut field.type))
- options=(hash
- none="admin.wizard.custom_field.type.select"
- )}}
+ options=(hash none="admin.wizard.custom_field.type.select")
+ }}
- {{input
- value=field.name
- placeholder=(i18n "admin.wizard.custom_field.name.select")}}
+
{{multi-select
value=field.serializers
content=serializerContent
onChange=(action (mut field.serializers))
- options=(hash
- none="admin.wizard.custom_field.serializers.select"
- )}}
+ options=(hash none="admin.wizard.custom_field.serializers.select")
+ }}
{{#if loading}}
@@ -45,16 +43,15 @@
action=(action "destroy")
icon="trash-alt"
class="destroy"
- disabled=destroyDisabled}}
+ disabled=destroyDisabled
+ }}
{{d-button
icon="save"
action=(action "save")
disabled=saveDisabled
- class="save"}}
- {{d-button
- action=(action "close")
- icon="times"
- disabled=closeDisabled}}
+ class="save"
+ }}
+ {{d-button action=(action "close") icon="times" disabled=closeDisabled}}
{{else}}
{{field.klass}}
@@ -80,4 +77,4 @@
{{d-button action=(action "edit") icon="pencil-alt"}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
index baa6a17a..70286603 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
@@ -14,7 +14,8 @@
wizardComposer=true
fieldId=field.id
disabled=disableTextarea
- outletArgs=(hash composer=composer editorType="composer")}}
+ outletArgs=(hash composer=composer editorType="composer")
+}}
+/>
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-composer-hyperlink.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-composer-hyperlink.hbs
deleted file mode 100644
index f430fb59..00000000
--- a/assets/javascripts/discourse/templates/components/custom-wizard-composer-hyperlink.hbs
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
{{i18n "composer.link_dialog_title"}}
- {{input
- class="composer-link-name"
- placeholder=(i18n "composer.link_optional_text")
- type="text"
- value=linkName}}
- {{input
- class="composer-link-url"
- placeholder=(i18n "composer.link_url_placeholder")
- type="text"
- value=linkUrl}}
- {{d-button
- label="wizard_composer.modal_ok"
- class="add-link btn-primary"
- click=(action "addLink")}}
- {{d-button
- label="wizard_composer.modal_cancel"
- class="hide-hyperlink-box btn-danger"
- click=(action "hideBox")}}
-
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs
index 3b776215..3f1cc4c6 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs
@@ -1,11 +1,11 @@
-{{input
- type=inputType
+
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
index 4fed9c95..051ce6f8 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
@@ -26,9 +26,5 @@
{{/if}}
{{#if clearable}}
- {{d-button
- class="clear-date-time"
- icon="times"
- action=(action "onClear")
- }}
-{{/if}}
+ {{d-button class="clear-date-time" icon="times" action=(action "onClear")}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
index 5c1cc45b..fd10299c 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
@@ -2,7 +2,7 @@
{{#if showPreview}}
-
+
{{html-safe preview}}
@@ -18,13 +18,16 @@
onExpand=(action b.action b)
class=b.className
content=popupMenuOptions
- options=(hash
- popupTitle=b.title
- icon=b.icon
- )}}
+ options=(hash popupTitle=b.title icon=b.icon)
+ }}
{{else}}
{{d.icon}}
-
+
{{d-icon b.icon}}
{{#if b.label}}
{{i18n b.label}}
@@ -40,7 +43,12 @@
{{conditional-loading-spinner condition=loading}}
- {{textarea tabindex=tabindex value=value class="d-editor-input" placeholder=placeholder}}
+
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs
index 9cce87bc..ee777850 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs
@@ -1,8 +1,8 @@
{{custom-wizard-category-selector
categories=categories
+ class=fieldClass
whitelist=field.content
onChange=(action (mut categories))
tabindex=field.tabindex
- options=(hash
- maximum=field.limit
- )}}
+ options=(hash maximum=field.limit)
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs
index 053e0218..dd75b5fb 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs
@@ -1 +1,7 @@
-{{input type="checkbox" id=field.id checked=field.value tabindex=field.tabindex}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
index 508cf31d..7e4e777f 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
@@ -2,4 +2,4 @@
{{html-safe field.preview_template}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs
index 51964a1b..ecc8058b 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs
@@ -2,18 +2,24 @@
field=field
composer=composer
wizard=wizard
+ fieldClass=fieldClass
groupsMentioned=(action "groupsMentioned")
cannotSeeMention=(action "cannotSeeMention")
importQuote=(action "importQuote")
togglePreview=(action "togglePreview")
- afterRefresh=(action "afterRefresh")}}
+ afterRefresh=(action "afterRefresh")
+}}
-
+
{{i18n togglePreviewLabel}}
{{#if field.char_counter}}
- {{char-counter field.value field.max_length}}
+ {{wizard-char-counter field.value field.max_length}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
index f6d6c588..5faeb3fb 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
@@ -2,4 +2,4 @@
date=dateTime
onChange=(action "onChange")
tabindex=field.tabindex
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
index d0368564..14504896 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
@@ -3,4 +3,4 @@
onChange=(action "onChange")
tabindex=field.tabindex
format=field.format
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
index 42fc63e8..f03bb975 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
@@ -4,6 +4,5 @@
content=field.content
tabindex=field.tabindex
onChange=(action "onChangeValue")
- options=(hash
- none="select_kit.default_header_text"
- )}}
+ options=(hash none="select_kit.default_header_text")
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs
index 6873f9bd..da487422 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs
@@ -1,10 +1,10 @@
{{custom-wizard-group-selector
groups=site.groups
+ class=fieldClass
field=field
whitelist=field.content
value=field.value
tabindex=field.tabindex
onChange=(action (mut field.value))
- options=(hash
- none="select_kit.default_header_text"
- )}}
+ options=(hash none="select_kit.default_header_text")
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs
index f5d6543c..0bfc99be 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs
@@ -1 +1,8 @@
-{{input type="number" step="0.01" id=field.id value=field.value tabindex=field.tabindex}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs
index 90679ae7..71ffe7d7 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs
@@ -1,9 +1,8 @@
{{custom-wizard-tag-chooser
tags=field.value
+ class=fieldClass
tabindex=field.tabindex
tagGroups=field.tag_groups
everyTag=true
- options=(hash
- maximum=field.limit
- allowAny=field.can_create_tag
- )}}
+ options=(hash maximum=field.limit allowAny=field.can_create_tag)
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs
index 08733d3f..76dbee2a 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs
@@ -1 +1,8 @@
-{{input id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex autocomplete=autocomplete}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs
index dda299bc..5431538c 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs
@@ -1 +1,7 @@
-{{textarea id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
index 1c790a81..665028d0 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
@@ -2,4 +2,4 @@
date=time
onChange=(action "onChange")
tabindex=field.tabindex
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs
index 022e6a94..f899f580 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs
@@ -1,4 +1,7 @@
-
+
{{#if uploading}}
{{i18n "wizard.uploading"}}
{{else}}
@@ -6,13 +9,19 @@
{{d-icon "upload"}}
{{/if}}
-
+
{{#if field.value}}
{{#if isImage}}
-
+
{{else}}
{{field.value.original_filename}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs
index c7e1a508..ccbedaf3 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs
@@ -1 +1,6 @@
-{{input type="text" id=field.id value=field.value tabindex=field.tabindex}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
index 5f8c1443..7261cf78 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
@@ -1,4 +1,5 @@
{{custom-user-selector
usernames=field.value
placeholderKey=field.placeholder
- tabindex=field.tabindex}}
+ tabindex=field.tabindex
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
index efda8629..0678ac73 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
@@ -1,29 +1,38 @@
-
- {{html-safe field.translatedLabel}}
-
-
-{{#if field.image}}
-
-{{/if}}
-
-{{#if field.description}}
- {{cookedDescription}}
-{{/if}}
-
-{{#field-validators field=field as |validators|}}
- {{#if inputComponentName}}
-
- {{component inputComponentName field=field step=step fieldClass=fieldClass wizard=wizard autocomplete=validators.autocomplete}}
-
- {{/if}}
-{{/field-validators}}
-
-{{#if field.char_counter}}
- {{#if textType}}
- {{char-counter field.value field.max_length}}
- {{/if}}
-{{/if}}
-
-{{#if field.errorDescription}}
- {{html-safe field.errorDescription}}
-{{/if}}
+
+ {{html-safe field.translatedLabel}}
+
+
+{{#if field.image}}
+
+{{/if}}
+
+{{#if field.description}}
+ {{cookedDescription}}
+{{/if}}
+
+{{#field-validators field=field as |validators|}}
+ {{#if inputComponentName}}
+
+ {{component
+ inputComponentName
+ field=field
+ step=step
+ fieldClass=fieldClass
+ wizard=wizard
+ autocomplete=validators.autocomplete
+ }}
+
+ {{/if}}
+{{/field-validators}}
+
+{{#if field.char_counter}}
+ {{#if textType}}
+ {{wizard-char-counter field.value field.max_length}}
+ {{/if}}
+{{/if}}
+
+{{#if field.errorDescription}}
+ {{html-safe
+ field.errorDescription
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs
index 25670cd0..cb9f59f1 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs
@@ -1,7 +1,11 @@
{{text}}
-
+
{{i18n "wizard.return_to_site" siteName=siteName}}
{{d-icon "sign-out-alt"}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
index 47197dbc..286521b3 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
@@ -1,4 +1,6 @@
{{html-safe topic.fancy_title}}
- {{date-node topic.created_at}} - {{html-safe topic.blurb}}
-
+ {{date-node topic.created_at}}
+ -
+ {{html-safe topic.blurb}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
index 44268f9f..ba745b2d 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
@@ -1,11 +1,11 @@
-{{#if showTopics}}
-
- {{#each topics as |topic|}}
- {{custom-wizard-similar-topic topic=topic}}
- {{/each}}
-
-{{else}}
-
- {{i18n "realtime_validations.similar_topics.show"}}
-
-{{/if}}
+{{#if showTopics}}
+
+ {{#each topics as |topic|}}
+ {{custom-wizard-similar-topic topic=topic}}
+ {{/each}}
+
+{{else}}
+
+ {{i18n "realtime_validations.similar_topics.show"}}
+
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs
index 1b7bc564..b9f0c06e 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs
@@ -5,7 +5,7 @@
{{#if bannerImage}}
-
+
{{/if}}
@@ -26,7 +26,11 @@
- {{i18n "wizard.step" current=step.displayIndex total=wizard.totalSteps}}
+ {{i18n
+ "wizard.step"
+ current=step.displayIndex
+ total=wizard.totalSteps
+ }}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
index 73fa4968..6207851b 100644
--- a/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
@@ -10,4 +10,4 @@
autoInsertNoneItem=false
translatedFilterPlaceholder="--:--"
)
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/field-validators.hbs b/assets/javascripts/discourse/templates/components/field-validators.hbs
index 1fc04012..0bfd3875 100644
--- a/assets/javascripts/discourse/templates/components/field-validators.hbs
+++ b/assets/javascripts/discourse/templates/components/field-validators.hbs
@@ -1,13 +1,23 @@
-{{#if field.validations}}
- {{#each-in field.validations.above as |type validation|}}
- {{component validation.component field=field type=type validation=validation}}
- {{/each-in}}
-
- {{yield (hash perform=(action "perform") autocomplete="off")}}
-
- {{#each-in field.validations.below as |type validation|}}
- {{component validation.component field=field type=type validation=validation}}
- {{/each-in}}
-{{else}}
- {{yield}}
-{{/if}}
+{{#if field.validations}}
+ {{#each-in field.validations.above as |type validation|}}
+ {{component
+ validation.component
+ field=field
+ type=type
+ validation=validation
+ }}
+ {{/each-in}}
+
+ {{yield (hash perform=(action "perform") autocomplete="off")}}
+
+ {{#each-in field.validations.below as |type validation|}}
+ {{component
+ validation.component
+ field=field
+ type=type
+ validation=validation
+ }}
+ {{/each-in}}
+{{else}}
+ {{yield}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs b/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
index 2f760196..0849c020 100644
--- a/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
+++ b/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
@@ -10,4 +10,4 @@
{{#if showSimilarTopics}}
{{custom-wizard-similar-topics topics=similarTopics}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/validator.hbs b/assets/javascripts/discourse/templates/components/validator.hbs
index 8e08379b..a64c4e93 100644
--- a/assets/javascripts/discourse/templates/components/validator.hbs
+++ b/assets/javascripts/discourse/templates/components/validator.hbs
@@ -2,4 +2,4 @@
{{i18n validMessageKey}}
{{else}}
{{i18n invalidMessageKey}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
index 8245f1b8..e6a4b703 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
@@ -3,7 +3,8 @@
action=(action "undoChanges")
icon=undoIcon
label=undoKey
- class="undo-changes"}}
+ class="undo-changes"
+ }}
{{/if}}
@@ -17,9 +18,8 @@
feature="action"
attribute="type"
onChange=(action "changeType")
- options=(hash
- none="admin.wizard.select_type"
- )
+ wizard=wizard
+ options=(hash none="admin.wizard.select_type")
}}
@@ -33,14 +33,12 @@
{{combo-box
value=action.run_after
content=runAfterContent
- onChange=(action (mut action.run_after))}}
+ onChange=(action (mut action.run_after))
+ }}
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="action"}}
+{{wizard-message key=messageKey url=messageUrl component="action"}}
{{#if basicTopicFields}}
@@ -57,7 +55,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -75,10 +74,11 @@
options=(hash
none="admin.wizard.selector.placeholder.wizard_field"
isDisabled=showPostBuilder
- )}}
+ )
+ }}
- {{input type="checkbox" checked=action.post_builder}}
+
{{i18n "admin.wizard.action.post_builder.checkbox"}}
@@ -93,7 +93,8 @@
{{wizard-text-editor
value=action.post_template
- wizardFields=wizardFields}}
+ wizardFields=wizardFields
+ }}
{{/if}}
@@ -118,7 +119,8 @@
wizardActionSelection="output"
outputDefaultSelection="category"
context="action"
- )}}
+ )
+ }}
@@ -139,7 +141,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -154,10 +157,9 @@
property="visible"
onUpdate=(action "mappedFieldUpdated")
options=(hash
- wizardFieldSelection=true
- userFieldSelection=true
- context="action"
- )}}
+ wizardFieldSelection=true userFieldSelection=true context="action"
+ )
+ }}
@@ -172,10 +174,8 @@
inputs=action.add_event
property="add_event"
onUpdate=(action "mappedFieldUpdated")
- options=(hash
- wizardFieldSelection=true
- context="action"
- )}}
+ options=(hash wizardFieldSelection=true context="action")
+ }}
{{/if}}
@@ -191,10 +191,8 @@
inputs=action.add_location
property="add_location"
onUpdate=(action "mappedFieldUpdated")
- options=(hash
- wizardFieldSelection=true
- context="action"
- )}}
+ options=(hash wizardFieldSelection=true context="action")
+ }}
{{/if}}
@@ -219,7 +217,8 @@
userSelection="output"
outputDefaultSelection="user"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -242,7 +241,8 @@
wizardActionSelection="value"
keyDefaultSelection="userField"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -260,7 +260,8 @@
options=(hash
isDisabled=action.custom_title_enabled
none="admin.wizard.action.send_to_api.select_an_api"
- )}}
+ )
+ }}
@@ -277,7 +278,8 @@
options=(hash
isDisabled=apiEmpty
none="admin.wizard.action.send_to_api.select_an_endpoint"
- )}}
+ )
+ }}
@@ -292,7 +294,8 @@
previewEnabled=false
barEnabled=false
wizardFields=wizardFields
- placeholder="admin.wizard.action.send_to_api.body_placeholder"}}
+ placeholder="admin.wizard.action.send_to_api.body_placeholder"
+ }}
{{/if}}
@@ -316,7 +319,8 @@
groupSelection="value,output"
outputDefaultSelection="group"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -339,7 +343,8 @@
groupSelection="key,value"
categorySelection="key,value"
userSelection="key,value"
- )}}
+ )
+ }}
{{/if}}
@@ -362,13 +367,16 @@
userFieldSelection="key,value"
categorySelection="output"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.watch_categories.mute_remainder"}}
+ {{i18n
+ "admin.wizard.action.watch_categories.mute_remainder"
+ }}
@@ -380,13 +388,16 @@
context="action"
wizardFieldSelection=true
userFieldSelection="key,value"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.watch_x.notification_level.label"}}
+ {{i18n
+ "admin.wizard.action.watch_x.notification_level.label"
+ }}
@@ -397,7 +408,8 @@
options=(hash
isDisabled=action.custom_title_enabled
none="admin.wizard.action.watch_x.select_a_notification_level"
- )}}
+ )
+ }}
@@ -407,7 +419,7 @@
- {{input type="checkbox" checked=action.wizard_user}}
+
@@ -426,7 +438,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
userSelection="output"
- )}}
+ )
+ }}
{{/if}}
@@ -449,13 +462,16 @@
wizardActionSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.watch_x.notification_level.label"}}
+ {{i18n
+ "admin.wizard.action.watch_x.notification_level.label"
+ }}
@@ -466,7 +482,8 @@
options=(hash
isDisabled=action.custom_title_enabled
none="admin.wizard.action.watch_x.select_a_notification_level"
- )}}
+ )
+ }}
@@ -476,7 +493,7 @@
- {{input type="checkbox" checked=action.wizard_user}}
+
@@ -495,7 +512,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
userSelection="output"
- )}}
+ )
+ }}
{{/if}}
@@ -516,7 +534,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -534,7 +553,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -552,7 +572,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -570,7 +591,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -589,7 +611,8 @@
userFieldSelection=true
userSelection="output"
context="action"
- )}}
+ )
+ }}
@@ -608,12 +631,15 @@
userFieldSelection=true
userSelection="output"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.grant_trust_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.grant_trust_level"
+ }}
@@ -626,12 +652,15 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.mentionable_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.mentionable_level"
+ }}
@@ -644,12 +673,15 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.messageable_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.messageable_level"
+ }}
@@ -662,12 +694,15 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.visibility_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.visibility_level"
+ }}
@@ -680,12 +715,15 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.members_visibility_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.members_visibility_level"
+ }}
@@ -698,7 +736,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -715,11 +754,12 @@
property="name"
onUpdate=(action "mappedFieldUpdated")
options=(hash
- textSelection="key,value"
+ textSelection="key,value,output"
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -738,7 +778,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -757,7 +798,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -776,13 +818,16 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_category.parent_category"}}
+ {{i18n
+ "admin.wizard.action.create_category.parent_category"
+ }}
@@ -796,7 +841,8 @@
userFieldSelection="key,value"
categorySelection="output"
context="action"
- )}}
+ )
+ }}
@@ -818,7 +864,8 @@
userFieldSelection=true
groupSelection="key"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -842,7 +889,8 @@
userFieldSelection="value"
keyPlaceholder="admin.wizard.action.custom_fields.key"
context=customFieldsContext
- )}}
+ )
+ }}
{{/if}}
@@ -864,7 +912,8 @@
userFieldSelection=true
groupSelection=true
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -876,7 +925,7 @@
- {{input type="checkbox" checked=action.skip_redirect}}
+
{{i18n "admin.wizard.action.skip_redirect.description" type="topic"}}
@@ -890,10 +939,13 @@
- {{input type="checkbox" checked=action.suppress_notifications}}
+
- {{i18n "admin.wizard.action.suppress_notifications.description" type="topic"}}
+ {{i18n
+ "admin.wizard.action.suppress_notifications.description"
+ type="topic"
+ }}
@@ -906,7 +958,7 @@
- {{input value=action.code}}
+
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
index 6273f9a9..c4d297ff 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
@@ -1,285 +1,289 @@
-{{#if showUndo}}
- {{d-button
- action=(action "undoChanges")
- icon=undoIcon
- label=undoKey
- class="undo-changes"}}
-{{/if}}
-
-
-
- {{i18n "admin.wizard.field.label"}}
-
-
- {{input name="label" value=field.label}}
-
-
-
-
-
- {{i18n "admin.wizard.field.required"}}
-
-
-
- {{i18n "admin.wizard.field.required_label"}}
- {{input type="checkbox" checked=field.required}}
-
-
-
-
-
- {{i18n "admin.wizard.field.description"}}
-
-
- {{textarea name="description" value=field.description}}
-
-
-
-
-
- {{i18n "admin.wizard.field.image"}}
-
-
- {{uppy-image-uploader
- imageUrl=field.image
- onUploadDone=(action "imageUploadDone")
- onUploadDeleted=(action "imageUploadDeleted")
- type="wizard-field-image"
- class="no-repeat contain-image"
- id=(concat "wizard-field-" field.id "-image-upload")}}
-
-
-
-
-
- {{i18n "admin.wizard.type"}}
-
-
-
- {{combo-box
- value=field.type
- content=fieldTypes
- onChange=(action "changeType")
- options=(hash
- none="admin.wizard.select_type"
- )}}
-
-
-
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="field"}}
-
-{{#if isTextType}}
-
-
- {{i18n "admin.wizard.field.min_length"}}
-
-
-
- {{input
- type="number"
- name="min_length"
- value=field.min_length
- class="small"}}
-
-
-
-
-
- {{i18n "admin.wizard.field.max_length"}}
-
-
-
- {{input
- type="number"
- name="max_length"
- value=field.max_length
- class="small"}}
-
-
-
-
-
- {{i18n "admin.wizard.field.char_counter"}}
-
-
-
- {{i18n "admin.wizard.field.char_counter_placeholder"}}
- {{input
- type="checkbox"
- checked=field.char_counter}}
-
-
-
-
-
- {{i18n "admin.wizard.field.field_placeholder"}}
-
-
-
- {{textarea
- name="field_placeholder"
- class="medium"
- value=field.placeholder}}
-
-
-{{/if}}
-
-{{#if isComposerPreview}}
-
-
- {{i18n "admin.wizard.field.preview_template"}}
-
-
-
- {{textarea name="preview-template" value=field.preview_template class="preview-template"}}
-
-
-{{/if}}
-
-{{#if isUpload}}
-
-
- {{i18n "admin.wizard.field.file_types"}}
-
-
-
- {{input value=field.file_types class="medium"}}
-
-
-{{/if}}
-
-{{#if showLimit}}
-
-
- {{i18n "admin.wizard.field.limit"}}
-
-
-
- {{input type="number" value=field.limit class="small"}}
-
-
-{{/if}}
-
-{{#if isDateTime}}
-
-
- {{html-safe (i18n "admin.wizard.field.date_time_format.label")}}
-
-
-
- {{input value=field.format class="medium"}}
- {{html-safe (i18n "admin.wizard.field.date_time_format.instructions")}}
-
-
-{{/if}}
-
-{{#if showPrefill}}
-
-
- {{i18n "admin.wizard.field.prefill"}}
-
-
-
- {{wizard-mapper
- inputs=field.prefill
- property="prefill"
- onUpdate=(action "mappedFieldUpdated")
- options=prefillOptions}}
-
-
-{{/if}}
-
-{{#if showContent}}
-
-
- {{i18n "admin.wizard.field.content"}}
-
-
-
- {{wizard-mapper
- inputs=field.content
- property="content"
- onUpdate=(action "mappedFieldUpdated")
- options=contentOptions}}
-
-
-{{/if}}
-
-{{#if isTag}}
-
-
- {{i18n "admin.wizard.field.tag_groups"}}
-
-
-
- {{tag-group-chooser
- id=(concat field.id "-tag-groups")
- tagGroups=field.tag_groups
- onChange=(action (mut field.tag_groups))
- }}
-
-
-
-
-
- {{i18n "admin.wizard.field.can_create_tag"}}
-
-
-
- {{input
- type="checkbox"
- checked=field.can_create_tag}}
-
-
-{{/if}}
-
-{{#wizard-subscription-container}}
-
-
- {{i18n "admin.wizard.condition"}}
-
-
-
- {{wizard-mapper
- inputs=field.condition
- options=fieldConditionOptions}}
-
-
-
-
-
- {{i18n "admin.wizard.index"}}
-
-
-
- {{wizard-mapper
- inputs=field.index
- options=fieldIndexOptions}}
-
-
-
- {{#if isCategory}}
-
-
- {{i18n "admin.wizard.field.property"}}
-
-
-
- {{combo-box
- value=field.property
- content=categoryPropertyTypes
- onChange=(action (mut field.property))
- options=(hash
- none="admin.wizard.selector.placeholder.property"
- )}}
-
-
- {{/if}}
-
- {{#if validations}}
- {{wizard-realtime-validations field=field validations=validations}}
- {{/if}}
-{{/wizard-subscription-container}}
+{{#if showUndo}}
+ {{d-button
+ action=(action "undoChanges")
+ icon=undoIcon
+ label=undoKey
+ class="undo-changes"
+ }}
+{{/if}}
+
+
+
+ {{i18n "admin.wizard.field.label"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.required"}}
+
+
+
+ {{i18n "admin.wizard.field.required_label"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.description"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.image"}}
+
+
+ {{uppy-image-uploader
+ imageUrl=field.image
+ onUploadDone=(action "imageUploadDone")
+ onUploadDeleted=(action "imageUploadDeleted")
+ type="wizard-field-image"
+ class="no-repeat contain-image"
+ id=(concat "wizard-field-" field.id "-image-upload")
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.type"}}
+
+
+
+ {{wizard-subscription-selector
+ value=field.type
+ feature="field"
+ attribute="type"
+ onChange=(action "changeType")
+ wizard=wizard
+ options=(hash none="admin.wizard.select_type")
+ }}
+
+
+
+{{wizard-message key=messageKey url=messageUrl component="field"}}
+
+{{#if isTextType}}
+
+
+ {{i18n "admin.wizard.field.min_length"}}
+
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.max_length"}}
+
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.char_counter"}}
+
+
+
+ {{i18n "admin.wizard.field.char_counter_placeholder"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.field_placeholder"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isComposerPreview}}
+
+
+ {{i18n "admin.wizard.field.preview_template"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isUpload}}
+
+
+ {{i18n "admin.wizard.field.file_types"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if showLimit}}
+
+
+ {{i18n "admin.wizard.field.limit"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isDateTime}}
+
+
+ {{html-safe
+ (i18n "admin.wizard.field.date_time_format.label")
+ }}
+
+
+
+
+ {{html-safe
+ (i18n "admin.wizard.field.date_time_format.instructions")
+ }}
+
+
+{{/if}}
+
+{{#if showPrefill}}
+
+
+ {{i18n "admin.wizard.field.prefill"}}
+
+
+
+ {{wizard-mapper
+ inputs=field.prefill
+ property="prefill"
+ onUpdate=(action "mappedFieldUpdated")
+ options=prefillOptions
+ }}
+
+
+{{/if}}
+
+{{#if showContent}}
+
+
+ {{i18n "admin.wizard.field.content"}}
+
+
+
+ {{wizard-mapper
+ inputs=field.content
+ property="content"
+ onUpdate=(action "mappedFieldUpdated")
+ options=contentOptions
+ }}
+
+
+{{/if}}
+
+{{#if isTag}}
+
+
+ {{i18n "admin.wizard.field.tag_groups"}}
+
+
+
+ {{tag-group-chooser
+ id=(concat field.id "-tag-groups")
+ tagGroups=field.tag_groups
+ onChange=(action (mut field.tag_groups))
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.field.can_create_tag"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#wizard-subscription-container}}
+
+
+ {{i18n "admin.wizard.condition"}}
+
+
+
+ {{wizard-mapper inputs=field.condition options=fieldConditionOptions}}
+
+
+
+
+
+ {{i18n "admin.wizard.index"}}
+
+
+
+ {{wizard-mapper inputs=field.index options=fieldIndexOptions}}
+
+
+
+ {{#if isCategory}}
+
+
+ {{i18n "admin.wizard.field.property"}}
+
+
+
+ {{combo-box
+ value=field.property
+ content=categoryPropertyTypes
+ onChange=(action (mut field.property))
+ options=(hash none="admin.wizard.selector.placeholder.property")
+ }}
+
+
+ {{/if}}
+
+ {{#if validations}}
+ {{wizard-realtime-validations field=field validations=validations}}
+ {{/if}}
+{{/wizard-subscription-container}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
index 40ac09e0..e6d4d5a7 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
@@ -1,119 +1,120 @@
-
-
- {{i18n "admin.wizard.step.title"}}
-
-
- {{input
- name="title"
- value=step.title}}
-
-
-
-
-
- {{i18n "admin.wizard.step.banner"}}
-
-
- {{uppy-image-uploader
- imageUrl=step.banner
- onUploadDone=(action "bannerUploadDone")
- onUploadDeleted=(action "bannerUploadDeleted")
- type="wizard-step-banner"
- class="no-repeat contain-image"
- id=(concat "wizard-step-" step.id "-banner-upload")}}
-
-
-
-
-
- {{i18n "admin.wizard.step.description"}}
-
-
- {{wizard-text-editor
- value=step.raw_description}}
-
-
-
-{{#wizard-subscription-container}}
-
-
- {{i18n "admin.wizard.condition"}}
-
-
-
- {{wizard-mapper
- inputs=step.condition
- options=stepConditionOptions}}
-
-
-
-
-
-
-
{{i18n "admin.wizard.step.force_final.label"}}
- {{input type="checkbox" checked=step.force_final}}
- {{i18n "admin.wizard.step.force_final.description"}}
-
-
-
-
-
- {{i18n "admin.wizard.step.required_data.label"}}
-
-
-
- {{wizard-mapper
- inputs=step.required_data
- options=(hash
- inputTypes="validation"
- inputConnector="and"
- wizardFieldSelection="value"
- userFieldSelection="value"
- keyPlaceholder="admin.wizard.submission_key"
- context="step"
- )}}
- {{#if step.required_data}}
-
-
- {{i18n "admin.wizard.step.required_data.not_permitted_message"}}
-
- {{input value=step.required_data_message}}
-
- {{/if}}
-
-
-
-
-
- {{i18n "admin.wizard.step.permitted_params.label"}}
-
-
- {{wizard-mapper
- inputs=step.permitted_params
- options=(hash
- pairConnector="set"
- inputTypes="association"
- keyPlaceholder="admin.wizard.param_key"
- valuePlaceholder="admin.wizard.submission_key"
- context="step"
- )}}
-
-
-{{/wizard-subscription-container}}
-
-{{wizard-links
- itemType="field"
- current=currentField
- items=step.fields
- parentId=step.id}}
-
-{{#each step.fields as |field|}}
- {{wizard-custom-field
- field=field
- step=step
- currentFieldId=currentField.id
- fieldTypes=fieldTypes
- removeField="removeField"
- wizardFields=wizardFields
- subscribed=subscribed}}
-{{/each}}
+
+
+ {{i18n "admin.wizard.step.title"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.step.banner"}}
+
+
+ {{uppy-image-uploader
+ imageUrl=step.banner
+ onUploadDone=(action "bannerUploadDone")
+ onUploadDeleted=(action "bannerUploadDeleted")
+ type="wizard-step-banner"
+ class="no-repeat contain-image"
+ id=(concat "wizard-step-" step.id "-banner-upload")
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.step.description"}}
+
+
+ {{wizard-text-editor value=step.raw_description}}
+
+
+
+{{#wizard-subscription-container}}
+
+
+ {{i18n "admin.wizard.condition"}}
+
+
+
+ {{wizard-mapper inputs=step.condition options=stepConditionOptions}}
+
+
+
+
+
+
+
{{i18n "admin.wizard.step.force_final.label"}}
+
+ {{i18n "admin.wizard.step.force_final.description"}}
+
+
+
+
+
+ {{i18n "admin.wizard.step.required_data.label"}}
+
+
+
+ {{wizard-mapper
+ inputs=step.required_data
+ options=(hash
+ inputTypes="validation"
+ inputConnector="and"
+ wizardFieldSelection="value"
+ userFieldSelection="value"
+ keyPlaceholder="admin.wizard.submission_key"
+ context="step"
+ )
+ }}
+ {{#if step.required_data}}
+
+
+ {{i18n "admin.wizard.step.required_data.not_permitted_message"}}
+
+
+
+ {{/if}}
+
+
+
+
+
+ {{i18n "admin.wizard.step.permitted_params.label"}}
+
+
+ {{wizard-mapper
+ inputs=step.permitted_params
+ options=(hash
+ pairConnector="set"
+ inputTypes="association"
+ keyPlaceholder="admin.wizard.param_key"
+ valuePlaceholder="admin.wizard.submission_key"
+ context="step"
+ )
+ }}
+
+
+{{/wizard-subscription-container}}
+
+{{wizard-links
+ itemType="field"
+ current=currentField
+ items=step.fields
+ parentId=step.id
+}}
+
+{{#each step.fields as |field|}}
+ {{wizard-custom-field
+ field=field
+ step=step
+ wizard=wizard
+ currentFieldId=currentField.id
+ fieldTypes=fieldTypes
+ removeField="removeField"
+ wizardFields=wizardFields
+ subscribed=subscribed
+ }}
+{{/each}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-links.hbs b/assets/javascripts/discourse/templates/components/wizard-links.hbs
index 368acd35..79fbfcda 100644
--- a/assets/javascripts/discourse/templates/components/wizard-links.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-links.hbs
@@ -4,16 +4,36 @@
{{#if anyLinks}}
{{#each links as |link|}}
- {{d-button action=(action "change") actionParam=link.id translatedLabel=link.label class=link.classes}}
+ {{d-button
+ action=(action "change")
+ actionParam=link.id
+ translatedLabel=link.label
+ class=link.classes
+ }}
{{#unless link.first}}
- {{d-button action=(action "back") actionParam=link icon="arrow-left" class="back"}}
+ {{d-button
+ action=(action "back")
+ actionParam=link
+ icon="arrow-left"
+ class="back"
+ }}
{{/unless}}
{{#unless link.last}}
- {{d-button action=(action "forward") actionParam=link icon="arrow-right" class="forward"}}
+ {{d-button
+ action=(action "forward")
+ actionParam=link
+ icon="arrow-right"
+ class="forward"
+ }}
{{/unless}}
- {{d-button action=(action "remove") actionParam=link.id icon="times" class="remove"}}
+ {{d-button
+ action=(action "remove")
+ actionParam=link.id
+ icon="times"
+ class="remove"
+ }}
{{/each}}
{{/if}}
{{d-button action=(action "add") label="admin.wizard.add" icon="plus"}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
index 7b610e2b..7476c099 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
@@ -2,11 +2,12 @@
{{combo-box
value=connector
content=connectors
- onChange=(action "changeConnector")}}
+ onChange=(action "changeConnector")
+ }}
{{else}}
{{#if connector}}
{{connectorLabel}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
index 410db070..4138a254 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
@@ -5,7 +5,8 @@
inputType=inputType
connectorType="type"
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+}}
{{#if hasPairs}}
@@ -16,7 +17,8 @@
inputType=inputType
options=options
removePair=(action "removePair")
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+ }}
{{/each}}
{{#if canAddPair}}
@@ -35,7 +37,8 @@
connectorType="output"
inputType=inputType
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+ }}
{{/if}}
@@ -45,10 +48,11 @@
value=input.output
activeType=input.output_type
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+ }}
{{/if}}
{{d-icon "times"}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
index c4c15907..33e9ffa1 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
@@ -5,7 +5,8 @@
value=pair.key
activeType=pair.key_type
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+ }}
{{wizard-mapper-connector
@@ -14,7 +15,8 @@
connectorType="pair"
inputType=inputType
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+}}
{{wizard-mapper-selector
@@ -24,7 +26,8 @@
activeType=pair.value_type
options=options
onUpdate=onUpdate
- connector=pair.connector}}
+ connector=pair.connector
+ }}
{{#if showJoin}}
@@ -32,5 +35,7 @@
{{/if}}
{{#if showRemove}}
- {{d-icon "times"}}
-{{/if}}
+ {{d-icon
+ "times"
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
index 32c4c26e..2ef7f2a3 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
@@ -1 +1 @@
-{{item.label}}
+{{item.label}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
index cb94b7ae..80669aa4 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
@@ -10,7 +10,8 @@
{{wizard-mapper-selector-type
activeType=activeType
item=item
- toggle=(action "toggleType")}}
+ toggle=(action "toggleType")
+ }}
{{/each}}
{{/if}}
@@ -21,11 +22,12 @@
{{#if showText}}
- {{input
- type="text"
- value=value
- placeholder=(i18n placeholderKey)
- change=(action "changeInputValue")}}
+
{{/if}}
{{#if showComboBox}}
@@ -33,10 +35,8 @@
value=value
content=comboBoxContent
onChange=(action "changeValue")
- options=(hash
- none=placeholderKey
- allowAny=comboBoxAllowAny
- )}}
+ options=(hash none=placeholderKey allowAny=comboBoxAllowAny)
+ }}
{{/if}}
{{#if showMultiSelect}}
@@ -44,14 +44,16 @@
content=multiSelectContent
value=value
onChange=(action "changeValue")
- options=multiSelectOptions}}
+ options=multiSelectOptions
+ }}
{{/if}}
{{#if showList}}
{{wizard-value-list
values=value
addKey=placeholderKey
- onChange=(action "changeValue")}}
+ onChange=(action "changeValue")
+ }}
{{/if}}
{{#if showTag}}
@@ -59,10 +61,8 @@
tags=value
onChange=(action "changeValue")
everyTag=true
- options=(hash
- none=placeholderKey
- filterable=true
- )}}
+ options=(hash none=placeholderKey filterable=true)
+ }}
{{/if}}
{{#if showUser}}
@@ -71,8 +71,7 @@
value=value
autocomplete="discourse"
onChange=(action "changeUserValue")
- options=(hash
- includeMessageableGroups="true"
- )}}
+ options=(hash includeMessageableGroups="true")
+ }}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
index c0cc6818..e58b48e6 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
@@ -3,18 +3,20 @@
{{wizard-mapper-connector
connector=input.connector
connectorType="input"
- onUpdate=(action "inputUpdated")}}
+ onUpdate=(action "inputUpdated")
+ }}
{{/if}}
{{wizard-mapper-input
input=input
options=inputOptions
remove=(action "remove")
- onUpdate=(action "inputUpdated")}}
+ onUpdate=(action "inputUpdated")
+ }}
{{/each}}
{{#if canAdd}}
{{d-button action=(action "add") label="admin.wizard.add" icon="plus"}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-message.hbs b/assets/javascripts/discourse/templates/components/wizard-message.hbs
index 380fc5b3..4c48002a 100644
--- a/assets/javascripts/discourse/templates/components/wizard-message.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-message.hbs
@@ -23,4 +23,4 @@
{{documentation}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs b/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
index 8269d6ca..1d29c655 100644
--- a/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
@@ -7,32 +7,44 @@
{{i18n (concat "admin.wizard.field.validations." type)}}
- {{input type="checkbox" checked=props.status}}
+
{{i18n "admin.wizard.field.validations.enabled"}}
- {{i18n "admin.wizard.field.validations.categories"}}
+ {{i18n
+ "admin.wizard.field.validations.categories"
+ }}
{{category-selector
- categories=(get this (concat "validationBuffer." type ".categories"))
- onChange=(action "updateValidationCategories" type props)
- class="wizard"}}
+ categories=(get
+ this (concat "validationBuffer." type ".categories")
+ )
+ onChange=(action "updateValidationCategories" type props)
+ class="wizard"
+ }}
@@ -40,9 +52,17 @@
{{i18n "admin.wizard.field.validations.position"}}
- {{radio-button name=(concat type field.id) value="above" selection=props.position}}
+ {{radio-button
+ name=(concat type field.id)
+ value="above"
+ selection=props.position
+ }}
{{i18n "admin.wizard.field.validations.above"}}
- {{radio-button name=(concat type field.id) value="below" selection=props.position}}
+ {{radio-button
+ name=(concat type field.id)
+ value="below"
+ selection=props.position
+ }}
{{i18n "admin.wizard.field.validations.below"}}
@@ -50,4 +70,4 @@
{{/each-in}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-badge.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-badge.hbs
index b2ce05bc5..baba957c 100644
--- a/assets/javascripts/discourse/templates/components/wizard-subscription-badge.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-badge.hbs
@@ -1,6 +1,24 @@
-
-
-
+
+
+
-{{label}}
+{{label}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-container.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-container.hbs
index 01d436f5..b8031bfe 100644
--- a/assets/javascripts/discourse/templates/components/wizard-subscription-container.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-container.hbs
@@ -9,4 +9,4 @@
{{yield}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-cta.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-cta.hbs
index 00569756..cb20df2b 100644
--- a/assets/javascripts/discourse/templates/components/wizard-subscription-cta.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-cta.hbs
@@ -1 +1 @@
-{{d-icon icon}}{{label}}
+{{d-icon icon}}{{label}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs
index d91e90f1..7d18bdd6 100644
--- a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs
@@ -1,6 +1,7 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs
index de24fd75..7d62bb8e 100644
--- a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs
@@ -12,4 +12,4 @@
{{#if item.subscriptionRequired}}
{{i18n item.selectorLabel}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-table-field.hbs b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
index af30f422..1262809d 100644
--- a/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
@@ -16,7 +16,10 @@
{{#if isComposer}}
-
+
{{value.value}}
@@ -28,7 +31,8 @@
{{#if isComposerPreview}}
{{d-icon "comment-alt"}}
- {{i18n "admin.wizard.submissions.composer_preview"}}: {{value.value}}
+ {{i18n "admin.wizard.submissions.composer_preview"}}:
+ {{value.value}}
{{/if}}
@@ -146,7 +150,12 @@
{{/if}}
{{#if showUsername}}
-
+
{{username}}
{{/if}}
@@ -158,4 +167,4 @@
{{/if}}
{{else}}
—
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs b/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
index 37a3e549..2f13ebe1 100644
--- a/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
@@ -1,19 +1,12 @@
-{{d-editor
- value=value
- forcePreview=forcePreview
- placeholder=placeholder}}
+{{d-editor value=value forcePreview=forcePreview placeholder=placeholder}}
{{#if previewEnabled}}
- {{d-button
- action=(action "togglePreview")
- translatedLabel=previewLabel}}
+ {{d-button action=(action "togglePreview") translatedLabel=previewLabel}}
{{/if}}
{{#if fieldsEnabled}}
- {{d-button
- action=(action "togglePopover")
- translatedLabel=popoverLabel}}
+ {{d-button action=(action "togglePopover") translatedLabel=popoverLabel}}
{{#if showPopover}}
@@ -38,4 +31,4 @@
{{/if}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/custom-wizard-index.hbs b/assets/javascripts/discourse/templates/custom-wizard-index.hbs
index d208851d..c03a5219 100644
--- a/assets/javascripts/discourse/templates/custom-wizard-index.hbs
+++ b/assets/javascripts/discourse/templates/custom-wizard-index.hbs
@@ -1,3 +1,7 @@
-{{#if noAccess}}
- {{custom-wizard-no-access text=(i18n noAccessI18nKey) wizardId=wizardId reason=noAccessReason}}
-{{/if}}
+{{#if noAccess}}
+ {{custom-wizard-no-access
+ text=(i18n noAccessI18nKey)
+ wizardId=wizardId
+ reason=noAccessReason
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/custom-wizard-step.hbs b/assets/javascripts/discourse/templates/custom-wizard-step.hbs
index 19357063..135fb825 100644
--- a/assets/javascripts/discourse/templates/custom-wizard-step.hbs
+++ b/assets/javascripts/discourse/templates/custom-wizard-step.hbs
@@ -16,5 +16,6 @@
wizard=wizard
goNext=(action "goNext")
goBack=(action "goBack")
- showMessage=(action "showMessage")}}
-{{/if}}
+ showMessage=(action "showMessage")
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/custom-wizard.hbs b/assets/javascripts/discourse/templates/custom-wizard.hbs
index f6d6127e..c428dbc3 100644
--- a/assets/javascripts/discourse/templates/custom-wizard.hbs
+++ b/assets/javascripts/discourse/templates/custom-wizard.hbs
@@ -4,9 +4,12 @@
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/modal/admin-wizards-columns.hbs b/assets/javascripts/discourse/templates/modal/admin-wizards-columns.hbs
index eb5218b1..b37a92bf 100644
--- a/assets/javascripts/discourse/templates/modal/admin-wizards-columns.hbs
+++ b/assets/javascripts/discourse/templates/modal/admin-wizards-columns.hbs
@@ -8,7 +8,10 @@
{{input type="checkbox" checked=column.enabled}}
- {{directory-table-header-title field=column.label translated=true}}
+ {{directory-table-header-title
+ field=column.label
+ translated=true
+ }}
@@ -29,4 +32,4 @@
label="directory.edit_columns.reset_to_default"
action=(action "resetToDefault")
}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs b/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs
index cbc9d610..c7e52a56 100644
--- a/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs
+++ b/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs
@@ -12,5 +12,6 @@
action=(action "submit")
class="btn-primary"
label="admin.wizard.after_time_modal.done"
- disabled=submitDisabled}}
-
+ disabled=submitDisabled
+ }}
+
\ No newline at end of file
diff --git a/assets/stylesheets/common/wizard/field.scss b/assets/stylesheets/common/wizard/field.scss
index f710632b..71f12d84 100644
--- a/assets/stylesheets/common/wizard/field.scss
+++ b/assets/stylesheets/common/wizard/field.scss
@@ -32,13 +32,8 @@ body.custom-wizard {
}
}
- &.invalid {
- textarea,
- input[type="text"],
- input[type="checkbox"],
- .select-kit {
- outline: 4px solid var(--danger);
- }
+ &.invalid .wizard-focusable {
+ outline: 4px solid var(--danger);
}
}
diff --git a/assets/stylesheets/common/wizard/step.scss b/assets/stylesheets/common/wizard/step.scss
index 0b774224..2820cfcb 100644
--- a/assets/stylesheets/common/wizard/step.scss
+++ b/assets/stylesheets/common/wizard/step.scss
@@ -17,7 +17,7 @@ body.custom-wizard .wizard-column {
}
}
- img.emoji {
+ .emoji {
width: 20px;
height: 20px;
vertical-align: middle;
@@ -29,7 +29,7 @@ body.custom-wizard .wizard-column {
p {
img {
- @extend img.emoji;
+ @extend .emoji;
}
}
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 1ec2b3ce..98519335 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -217,6 +217,8 @@ en:
list: "list"
custom_field: "custom field"
value: "value"
+ users: "users"
+ guests: "users and guests"
placeholder:
text: "Enter text"
@@ -322,6 +324,7 @@ en:
then: "then"
set: "set"
equal: '='
+ not_equal: '!='
greater: '>'
less: '<'
greater_or_equal: '>='
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 08cf5336..e8ceb44b 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -53,7 +53,8 @@ en:
after_signup_after_time: "You can't use 'after time' and 'after signup' on the same wizard."
after_time: "After time setting is invalid."
liquid_syntax_error: "Liquid syntax error in %{attribute}: %{message}"
- subscription: "%{type} %{property} is subscription only"
+ subscription: "%{type} %{property} usage is not supported on your subscription"
+ not_permitted_for_guests: "%{object_id} is not permitted when guests can access the wizard"
site_settings:
custom_wizard_enabled: "Enable custom wizards."
diff --git a/lib/custom_wizard/action.rb b/lib/custom_wizard/action.rb
index edd3b23c..ac0799f3 100644
--- a/lib/custom_wizard/action.rb
+++ b/lib/custom_wizard/action.rb
@@ -6,6 +6,14 @@ class CustomWizard::Action
:guardian,
:result
+ REQUIRES_USER = %w[
+ create_topic
+ update_profile
+ open_composer
+ watch_categories
+ add_to_group
+ ]
+
def initialize(opts)
@wizard = opts[:wizard]
@action = opts[:action]
@@ -17,6 +25,12 @@ class CustomWizard::Action
end
def perform
+ if REQUIRES_USER.include?(action['id']) && !@user
+ log_error("action requires user", "id: #{action['id']};")
+ @result.success = false
+ return @result
+ end
+
ActiveRecord::Base.transaction do
self.send(action['type'].to_sym)
end
@@ -76,7 +90,6 @@ class CustomWizard::Action
end
def send_message
-
if action['required'].present?
required = CustomWizard::Mapper.new(
inputs: action['required'],
@@ -123,13 +136,14 @@ class CustomWizard::Action
params[:archetype] = Archetype.private_message
- creator = PostCreator.new(user, params)
+ poster = user || Discourse.system_user
+ creator = PostCreator.new(poster, params)
post = creator.create
if creator.errors.present?
messages = creator.errors.full_messages.join(" ")
log_error("failed to create message", messages)
- elsif action['skip_redirect'].blank?
+ elsif user && action['skip_redirect'].blank?
@submission.redirect_on_complete = post.topic.url
end
@@ -442,11 +456,16 @@ class CustomWizard::Action
if new_group_params[:usernames].present?
user_ids = get_user_ids(new_group_params[:usernames])
+ if user_ids.count < new_group_params[:usernames].count
+ log_error("Warning, group creation: some users were not found!")
+ end
user_ids -= owner_ids if owner_ids
user_ids.each { |user_id| group.group_users.build(user_id: user_id) }
end
- log_success("Group created", group.name)
+ if group.save
+ log_success("Group created", group.name)
+ end
result.output = group.name
else
@@ -809,10 +828,12 @@ class CustomWizard::Action
end
def save_log
+ username = user ? user.username : @wizard.actor_id
+
CustomWizard::Log.create(
@wizard.id,
action['type'],
- user.username,
+ username,
@log.join('; ')
)
end
diff --git a/lib/custom_wizard/api/log_entry.rb b/lib/custom_wizard/api/log_entry.rb
index 31af514e..f4f0ce69 100644
--- a/lib/custom_wizard/api/log_entry.rb
+++ b/lib/custom_wizard/api/log_entry.rb
@@ -65,18 +65,18 @@ class CustomWizard::Api::LogEntry
data = ::JSON.parse(record['value'])
data[:log_id] = record['key'].split('_').last
this_user = User.find_by(id: data['user_id'])
- unless this_user.nil?
- data[:user_id] = this_user.id || nil
- data[:username] = this_user.username || ""
- data[:userpath] = "/u/#{this_user.username_lower}/activity"
- data[:name] = this_user.name || ""
- data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
- else
+ if this_user.nil?
data[:user_id] = nil
data[:username] = ""
data[:userpath] = ""
data[:name] = ""
data[:avatar_template] = ""
+ else
+ data[:user_id] = this_user.id || nil
+ data[:username] = this_user.username || ""
+ data[:userpath] = "/u/#{this_user.username_lower}/activity"
+ data[:name] = this_user.name || ""
+ data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
end
self.new(api_name, data)
end
diff --git a/lib/custom_wizard/builder.rb b/lib/custom_wizard/builder.rb
index 3b12ad27..0d0b689d 100644
--- a/lib/custom_wizard/builder.rb
+++ b/lib/custom_wizard/builder.rb
@@ -2,10 +2,10 @@
class CustomWizard::Builder
attr_accessor :wizard, :updater, :template
- def initialize(wizard_id, user = nil)
+ def initialize(wizard_id, user = nil, guest_id = nil)
@template = CustomWizard::Template.create(wizard_id)
return nil if @template.nil?
- @wizard = CustomWizard::Wizard.new(template.data, user)
+ @wizard = CustomWizard::Wizard.new(template.data, user, guest_id)
end
def self.sorted_handlers
@@ -182,7 +182,7 @@ class CustomWizard::Builder
if field_template['description'].present?
params[:description] = mapper.interpolate(
field_template['description'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -192,7 +192,7 @@ class CustomWizard::Builder
if field_template['preview_template'].present?
preview_template = mapper.interpolate(
field_template['preview_template'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -204,7 +204,7 @@ class CustomWizard::Builder
if field_template['placeholder'].present?
params[:placeholder] = mapper.interpolate(
field_template['placeholder'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -248,7 +248,7 @@ class CustomWizard::Builder
if step_template['description']
step.description = mapper.interpolate(
step_template['description'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
diff --git a/lib/custom_wizard/custom_field.rb b/lib/custom_wizard/custom_field.rb
index 29423ec6..e8c69c8e 100644
--- a/lib/custom_wizard/custom_field.rb
+++ b/lib/custom_wizard/custom_field.rb
@@ -140,7 +140,7 @@ class ::CustomWizard::CustomField
end
def self.cached_list
- ::CustomWizard::Cache.wrap(LIST_CACHE_KEY) do
+ @custom_wizard_cached_fields ||= ::CustomWizard::Cache.wrap(LIST_CACHE_KEY) do
PluginStoreRow.where(plugin_name: NAMESPACE).map do |record|
create_from_store(record).as_json.with_indifferent_access
end
@@ -216,6 +216,7 @@ class ::CustomWizard::CustomField
end
def self.invalidate_cache
+ @custom_wizard_cached_fields = nil
CustomWizard::Cache.new(LIST_CACHE_KEY).delete
Discourse.clear_readonly!
Discourse.request_refresh!
diff --git a/lib/custom_wizard/extensions/discourse_tagging.rb b/lib/custom_wizard/extensions/discourse_tagging.rb
index 3c81bbb3..701158bf 100644
--- a/lib/custom_wizard/extensions/discourse_tagging.rb
+++ b/lib/custom_wizard/extensions/discourse_tagging.rb
@@ -1,10 +1,9 @@
# frozen_string_literal: true
-require 'request_store'
module CustomWizardDiscourseTagging
def filter_allowed_tags(guardian, opts = {})
- if tag_groups = ::RequestStore.store[:tag_groups]
- tag_group_array = tag_groups.split(",")
+ if opts[:for_input].respond_to?(:dig) && (groups = opts.dig(:for_input, :groups)).present?
+ tag_group_array = groups.split(",")
filtered_tags = TagGroup.includes(:tags).where(name: tag_group_array).map do |tag_group|
tag_group.tags.pluck(:name)
end.flatten
diff --git a/lib/custom_wizard/extensions/tags_controller.rb b/lib/custom_wizard/extensions/tags_controller.rb
deleted file mode 100644
index 0ddacb5f..00000000
--- a/lib/custom_wizard/extensions/tags_controller.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-require 'request_store'
-
-module CustomWizardTagsController
- def search
- ::RequestStore.store[:tag_groups] = params[:tag_groups] if params[:tag_groups].present?
- super
- end
-end
diff --git a/lib/custom_wizard/field.rb b/lib/custom_wizard/field.rb
index 6215fc8c..ec85ff3a 100644
--- a/lib/custom_wizard/field.rb
+++ b/lib/custom_wizard/field.rb
@@ -29,6 +29,11 @@ class CustomWizard::Field
attr_accessor :index,
:step
+ REQUIRES_USER = %w[
+ composer
+ upload
+ ]
+
def initialize(attrs)
@raw = attrs || {}
@id = attrs[:id]
diff --git a/lib/custom_wizard/log.rb b/lib/custom_wizard/log.rb
index cb5b78c7..ed9624e1 100644
--- a/lib/custom_wizard/log.rb
+++ b/lib/custom_wizard/log.rb
@@ -15,13 +15,13 @@ class CustomWizard::Log
@username = attrs['username']
end
- def self.create(wizard_id, action, username, message)
+ def self.create(wizard_id, action, username, message, date = Time.now)
log_id = SecureRandom.hex(12)
PluginStore.set('custom_wizard_log',
log_id.to_s,
{
- date: Time.now,
+ date: date,
wizard_id: wizard_id,
action: action,
username: username,
diff --git a/lib/custom_wizard/mapper.rb b/lib/custom_wizard/mapper.rb
index b677a710..66a10736 100644
--- a/lib/custom_wizard/mapper.rb
+++ b/lib/custom_wizard/mapper.rb
@@ -30,6 +30,7 @@ class CustomWizard::Mapper
OPERATORS = {
equal: '==',
+ not_equal: "!=",
greater: '>',
less: '<',
greater_or_equal: '>=',
@@ -44,7 +45,7 @@ class CustomWizard::Mapper
def initialize(params)
@inputs = params[:inputs] || {}
- @data = params[:data] || {}
+ @data = params[:data] ? params[:data].with_indifferent_access : {}
@user = params[:user]
@opts = params[:opts] || {}
end
@@ -203,6 +204,8 @@ class CustomWizard::Mapper
end
def map_user_field(value)
+ return nil unless user
+
if value.include?(User::USER_FIELD_PREFIX)
user.custom_fields[value]
elsif PROFILE_FIELDS.include?(value)
@@ -229,7 +232,7 @@ class CustomWizard::Mapper
def interpolate(string, opts = { user: true, wizard: true, value: true, template: false })
return string if string.blank? || string.frozen?
- if opts[:user]
+ if opts[:user] && @user.present?
string.gsub!(/u\{(.*?)\}/) { |match| map_user_field($1) || '' }
end
@@ -253,7 +256,7 @@ class CustomWizard::Mapper
end
end
- if opts[:template] && CustomWizard::Subscription.subscribed?
+ if opts[:template] #&& CustomWizard::Subscription.subscribed?
template = Liquid::Template.parse(string)
string = template.render(data)
end
@@ -265,7 +268,12 @@ class CustomWizard::Mapper
return nil if data.nil?
k = keys.shift
result = data[k]
- keys.empty? ? result : self.recurse(result, keys)
+
+ if keys.empty?
+ result.is_a?(Hash) ? "" : result
+ else
+ self.recurse(result, keys)
+ end
end
def bool(value)
@@ -282,4 +290,8 @@ class CustomWizard::Mapper
user.avatar_template_url.gsub("{size}", parts.last)
end
end
+
+ def self.mapped_value?(value)
+ value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) && v.key?("type") }
+ end
end
diff --git a/lib/custom_wizard/step_updater.rb b/lib/custom_wizard/step_updater.rb
index ab86f3fa..511001c2 100644
--- a/lib/custom_wizard/step_updater.rb
+++ b/lib/custom_wizard/step_updater.rb
@@ -5,8 +5,7 @@ class CustomWizard::StepUpdater
attr_accessor :refresh_required, :result
attr_reader :step, :submission
- def initialize(current_user, wizard, step, submission)
- @current_user = current_user
+ def initialize(wizard, step, submission)
@wizard = wizard
@step = step
@refresh_required = false
@@ -22,9 +21,9 @@ class CustomWizard::StepUpdater
@step.updater.call(self)
- UserHistory.create(
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: @current_user.id,
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: @wizard.actor_id,
context: @wizard.id,
subject: @step.id
)
diff --git a/lib/custom_wizard/submission.rb b/lib/custom_wizard/submission.rb
index a52172e3..ae616b0b 100644
--- a/lib/custom_wizard/submission.rb
+++ b/lib/custom_wizard/submission.rb
@@ -7,8 +7,6 @@ class CustomWizard::Submission
META ||= %w(updated_at submitted_at route_to redirect_on_complete redirect_to)
attr_reader :id,
- :user,
- :user_id,
:wizard
attr_accessor :fields,
@@ -18,15 +16,8 @@ class CustomWizard::Submission
class_eval { attr_accessor attr }
end
- def initialize(wizard, data = {}, user_id = nil)
+ def initialize(wizard, data = {})
@wizard = wizard
- @user_id = user_id
-
- if user_id
- @user = User.find_by(id: user_id)
- else
- @user = wizard.user
- end
data = (data || {}).with_indifferent_access
@id = data['id'] || SecureRandom.hex(12)
@@ -44,13 +35,13 @@ class CustomWizard::Submission
return nil unless wizard.save_submissions
validate
- submission_list = self.class.list(wizard, user_id: user.id)
+ submission_list = self.class.list(wizard)
submissions = submission_list.submissions.select { |submission| submission.id != self.id }
self.updated_at = Time.now.iso8601
submissions.push(self)
submission_data = submissions.map { |submission| data_to_save(submission) }
- PluginStore.set("#{wizard.id}_#{KEY}", user.id, submission_data)
+ PluginStore.set("#{wizard.id}_#{KEY}", wizard.actor_id, submission_data)
end
def validate
@@ -93,25 +84,25 @@ class CustomWizard::Submission
data
end
- def self.get(wizard, user_id)
- data = PluginStore.get("#{wizard.id}_#{KEY}", user_id).last
- new(wizard, data, user_id)
+ def submitted?
+ !!submitted_at
+ end
+
+ def self.get(wizard)
+ data = PluginStore.get("#{wizard.id}_#{KEY}", wizard.actor_id).last
+ new(wizard, data)
end
def remove
if present?
- user_id = @user.id
- wizard_id = @wizard.id
- submission_id = @id
- data = PluginStore.get("#{wizard_id}_#{KEY}", user_id)
- data.delete_if { |sub| sub["id"] == submission_id }
- PluginStore.set("#{wizard_id}_#{KEY}", user_id, data)
+ data = PluginStore.get("#{@wizard.id}_#{KEY}", wizard.actor_id)
+ data.delete_if { |sub| sub["id"] == @id }
+ PluginStore.set("#{@wizard.id}_#{KEY}", wizard.actor_id, data)
end
end
def self.cleanup_incomplete_submissions(wizard)
- user_id = wizard.user.id
- all_submissions = list(wizard, user_id: user_id)
+ all_submissions = list(wizard)
sorted_submissions = all_submissions.submissions.sort_by do |submission|
zero_epoch_time = DateTime.strptime("0", '%s')
[
@@ -129,20 +120,27 @@ class CustomWizard::Submission
end
valid_data = valid_submissions.map { |submission| submission.data_to_save(submission) }
- PluginStore.set("#{wizard.id}_#{KEY}", user_id, valid_data)
+ PluginStore.set("#{wizard.id}_#{KEY}", wizard.actor_id, valid_data)
end
- def self.list(wizard, user_id: nil, order_by: nil, page: nil)
+ def self.list(wizard, order_by: nil, page: nil)
+ list_actor_id = wizard.actor_id
+ list_user = wizard.user if wizard.user.present?
+
params = { plugin_name: "#{wizard.id}_#{KEY}" }
- params[:key] = user_id if user_id.present?
+ params[:key] = list_actor_id if list_actor_id
query = PluginStoreRow.where(params)
result = OpenStruct.new(submissions: [], total: nil)
query.each do |record|
if (submission_data = ::JSON.parse(record.value)).any?
+ submission_user = list_user || User.find_by(id: record.key.to_i)
+
submission_data.each do |data|
- result.submissions.push(new(wizard, data, record.key))
+ _wizard = wizard.clone
+ _wizard.user = submission_user if submission_user.present?
+ result.submissions.push(new(_wizard, data))
end
end
end
diff --git a/lib/custom_wizard/subscription.rb b/lib/custom_wizard/subscription.rb
index c3c9803d..ee72b7f8 100644
--- a/lib/custom_wizard/subscription.rb
+++ b/lib/custom_wizard/subscription.rb
@@ -1,8 +1,10 @@
# frozen_string_literal: true
class CustomWizard::Subscription
- STANDARD_PRODUCT_ID = 'prod_MH11woVoZU5AWb'
- BUSINESS_PRODUCT_ID = 'prod_MH0wT627okh3Ef'
- COMMUNITY_PRODUCT_ID = 'prod_MU7l9EjxhaukZ7'
+ PRODUCT_HIERARCHY = %w[
+ community
+ standard
+ business
+ ]
def self.attributes
{
@@ -17,7 +19,7 @@ class CustomWizard::Subscription
none: [],
standard: ['*'],
business: ['*'],
- community: ['*']
+ community: ['*', "!#{CustomWizard::Wizard::GUEST_GROUP_ID}"]
},
restart_on_revisit: {
none: [],
@@ -99,8 +101,31 @@ class CustomWizard::Subscription
}
end
+ attr_accessor :product_id,
+ :product_slug
+
def initialize
- @subscription = find_subscription
+ if CustomWizard::Subscription.client_installed?
+ result = DiscourseSubscriptionClient.find_subscriptions("discourse-custom-wizard")
+
+ if result&.any?
+ ids_and_slugs = result.subscriptions.map do |subscription|
+ {
+ id: subscription.product_id,
+ slug: result.products[subscription.product_id]
+ }
+ end
+
+ id_and_slug = ids_and_slugs.sort do |a, b|
+ PRODUCT_HIERARCHY.index(b[:slug]) - PRODUCT_HIERARCHY.index(a[:slug])
+ end.first
+
+ @product_id = id_and_slug[:id]
+ @product_slug = id_and_slug[:slug]
+ end
+ end
+
+ @product_slug ||= ENV["CUSTOM_WIZARD_PRODUCT_SLUG"]
end
def includes?(feature, attribute, value = nil)
@@ -114,8 +139,15 @@ class CustomWizard::Subscription
## Subscription type does not support the attribute.
return false if values.blank?
+ ## Value is an exception for the subscription type
+ if (exceptions = get_exceptions(values)).any?
+ value = mapped_output(value) if CustomWizard::Mapper.mapped_value?(value)
+ value = [*value].map(&:to_s)
+ return false if (exceptions & value).length > 0
+ end
+
## Subscription type supports all values of the attribute.
- return true if values.first === "*"
+ return true if values.include?("*")
## Subscription type supports some values of the attributes.
values.include?(value)
@@ -123,8 +155,8 @@ class CustomWizard::Subscription
def type
return :none unless subscribed?
- return :standard if standard?
return :business if business?
+ return :standard if standard?
return :community if community?
end
@@ -133,36 +165,19 @@ class CustomWizard::Subscription
end
def standard?
- @subscription.product_id === STANDARD_PRODUCT_ID
+ product_slug === "standard"
end
def business?
- @subscription.product_id === BUSINESS_PRODUCT_ID
+ product_slug === "business"
end
def community?
- @subscription.product_id === COMMUNITY_PRODUCT_ID
+ product_slug === "community"
end
- def client_installed?
- defined?(SubscriptionClient) == 'constant' && SubscriptionClient.class == Module
- end
-
- def find_subscription
- subscription = nil
-
- if client_installed?
- subscription = SubscriptionClientSubscription.active
- .where(product_id: [STANDARD_PRODUCT_ID, BUSINESS_PRODUCT_ID, COMMUNITY_PRODUCT_ID])
- .order("product_id = '#{BUSINESS_PRODUCT_ID}' DESC")
- .first
- end
-
- unless subscription
- subscription = OpenStruct.new(product_id: nil)
- end
-
- subscription
+ def self.client_installed?
+ defined?(DiscourseSubscriptionClient) == 'constant' && DiscourseSubscriptionClient.class == Module
end
def self.subscribed?
@@ -185,11 +200,24 @@ class CustomWizard::Subscription
new.type
end
- def self.client_installed?
- new.client_installed?
- end
-
def self.includes?(feature, attribute, value)
new.includes?(feature, attribute, value)
end
+
+ protected
+
+ def get_exceptions(values)
+ values.reduce([]) do |result, value|
+ result << value.split("!").last if value.start_with?("!")
+ result
+ end
+ end
+
+ def mapped_output(value)
+ value.reduce([]) do |result, v|
+ ## We can only validate mapped assignment values at the moment
+ result << v["output"] if v.is_a?(Hash) && v["type"] === "assignment"
+ result
+ end.flatten
+ end
end
diff --git a/lib/custom_wizard/template.rb b/lib/custom_wizard/template.rb
index 4163a1f7..9674f64a 100644
--- a/lib/custom_wizard/template.rb
+++ b/lib/custom_wizard/template.rb
@@ -23,7 +23,6 @@ class CustomWizard::Template
normalize_data
validate_data
prepare_data
-
return false if errors.any?
ActiveRecord::Base.transaction do
@@ -65,6 +64,8 @@ class CustomWizard::Template
ensure_wizard_upload_references!(wizard_id)
PluginStore.remove(CustomWizard::PLUGIN_NAME, wizard.id)
clear_user_wizard_redirect(wizard_id, after_time: !!wizard.after_time)
+ related_custom_fields = CategoryCustomField.where(name: 'create_topic_wizard', value: wizard.name.parameterize(separator: "_"))
+ related_custom_fields.destroy_all
end
clear_cache_keys
diff --git a/lib/custom_wizard/user_history.rb b/lib/custom_wizard/user_history.rb
new file mode 100644
index 00000000..1d5ee3e1
--- /dev/null
+++ b/lib/custom_wizard/user_history.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+UserHistory.actions[:custom_wizard_step] = 1000
+
+class CustomWizard::UserHistory
+ def self.where(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.where(where_opts(actor_id, action, context, subject))
+ end
+
+ def self.create(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.create(create_opts(actor_id, action, context, subject))
+ end
+
+ def self.create!(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.create!(create_opts(actor_id, action, context, subject))
+ end
+
+ def self.actions
+ @actions ||=
+ Enum.new(
+ step: UserHistory.actions[:custom_wizard_step]
+ )
+ end
+
+ def self.where_opts(actor_id, action, context, subject)
+ opts = {
+ context: context
+ }
+ opts[:action] = action if action
+ opts[:subject] = subject if subject
+ add_actor(opts, actor_id)
+ end
+
+ def self.create_opts(actor_id, action, context, subject)
+ opts = {
+ action: action,
+ context: context
+ }
+ opts[:subject] = subject if subject
+ add_actor(opts, actor_id)
+ end
+
+ def self.add_actor(opts, actor_id)
+ acting_user_id = actor_id
+
+ if actor_id.is_a?(String) && actor_id.include?(CustomWizard::Wizard::GUEST_ID_PREFIX)
+ opts[:acting_user_id] = Discourse.system_user.id
+ opts[:details] = actor_id
+ else
+ opts[:acting_user_id] = actor_id
+ end
+
+ opts
+ end
+end
diff --git a/lib/custom_wizard/validators/template.rb b/lib/custom_wizard/validators/template.rb
index 079f9884..f2a4feb0 100644
--- a/lib/custom_wizard/validators/template.rb
+++ b/lib/custom_wizard/validators/template.rb
@@ -30,6 +30,7 @@ class CustomWizard::TemplateValidator
validate_subscription(field, :field)
check_required(field, :field)
validate_liquid_template(field, :field)
+ validate_guests(field, :field)
end
end
end
@@ -39,6 +40,7 @@ class CustomWizard::TemplateValidator
validate_subscription(action, :action)
check_required(action, :action)
validate_liquid_template(action, :action)
+ validate_guests(action, :action)
end
end
@@ -80,6 +82,21 @@ class CustomWizard::TemplateValidator
end
end
+ def validate_guests(object, type)
+ guests_permitted = @data[:permitted] && @data[:permitted].any? do |m|
+ m["output"]&.include?(CustomWizard::Wizard::GUEST_GROUP_ID)
+ end
+ return unless guests_permitted
+
+ if type === :action && CustomWizard::Action::REQUIRES_USER.include?(object[:type])
+ errors.add :base, I18n.t("wizard.validation.not_permitted_for_guests", object_id: object[:id])
+ end
+
+ if type === :field && CustomWizard::Field::REQUIRES_USER.include?(object[:type])
+ errors.add :base, I18n.t("wizard.validation.not_permitted_for_guests", object_id: object[:id])
+ end
+ end
+
def validate_after_signup
return unless ActiveRecord::Type::Boolean.new.cast(@data[:after_signup])
diff --git a/lib/custom_wizard/wizard.rb b/lib/custom_wizard/wizard.rb
index 223aeaa5..bb22f873 100644
--- a/lib/custom_wizard/wizard.rb
+++ b/lib/custom_wizard/wizard.rb
@@ -4,8 +4,6 @@ require_dependency 'wizard/field'
require_dependency 'wizard/step_updater'
require_dependency 'wizard/builder'
-UserHistory.actions[:custom_wizard_step] = 1000
-
class CustomWizard::Wizard
include ActiveModel::SerializerSupport
@@ -31,13 +29,22 @@ class CustomWizard::Wizard
:actions,
:action_ids,
:user,
+ :guest_id,
:submissions,
:template
attr_reader :all_step_ids
- def initialize(attrs = {}, user = nil)
- @user = user
+ GUEST_ID_PREFIX ||= "guest"
+ GUEST_GROUP_ID = -1
+
+ def initialize(attrs = {}, user = nil, guest_id = nil)
+ if user
+ @user = user
+ elsif guest_id
+ @guest_id = guest_id
+ end
+
attrs = attrs.with_indifferent_access
@id = attrs['id']
@@ -81,6 +88,10 @@ class CustomWizard::Wizard
@template = attrs
end
+ def actor_id
+ user ? user.id : guest_id
+ end
+
def cast_bool(val)
val.nil? ? false : ActiveRecord::Type::Boolean.new.cast(val)
end
@@ -134,24 +145,23 @@ class CustomWizard::Wizard
step.last_step = true
end
- if step.previous && step.previous.id === last_completed_step_id
+ if !@restart_on_revisit && step.previous && step.previous.id === last_completed_step_id
@start = step.id
end
end
end
def last_completed_step_id
- if user && unfinished? && last_completed_step = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
- context: id,
- subject: all_step_ids
- ).order("created_at").last
+ return nil unless actor_id && unfinished?
- last_completed_step.subject
- else
- nil
- end
+ last_completed_step = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
+ context: id,
+ subject: all_step_ids
+ ).order("created_at").last
+
+ last_completed_step&.subject
end
def find_step(step_id)
@@ -161,15 +171,16 @@ class CustomWizard::Wizard
def create_updater(step_id, submission)
step = @steps.find { |s| s.id == step_id }
wizard = self
- CustomWizard::StepUpdater.new(user, wizard, step, submission)
+ CustomWizard::StepUpdater.new(wizard, step, submission)
end
def unfinished?
- return nil if !user
+ return nil unless actor_id
+ return false if last_submission&.submitted?
- most_recent = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
+ most_recent = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
context: id,
).distinct.order('updated_at DESC').first
@@ -183,11 +194,12 @@ class CustomWizard::Wizard
end
def completed?
- return nil if !user
+ return nil unless actor_id
+ return true if last_submission&.submitted?
- history = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
+ history = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
context: id
)
@@ -200,8 +212,9 @@ class CustomWizard::Wizard
end
def permitted?
- return false unless user
- return true if user.admin? || permitted.blank?
+ return nil unless actor_id
+ return true if user && (user.admin? || permitted.blank?)
+ return false if !user && permitted.blank?
mapper = CustomWizard::Mapper.new(
inputs: permitted,
@@ -215,27 +228,32 @@ class CustomWizard::Wizard
return true if mapper.blank?
mapper.all? do |m|
- if m[:type] === 'assignment'
- [*m[:result]].include?(Group::AUTO_GROUPS[:everyone]) ||
- GroupUser.exists?(group_id: m[:result], user_id: user.id)
- elsif m[:type] === 'validation'
- m[:result]
+ if !user
+ m[:type] === 'assignment' && [*m[:result]].include?(GUEST_GROUP_ID)
else
- true
+ if m[:type] === 'assignment'
+ [*m[:result]].include?(GUEST_GROUP_ID) ||
+ [*m[:result]].include?(Group::AUTO_GROUPS[:everyone]) ||
+ GroupUser.exists?(group_id: m[:result], user_id: user.id)
+ elsif m[:type] === 'validation'
+ m[:result]
+ else
+ true
+ end
end
end
end
def can_access?
- return false unless user
- return true if user.admin
- permitted? && (multiple_submissions || !completed?)
+ permitted? && (user&.admin? || (multiple_submissions || !completed?))
end
def reset
- ::UserHistory.create(
- action: ::UserHistory.actions[:custom_wizard_step],
- acting_user_id: user.id,
+ return nil unless actor_id
+
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: actor_id,
context: id,
subject: "reset"
)
@@ -263,8 +281,11 @@ class CustomWizard::Wizard
end
def submissions
- return nil unless user.present?
- @submissions ||= CustomWizard::Submission.list(self, user_id: user.id).submissions
+ @submissions ||= CustomWizard::Submission.list(self).submissions
+ end
+
+ def last_submission
+ @last_submission ||= submissions&.last
end
def current_submission
@@ -300,15 +321,17 @@ class CustomWizard::Wizard
end
def remove_user_redirect
+ return unless user.present?
+
if id == user.redirect_to_wizard
user.custom_fields.delete('redirect_to_wizard')
user.save_custom_fields(true)
end
end
- def self.create(wizard_id, user = nil)
+ def self.create(wizard_id, user = nil, guest_id = nil)
if template = CustomWizard::Template.find(wizard_id)
- new(template.to_h, user)
+ new(template.to_h, user, guest_id)
else
false
end
@@ -319,7 +342,7 @@ class CustomWizard::Wizard
CustomWizard::Template.list(**template_opts).reduce([]) do |result, template|
wizard = new(template, user)
- result.push(wizard) if wizard.can_access? && (
+ result.push(wizard) if wizard.permitted? && (
!not_completed || !wizard.completed?
)
result
@@ -380,4 +403,8 @@ class CustomWizard::Wizard
false
end
end
+
+ def self.generate_guest_id
+ "#{self::GUEST_ID_PREFIX}_#{SecureRandom.hex(12)}"
+ end
end
diff --git a/package.json b/package.json
index 9a3a09e6..2d3e396c 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"author": "Pavilion",
"license": "GPL V2",
"devDependencies": {
- "eslint-config-discourse": "^1.1.8",
+ "eslint-config-discourse": "^3.4.0",
"semver": "^7.3.5"
}
}
diff --git a/plugin.rb b/plugin.rb
index 3d84d670..ea56d174 100644
--- a/plugin.rb
+++ b/plugin.rb
@@ -1,8 +1,8 @@
# frozen_string_literal: true
# name: discourse-custom-wizard
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
-# version: 2.1.4
-# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever
+# version: 2.4.19
+# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever, Juan Marcos Gutierrez Ramos
# url: https://github.com/paviliondev/discourse-custom-wizard
# contact_emails: development@pavilion.tech
# subscription_url: https://coop.pavilion.tech
@@ -41,6 +41,7 @@ after_initialize do
../app/controllers/custom_wizard/admin/logs.rb
../app/controllers/custom_wizard/admin/manager.rb
../app/controllers/custom_wizard/admin/custom_fields.rb
+ ../app/controllers/custom_wizard/wizard_client.rb
../app/controllers/custom_wizard/wizard.rb
../app/controllers/custom_wizard/steps.rb
../app/controllers/custom_wizard/realtime_validations.rb
@@ -65,6 +66,7 @@ after_initialize do
../lib/custom_wizard/subscription.rb
../lib/custom_wizard/template.rb
../lib/custom_wizard/wizard.rb
+ ../lib/custom_wizard/user_history.rb
../lib/custom_wizard/api/api.rb
../lib/custom_wizard/api/authorization.rb
../lib/custom_wizard/api/endpoint.rb
@@ -88,7 +90,6 @@ after_initialize do
../lib/custom_wizard/extensions/extra_locales_controller.rb
../lib/custom_wizard/extensions/invites_controller.rb
../lib/custom_wizard/extensions/users_controller.rb
- ../lib/custom_wizard/extensions/tags_controller.rb
../lib/custom_wizard/extensions/guardian.rb
../lib/custom_wizard/extensions/custom_field/preloader.rb
../lib/custom_wizard/extensions/custom_field/serializer.rb
@@ -231,7 +232,6 @@ after_initialize do
end
reloadable_patch do |plugin|
- ::TagsController.prepend CustomWizardTagsController
::DiscourseTagging.singleton_class.prepend CustomWizardDiscourseTagging
end
diff --git a/spec/components/custom_wizard/action_spec.rb b/spec/components/custom_wizard/action_spec.rb
index 07c1084f..c450582d 100644
--- a/spec/components/custom_wizard/action_spec.rb
+++ b/spec/components/custom_wizard/action_spec.rb
@@ -2,6 +2,7 @@
describe CustomWizard::Action do
fab!(:user) { Fabricate(:user, name: "Angus", username: 'angus', email: "angus@email.com", trust_level: TrustLevel[2]) }
+ fab!(:user1) { Fabricate(:user, name: "Angus One", username: 'angus1', email: "angus_one@email.com", trust_level: TrustLevel[2]) }
fab!(:category) { Fabricate(:category, name: 'cat1', slug: 'cat-slug') }
fab!(:tag) { Fabricate(:tag, name: 'tag1') }
fab!(:group) { Fabricate(:group) }
@@ -12,12 +13,14 @@ describe CustomWizard::Action do
let(:watch_categories) { get_wizard_fixture("actions/watch_categories") }
let(:watch_tags) { get_wizard_fixture("actions/watch_tags") }
let(:create_group) { get_wizard_fixture("actions/create_group") }
+ let(:create_group_with_nonexistent_user) { get_wizard_fixture("actions/create_group_bad_user") }
let(:add_to_group) { get_wizard_fixture("actions/add_to_group") }
let(:send_message) { get_wizard_fixture("actions/send_message") }
let(:send_message_multi) { get_wizard_fixture("actions/send_message_multi") }
let(:api_test_endpoint) { get_wizard_fixture("endpoints/test_endpoint") }
let(:api_test_endpoint_body) { get_wizard_fixture("endpoints/test_endpoint_body") }
let(:api_test_no_authorization) { get_wizard_fixture("api/no_authorization") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
def update_template(template)
CustomWizard::Template.save(template, skip_jobs: true)
@@ -78,8 +81,8 @@ describe CustomWizard::Action do
updater.update
expect(updater.success?).to eq(true)
- expect(UserHistory.where(
- acting_user_id: user.id,
+ expect(CustomWizard::UserHistory.where(
+ actor_id: user.id,
context: "super_mega_fun_wizard",
subject: "step_3"
).exists?).to eq(true)
@@ -301,6 +304,28 @@ describe CustomWizard::Action do
expect(topic.first.allowed_groups.map(&:name)).to include('cool_group', 'cool_group_1')
expect(post.exists?).to eq(true)
end
+
+ it "send_message works with guests are permitted" do
+ wizard_template["permitted"] = guests_permitted["permitted"]
+ wizard_template.delete("actions")
+ wizard_template['actions'] = [send_message]
+ update_template(wizard_template)
+
+ User.create(username: 'angus1', email: "angus1@email.com")
+
+ wizard = CustomWizard::Builder.new(wizard_template["id"], nil, CustomWizard::Wizard.generate_guest_id).build
+ wizard.create_updater(wizard.steps[0].id, {}).update
+ updater = wizard.create_updater(wizard.steps[1].id, {})
+ updater.update
+
+ topic = Topic.where(archetype: Archetype.private_message, title: "Message title")
+ post = Post.where(topic_id: topic.pluck(:id))
+
+ expect(topic.exists?).to eq(true)
+ expect(topic.first.topic_allowed_users.first.user.username).to eq('angus1')
+ expect(topic.first.topic_allowed_users.second.user.username).to eq(Discourse.system_user.username)
+ expect(post.exists?).to eq(true)
+ end
end
context "business subscription actions" do
@@ -327,7 +352,25 @@ describe CustomWizard::Action do
wizard = CustomWizard::Builder.new(@template[:id], user).build
wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+ group_id = Group.where(name: wizard.current_submission.fields['action_9']).first.id
+ user_id = User.find_by(username: wizard_template['actions'][4]['usernames'][0]["output"][0]).id
+
expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
+ expect(GroupUser.where(group_id: group_id, user_id: user_id).exists?).to eq(true)
+ end
+
+ it '#create_group completes successfully when user included in usernames does not exist but excludes users who do not exist and includes warning in log' do
+ wizard_template['actions'] << create_group_with_nonexistent_user
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+
+ group_id = Group.where(name: wizard.current_submission.fields['action_9']).first.id
+
+ expect(CustomWizard::Log.list_query.all.last.value.include? "some users were not found").to eq(true)
+ expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
+ expect(GroupUser.where(group_id: group_id).count).to eq(1)
end
it '#add_to_group' do
diff --git a/spec/components/custom_wizard/builder_spec.rb b/spec/components/custom_wizard/builder_spec.rb
index ebcc355b..1e55b203 100644
--- a/spec/components/custom_wizard/builder_spec.rb
+++ b/spec/components/custom_wizard/builder_spec.rb
@@ -80,14 +80,11 @@ describe CustomWizard::Builder do
it 'returns no steps if user has completed it' do
@template[:steps].each do |step|
- UserHistory.create!(
- {
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: user.id,
- context: @template[:id]
- }.merge(
- subject: step[:id]
- )
+ CustomWizard::UserHistory.create!(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: user.id,
+ context: @template[:id],
+ subject: step[:id]
)
end
diff --git a/spec/components/custom_wizard/log_spec.rb b/spec/components/custom_wizard/log_spec.rb
index e4f5550f..c5cafba9 100644
--- a/spec/components/custom_wizard/log_spec.rb
+++ b/spec/components/custom_wizard/log_spec.rb
@@ -2,9 +2,9 @@
describe CustomWizard::Log do
before do
- CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message')
- CustomWizard::Log.create('second-test-wizard', 'perform_second_action', 'second_test_user', 'Second log message')
- CustomWizard::Log.create('third-test-wizard', 'perform_third_action', 'third_test_user', 'Third log message')
+ CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message', 5.minutes.ago)
+ CustomWizard::Log.create('second-test-wizard', 'perform_second_action', 'second_test_user', 'Second log message', 3.minutes.ago)
+ CustomWizard::Log.create('third-test-wizard', 'perform_third_action', 'third_test_user', 'Third log message', 1.minutes.ago)
end
it "creates logs" do
diff --git a/spec/components/custom_wizard/mapper_spec.rb b/spec/components/custom_wizard/mapper_spec.rb
index 56778a07..2e18cabd 100644
--- a/spec/components/custom_wizard/mapper_spec.rb
+++ b/spec/components/custom_wizard/mapper_spec.rb
@@ -58,6 +58,11 @@ describe CustomWizard::Mapper do
"step_1_field_3" => "Value"
}
}
+ let(:template_params_object) {
+ {
+ "step_1_field_1": get_wizard_fixture("field/upload")
+ }
+ }
def create_template_mapper(data, user)
CustomWizard::Mapper.new(
@@ -276,16 +281,29 @@ describe CustomWizard::Mapper do
it "avatar with valid size" do
avatar_inputs = inputs['interpolate_avatar'].dup
- avatar_inputs[0]["output"] = "Avatar: ![avatar](u{avatar.120})"
+ avatar_inputs[0]["output"] = "Avatar: ![avatar](u{avatar.144})"
expect(CustomWizard::Mapper.new(
inputs: avatar_inputs,
data: data,
user: user1
- ).perform).to eq("Avatar: ![avatar](#{user1.avatar_template_url.gsub("{size}", "120")})")
+ ).perform).to eq("Avatar: ![avatar](#{user1.avatar_template_url.gsub("{size}", "144")})")
end
end
+ it "handles not equal pairs" do
+ expect(CustomWizard::Mapper.new(
+ inputs: inputs['not_equals_pair'],
+ data: data,
+ user: user1
+ ).perform).to eq(true)
+ expect(CustomWizard::Mapper.new(
+ inputs: inputs['not_equals_pair'],
+ data: data,
+ user: user2
+ ).perform).to eq(false)
+ end
+
it "handles greater than pairs" do
expect(CustomWizard::Mapper.new(
inputs: inputs['greater_than_pair'],
@@ -373,7 +391,7 @@ describe CustomWizard::Mapper do
expect(result).to eq(template_params["step_1_field_1"])
end
- it "requires a subscription" do
+ it "does not require a subscription" do
template = '{{ "w{step_1_field_1}" | size }}'
mapper = create_template_mapper(template_params, user1)
result = mapper.interpolate(
@@ -383,7 +401,7 @@ describe CustomWizard::Mapper do
wizard: true,
value: true
)
- expect(result).to eq("{{ \"#{template_params["step_1_field_1"]}\" | size }}")
+ expect(result).to eq("5")
end
context "with a subscription" do
@@ -448,6 +466,40 @@ describe CustomWizard::Mapper do
expect(result).to eq(template)
end
+ it "handles correct object variable references" do
+ template = <<-LIQUID.strip
+ {%- if "w{step_1_field_1.id}" == "step_2_field_7" -%}
+ Correct
+ {%- else -%}
+ Incorrect
+ {%-endif-%}
+ LIQUID
+ mapper = create_template_mapper(template_params_object, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ wizard: true
+ )
+ expect(result).to eq("Correct")
+ end
+
+ it "handles incorrect object variable references" do
+ template = <<-LIQUID.strip
+ {%- if "w{step_1_field_1}" == "step_2_field_7" -%}
+ Correct
+ {%- else -%}
+ Incorrect
+ {%-endif-%}
+ LIQUID
+ mapper = create_template_mapper(template_params_object, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ wizard: true
+ )
+ expect(result).to eq("Incorrect")
+ end
+
context "custom filter: 'first_non_empty'" do
it "gives first non empty element from list" do
template = <<-LIQUID.strip
diff --git a/spec/components/custom_wizard/submission_spec.rb b/spec/components/custom_wizard/submission_spec.rb
index ff9df88a..d0e0c986 100644
--- a/spec/components/custom_wizard/submission_spec.rb
+++ b/spec/components/custom_wizard/submission_spec.rb
@@ -4,6 +4,7 @@ describe CustomWizard::Submission do
fab!(:user) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
let(:template_json) { get_wizard_fixture("wizard") }
+ let(:guest_id) { CustomWizard::Wizard.generate_guest_id }
before do
CustomWizard::Template.save(template_json, skip_jobs: true)
@@ -13,10 +14,20 @@ describe CustomWizard::Submission do
it "saves a user's submission" do
expect(
- described_class.get(@wizard, user.id).fields["step_1_field_1"]
+ described_class.get(@wizard).fields["step_1_field_1"]
).to eq("I am user submission")
end
+ it "saves a guest's submission" do
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ @wizard = CustomWizard::Wizard.create(template_json["id"], nil, guest_id)
+ described_class.new(@wizard, step_1_field_1: "I am guest submission").save
+
+ expect(
+ described_class.get(@wizard).fields["step_1_field_1"]
+ ).to eq("I am guest submission")
+ end
+
describe "#list" do
before do
freeze_time Time.now
@@ -37,14 +48,17 @@ describe CustomWizard::Submission do
end
it "list submissions by wizard" do
+ @wizard.user = nil
expect(described_class.list(@wizard).total).to eq(@count + 2)
end
it "list submissions by wizard and user" do
- expect(described_class.list(@wizard, user_id: user.id).total).to eq(@count + 1)
+ @wizard.user = user
+ expect(described_class.list(@wizard).total).to eq(@count + 1)
end
it "paginates submission lists" do
+ @wizard.user = nil
expect(described_class.list(@wizard, page: 1).submissions.size).to eq((@count + 2) - CustomWizard::Submission::PAGE_LIMIT)
end
@@ -59,7 +73,7 @@ describe CustomWizard::Submission do
described_class.new(@wizard, step_1_field_1: "I am the second submission").save
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- submissions = described_class.list(@wizard, user_id: @wizard.user.id).submissions
+ submissions = described_class.list(@wizard).submissions
expect(submissions.length).to eq(1)
expect(submissions.first.fields["step_1_field_1"]).to eq("I am the second submission")
@@ -75,7 +89,7 @@ describe CustomWizard::Submission do
PluginStore.set("#{@wizard.id}_submissions", @wizard.user.id, sub_data)
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- submissions = described_class.list(@wizard, user_id: @wizard.user.id).submissions
+ submissions = described_class.list(@wizard).submissions
expect(submissions.length).to eq(1)
expect(submissions.first.fields["step_1_field_1"]).to eq("I am the second submission")
@@ -92,7 +106,7 @@ describe CustomWizard::Submission do
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- submissions = described_class.list(@wizard, user_id: @wizard.user.id).submissions
+ submissions = described_class.list(@wizard).submissions
expect(submissions.length).to eq(1)
expect(submissions.first.fields["step_1_field_1"]).to eq("I am the third submission")
diff --git a/spec/components/custom_wizard/subscription_spec.rb b/spec/components/custom_wizard/subscription_spec.rb
index 5f06397b..239233ef 100644
--- a/spec/components/custom_wizard/subscription_spec.rb
+++ b/spec/components/custom_wizard/subscription_spec.rb
@@ -1,28 +1,24 @@
# frozen_string_literal: true
describe CustomWizard::Subscription do
- def undefine_client_classes
- Object.send(:remove_const, :SubscriptionClient) if Object.constants.include?(:SubscriptionClient)
- Object.send(:remove_const, :SubscriptionClientSubscription) if Object.constants.include?(:SubscriptionClientSubscription)
- end
-
- def define_client_classes
- load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__)
- end
-
- def stub_client_methods
- [:active, :where, :order, :first].each do |method|
- SubscriptionClientSubscription.stubs(method)
- .returns(SubscriptionClientSubscription)
- end
- SubscriptionClientSubscription.stubs(:product_id).returns(SecureRandom.hex(8))
- end
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
+ let!(:business_product_id) { SecureRandom.hex(8) }
+ let!(:standard_product_id) { SecureRandom.hex(8) }
+ let!(:community_product_id) { SecureRandom.hex(8) }
+ let!(:product_slugs) {
+ {
+ "#{business_product_id}" => "business",
+ "#{standard_product_id}" => "standard",
+ "#{community_product_id}" => "community"
+ }
+ }
after do
undefine_client_classes
end
it "detects the subscription client" do
+ undefine_client_classes
expect(described_class.client_installed?).to eq(false)
end
@@ -40,7 +36,7 @@ describe CustomWizard::Subscription do
expect(described_class.includes?(:wizard, :after_signup, true)).to eq(true)
end
- it "ubscriber features are not included" do
+ it "subscriber features are not included" do
expect(described_class.includes?(:wizard, :permitted, {})).to eq(false)
end
end
@@ -48,7 +44,6 @@ describe CustomWizard::Subscription do
context "with subscription client" do
before do
define_client_classes
- stub_client_methods
end
it "detects the subscription client" do
@@ -56,6 +51,10 @@ describe CustomWizard::Subscription do
end
context "without a subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(nil)
+ end
+
it "has none type" do
expect(described_class.type).to eq(:none)
end
@@ -69,50 +68,107 @@ describe CustomWizard::Subscription do
end
end
- context "with standard subscription" do
- before do
- SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::STANDARD_PRODUCT_ID)
+ context "with subscriptions" do
+ def get_subscription_result(product_ids)
+ result = DiscourseSubscriptionClient::Subscriptions::Result.new
+ result.supplier = SubscriptionClientSupplier.new(product_slugs)
+ result.resource = SubscriptionClientResource.new
+ result.subscriptions = product_ids.map { |product_id| SubscriptionClientSubscription.new(product_id) }
+ result.products = product_slugs
+ result
+ end
+ let!(:business_subscription_result) { get_subscription_result([business_product_id]) }
+ let!(:standard_subscription_result) { get_subscription_result([standard_product_id]) }
+ let!(:community_subscription_result) { get_subscription_result([community_product_id]) }
+ let!(:multiple_subscription_result) { get_subscription_result([community_product_id, business_product_id]) }
+
+ it "handles mapped values" do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
+ expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(true)
+
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
+ expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(false)
end
- it "detects standard type" do
- expect(described_class.type).to eq(:standard)
+ context "with a standard subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
+ end
+
+ it "detects standard type" do
+ expect(described_class.type).to eq(:standard)
+ end
+
+ it "standard features are included" do
+ expect(described_class.includes?(:wizard, :type, 'send_message')).to eq(true)
+ end
+
+ it "business features are not included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(false)
+ end
end
- it "standard features are included" do
- expect(described_class.includes?(:wizard, :type, 'send_message')).to eq(true)
+ context "with a business subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(business_subscription_result)
+ end
+
+ it "detects business type" do
+ expect(described_class.type).to eq(:business)
+ end
+
+ it "business features are included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
+ end
end
- it "business features are not included" do
- expect(described_class.includes?(:action, :type, 'create_category')).to eq(false)
+ context "with a community subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
+ end
+
+ it "detects community type" do
+ expect(described_class.type).to eq(:community)
+ end
+
+ it "community features are included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
+ end
+ end
+
+ context "with multiple subscriptions" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(multiple_subscription_result)
+ end
+
+ it "detects correct type in hierarchy" do
+ expect(described_class.type).to eq(:business)
+ end
end
end
+ end
- context "with business subscription" do
+ context "with environment variable" do
+ before do
+ ENV["CUSTOM_WIZARD_PRODUCT_SLUG"] = "standard"
+ end
+
+ after do
+ ENV["CUSTOM_WIZARD_PRODUCT_SLUG"] = nil
+ end
+
+ it "enables the relevant subscription" do
+ expect(described_class.type).to eq(:standard)
+ end
+
+ context "with a subscription" do
before do
- SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::BUSINESS_PRODUCT_ID)
+ enable_subscription("business")
end
- it "detects business type" do
+ it "respects the subscription" do
expect(described_class.type).to eq(:business)
end
-
- it "business features are included" do
- expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
- end
- end
-
- context "with community subscription" do
- before do
- SubscriptionClientSubscription.stubs(:product_id).returns(CustomWizard::Subscription::COMMUNITY_PRODUCT_ID)
- end
-
- it "detects community type" do
- expect(described_class.type).to eq(:community)
- end
-
- it "community features are included" do
- expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
- end
end
end
end
diff --git a/spec/components/custom_wizard/template_validator_spec.rb b/spec/components/custom_wizard/template_validator_spec.rb
index b149706f..fe61be91 100644
--- a/spec/components/custom_wizard/template_validator_spec.rb
+++ b/spec/components/custom_wizard/template_validator_spec.rb
@@ -7,6 +7,9 @@ describe CustomWizard::TemplateValidator do
let(:user_condition) { get_wizard_fixture("condition/user_condition") }
let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
let(:composer_preview) { get_wizard_fixture("field/composer_preview") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
+ let(:upload_field) { get_wizard_fixture("field/upload") }
+ let(:validation_condition) { get_wizard_fixture("condition/validation_condition") }
let(:valid_liquid_template) {
<<-LIQUID.strip
@@ -146,6 +149,20 @@ describe CustomWizard::TemplateValidator do
).to eq(true)
end
+ it "validates user-only features" do
+ template[:permitted] = guests_permitted['permitted']
+ template[:steps][0][:fields] << upload_field
+ validator = CustomWizard::TemplateValidator.new(template)
+ expect(validator.perform).to eq(false)
+ errors = validator.errors.to_a
+ expect(errors).to include(
+ I18n.t("wizard.validation.not_permitted_for_guests", object_id: "action_1")
+ )
+ expect(errors).to include(
+ I18n.t("wizard.validation.not_permitted_for_guests", object_id: "step_2_field_7")
+ )
+ end
+
it "validates step attributes" do
template[:steps][0][:condition] = user_condition['condition']
expect(
@@ -166,6 +183,13 @@ describe CustomWizard::TemplateValidator do
CustomWizard::TemplateValidator.new(template).perform
).to eq(true)
end
+
+ it "validates settings with validation conditions" do
+ template[:permitted] = validation_condition["condition"]
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
end
context "steps" do
diff --git a/spec/components/custom_wizard/wizard_spec.rb b/spec/components/custom_wizard/wizard_spec.rb
index 8268849c..3483d211 100644
--- a/spec/components/custom_wizard/wizard_spec.rb
+++ b/spec/components/custom_wizard/wizard_spec.rb
@@ -6,11 +6,15 @@ describe CustomWizard::Wizard do
fab!(:admin_user) { Fabricate(:user, admin: true) }
let(:template_json) { get_wizard_fixture("wizard") }
let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:guests_permitted_json) { get_wizard_fixture("wizard/guests_permitted") }
+ let(:step_json) { get_wizard_fixture("step/step") }
before do
Group.refresh_automatic_group!(:trust_level_3)
@permitted_template = template_json.dup
@permitted_template["permitted"] = permitted_json["permitted"]
+ @guests_permitted_template = template_json.dup
+ @guests_permitted_template["permitted"] = guests_permitted_json["permitted"]
@wizard = CustomWizard::Wizard.new(template_json, user)
end
@@ -21,10 +25,10 @@ describe CustomWizard::Wizard do
@wizard.update!
end
- def progress_step(step_id, acting_user: user, wizard: @wizard)
- UserHistory.create(
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: acting_user.id,
+ def progress_step(step_id, actor_id: user.id, wizard: @wizard)
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: actor_id,
context: wizard.id,
subject: step_id
)
@@ -72,6 +76,28 @@ describe CustomWizard::Wizard do
expect(@wizard.start).to eq('step_2')
end
+ it "determines the user's current step if steps are added" do
+ append_steps
+ progress_step('step_1')
+ progress_step('step_2')
+ progress_step("step_3")
+
+ fourth_step = step_json.dup
+ fourth_step['id'] = "step_4"
+ template = template_json.dup
+ template['steps'] << fourth_step
+
+ CustomWizard::Template.save(template, skip_jobs: true)
+
+ wizard = CustomWizard::Wizard.new(template, user)
+ template['steps'].each do |step_template|
+ wizard.append_step(step_template['id'])
+ end
+
+ expect(wizard.steps.size).to eq(4)
+ expect(wizard.start).to eq(nil)
+ end
+
it "creates a step updater" do
expect(
@wizard.create_updater('step_1', step_1_field_1: "Text input")
@@ -158,9 +184,9 @@ describe CustomWizard::Wizard do
it "lets a permitted user access a complete wizard with multiple submissions" do
append_steps
- progress_step("step_1", acting_user: trusted_user)
- progress_step("step_2", acting_user: trusted_user)
- progress_step("step_3", acting_user: trusted_user)
+ progress_step("step_1", actor_id: trusted_user.id)
+ progress_step("step_2", actor_id: trusted_user.id)
+ progress_step("step_3", actor_id: trusted_user.id)
@permitted_template["multiple_submissions"] = true
@@ -172,9 +198,9 @@ describe CustomWizard::Wizard do
it "does not let an unpermitted user access a complete wizard without multiple submissions" do
append_steps
- progress_step("step_1", acting_user: trusted_user)
- progress_step("step_2", acting_user: trusted_user)
- progress_step("step_3", acting_user: trusted_user)
+ progress_step("step_1", actor_id: trusted_user.id)
+ progress_step("step_2", actor_id: trusted_user.id)
+ progress_step("step_3", actor_id: trusted_user.id)
@permitted_template['multiple_submissions'] = false
@@ -200,6 +226,45 @@ describe CustomWizard::Wizard do
end
end
+ context "with subscription and restart upon revisit" do
+ before do
+ enable_subscription("standard")
+ @wizard.restart_on_revisit = true
+ CustomWizard::Template.save(@wizard.as_json)
+ end
+
+ it "returns to step 1 if option to clear submissions on each visit is set" do
+ append_steps
+ expect(@wizard.unfinished?).to eq(true)
+ progress_step('step_1')
+ expect(@wizard.start).to eq('step_1')
+ end
+ end
+
+ context "with subscription and guest wizard" do
+ before do
+ enable_subscription("standard")
+ end
+
+ it "permits admins" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, admin_user).permitted?
+ ).to eq(true)
+ end
+
+ it "permits regular users" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, user).permitted?
+ ).to eq(true)
+ end
+
+ it "permits guests" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, nil, "guest123").permitted?
+ ).to eq(true)
+ end
+ end
+
context "submissions" do
before do
CustomWizard::Submission.new(@wizard, step_1_field_1: "I am a user submission").save
diff --git a/spec/extensions/discourse_tagging_spec.rb b/spec/extensions/discourse_tagging_spec.rb
new file mode 100644
index 00000000..14adaf5b
--- /dev/null
+++ b/spec/extensions/discourse_tagging_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+describe ::DiscourseTagging, type: :request do
+ fab!(:user) { Fabricate(:user) }
+ fab!(:tag_1) { Fabricate(:tag, name: "Angus") }
+ fab!(:tag_2) { Fabricate(:tag, name: "Faizaan") }
+ fab!(:tag_3) { Fabricate(:tag, name: "Robert") }
+ fab!(:tag_4) { Fabricate(:tag, name: "Eli") }
+ fab!(:tag_5) { Fabricate(:tag, name: "Jeff") }
+
+ fab!(:tag_group_1) { Fabricate(:tag_group, tags: [tag_1, tag_2]) }
+ fab!(:tag_group_2) { Fabricate(:tag_group, tags: [tag_3, tag_4]) }
+
+ describe "#filter_allowed_tags" do
+ let(:guardian) { Guardian.new(user) }
+
+ context "for_input is a boolean" do
+ it "works normally" do
+ filter_params = {
+ q: '',
+ for_input: true
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+ all_tag_names = Tag.all.pluck(:name)
+ expect(names).to contain_exactly(*all_tag_names)
+ end
+ end
+
+ context "for_input is an object including a tag group" do
+ it "returns tags only in the tag group" do
+ filter_params = {
+ q: "",
+ for_input: {
+ name: "custom-wizard-tag-chooser",
+ groups: tag_group_1.name
+ }
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+ expected_tag_names = TagGroup
+ .includes(:tags)
+ .where(id: tag_group_1.id)
+ .map { |tag_group| tag_group.tags.pluck(:name) }.flatten
+
+ expect(names).to contain_exactly(*expected_tag_names)
+ end
+ end
+
+ context "for_input is an object including an empty tag group string" do
+ it "returns all tags" do
+ filter_params = {
+ q: "",
+ for_input: {
+ name: "custom-wizard-tag-chooser",
+ groups: ""
+ }
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+
+ all_tag_names = Tag.all.pluck(:name)
+ expect(names).to contain_exactly(*all_tag_names)
+ end
+ end
+ end
+end
diff --git a/spec/extensions/tags_controller_spec.rb b/spec/extensions/tags_controller_spec.rb
deleted file mode 100644
index b3c1ccc8..00000000
--- a/spec/extensions/tags_controller_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-describe ::TagsController, type: :request do
- fab!(:tag_1) { Fabricate(:tag, name: "Angus") }
- fab!(:tag_2) { Fabricate(:tag, name: "Faizaan") }
- fab!(:tag_3) { Fabricate(:tag, name: "Robert") }
- fab!(:tag_4) { Fabricate(:tag, name: "Eli") }
- fab!(:tag_5) { Fabricate(:tag, name: "Jeff") }
-
- fab!(:tag_group_1) { Fabricate(:tag_group, tags: [tag_1, tag_2]) }
- fab!(:tag_group_2) { Fabricate(:tag_group, tags: [tag_3, tag_4]) }
-
- before do
- ::RequestStore.store[:tag_groups] = nil
- end
-
- describe "#search" do
- context "tag group param present" do
- it "returns tags only in the tag group" do
- get "/tags/filter/search.json", params: { q: '', tag_groups: [tag_group_1.name, tag_group_2.name] }
- expect(response.status).to eq(200)
- results = response.parsed_body['results']
- names = results.map { |result| result['name'] }
-
- expected_tag_names = TagGroup
- .includes(:tags)
- .where(id: [tag_group_1.id, tag_group_2.id])
- .map { |tag_group| tag_group.tags.pluck(:name) }.flatten
-
- expect(names).to contain_exactly(*expected_tag_names)
- end
- end
-
- context "tag group param not present" do
- it "returns all tags" do
- get "/tags/filter/search.json", params: { q: '' }
- expect(response.status).to eq(200)
- results = response.parsed_body['results']
- names = results.map { |result| result['name'] }
-
- all_tag_names = Tag.all.pluck(:name)
- expect(names).to contain_exactly(*all_tag_names)
- end
- end
- end
-end
diff --git a/spec/fixtures/actions/create_group_bad_user.json b/spec/fixtures/actions/create_group_bad_user.json
new file mode 100644
index 00000000..96d6796d
--- /dev/null
+++ b/spec/fixtures/actions/create_group_bad_user.json
@@ -0,0 +1,104 @@
+{
+ "id": "action_9",
+ "run_after": "step_1",
+ "type": "create_group",
+ "title": [
+ {
+ "type": "assignment",
+ "output": "New Group Member",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "custom_fields": [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "group_custom_field",
+ "key_type": "text",
+ "value": "step_3_field_1",
+ "value_type": "wizard_field",
+ "connector": "association"
+ }
+ ]
+ }
+ ],
+ "name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "full_name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus3"
+ ]
+ }
+ ],
+ "owner_usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus"
+ ]
+ }
+ ],
+ "grant_trust_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "mentionable_level": [
+ {
+ "type": "assignment",
+ "output": "1",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "messageable_level": [
+ {
+ "type": "assignment",
+ "output": "2",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "visibility_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "members_visibility_level": [
+ {
+ "type": "assignment",
+ "output": "99",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/route_to.json b/spec/fixtures/actions/route_to.json
new file mode 100644
index 00000000..442b1556
--- /dev/null
+++ b/spec/fixtures/actions/route_to.json
@@ -0,0 +1,12 @@
+{
+ "id": "route_to",
+ "type": "route_to",
+ "url": [
+ {
+ "type": "assignment",
+ "output": "https://google.com",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/condition/validation_condition.json b/spec/fixtures/condition/validation_condition.json
new file mode 100644
index 00000000..695c25c9
--- /dev/null
+++ b/spec/fixtures/condition/validation_condition.json
@@ -0,0 +1,17 @@
+{
+ "condition": [
+ {
+ "type": "validation",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "trust_level",
+ "key_type": "user_field",
+ "value": "2",
+ "value_type": "text",
+ "connector": "greater_or_equal"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/field/upload.json b/spec/fixtures/field/upload.json
new file mode 100644
index 00000000..ebf6c21d
--- /dev/null
+++ b/spec/fixtures/field/upload.json
@@ -0,0 +1,6 @@
+{
+ "id": "step_2_field_7",
+ "label": "Upload",
+ "type": "upload",
+ "file_types": ".jpg,.jpeg,.png"
+}
\ No newline at end of file
diff --git a/spec/fixtures/mapper/inputs.json b/spec/fixtures/mapper/inputs.json
index 3fd406a4..2ef81a28 100644
--- a/spec/fixtures/mapper/inputs.json
+++ b/spec/fixtures/mapper/inputs.json
@@ -195,6 +195,21 @@
]
}
],
+ "not_equals_pair": [
+ {
+ "type": "validation",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "trust_level",
+ "key_type": "user_field",
+ "value": "1",
+ "value_type": "text",
+ "connector": "not_equal"
+ }
+ ]
+ }
+ ],
"greater_than_pair": [
{
"type": "validation",
diff --git a/spec/fixtures/sprockets/require_tree_discourse_empty.js b/spec/fixtures/sprockets/require_tree_discourse_empty.js
index 953c5ec4..4f034d13 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_empty.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_empty.js
@@ -1 +1 @@
-//= require_tree_discourse
\ No newline at end of file
+//= require_tree_discourse
diff --git a/spec/fixtures/sprockets/require_tree_discourse_non_existant.js b/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
index d9b2be76..fc4752e5 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
@@ -1 +1 @@
-//= require_tree_discourse dummy_path
\ No newline at end of file
+//= require_tree_discourse dummy_path
diff --git a/spec/fixtures/sprockets/require_tree_discourse_test.js b/spec/fixtures/sprockets/require_tree_discourse_test.js
index a86aa0d7..56451213 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_test.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_test.js
@@ -1 +1 @@
-//= require_tree_discourse sptest
\ No newline at end of file
+//= require_tree_discourse sptest
diff --git a/spec/fixtures/subscription_client.rb b/spec/fixtures/subscription_client.rb
index a041b507..acadbe8f 100644
--- a/spec/fixtures/subscription_client.rb
+++ b/spec/fixtures/subscription_client.rb
@@ -1,4 +1,40 @@
# frozen_string_literal: true
-module SubscriptionClient; end
-class SubscriptionClientSubscription; end
+module DiscourseSubscriptionClient
+ def self.find_subscriptions(resource_name)
+ end
+end
+
+class SubscriptionClientSupplier
+ attr_reader :product_slugs
+
+ def initialize(product_slugs)
+ @product_slugs = product_slugs
+ end
+end
+
+class SubscriptionClientResource
+end
+
+class SubscriptionClientSubscription
+ attr_reader :product_id
+
+ def initialize(product_id)
+ @product_id = product_id
+ end
+end
+
+module DiscourseSubscriptionClient
+ class Subscriptions
+ class Result
+ attr_accessor :supplier,
+ :resource,
+ :subscriptions,
+ :products
+
+ def any?
+ supplier.present? && resource.present? && subscriptions.present? && products.present?
+ end
+ end
+ end
+end
diff --git a/spec/fixtures/wizard.json b/spec/fixtures/wizard.json
index de5e636e..5868001e 100644
--- a/spec/fixtures/wizard.json
+++ b/spec/fixtures/wizard.json
@@ -74,12 +74,6 @@
"id": "step_2_field_5",
"label": "Checkbox",
"type": "checkbox"
- },
- {
- "id": "step_2_field_7",
- "label": "Upload",
- "type": "upload",
- "file_types": ".jpg,.jpeg,.png"
}
],
"description": "Because I couldn't think of another name for this step :)"
diff --git a/spec/fixtures/wizard/guests_permitted.json b/spec/fixtures/wizard/guests_permitted.json
new file mode 100644
index 00000000..3a332f31
--- /dev/null
+++ b/spec/fixtures/wizard/guests_permitted.json
@@ -0,0 +1,12 @@
+{
+ "permitted": [
+ {
+ "type": "assignment",
+ "output_type": "group",
+ "output_connector": "set",
+ "output": [
+ -1
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/plugin_helper.rb b/spec/plugin_helper.rb
index a0189de1..53b7173c 100644
--- a/spec/plugin_helper.rb
+++ b/spec/plugin_helper.rb
@@ -9,7 +9,26 @@ def get_wizard_fixture(path)
end
def enable_subscription(type)
- CustomWizard::Subscription.stubs(:client_installed?).returns(true)
CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(true)
CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(true)
end
+
+def disable_subscriptions
+ %w[
+ standard
+ business
+ community
+ ].each do |type|
+ CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(false)
+ CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(false)
+ end
+end
+
+def undefine_client_classes
+ Object.send(:remove_const, :DiscourseSubscriptionClient) if Object.constants.include?(:DiscourseSubscriptionClient)
+ Object.send(:remove_const, :SubscriptionClientSubscription) if Object.constants.include?(:SubscriptionClientSubscription)
+end
+
+def define_client_classes
+ load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__)
+end
diff --git a/spec/requests/custom_wizard/admin/admin_controller_spec.rb b/spec/requests/custom_wizard/admin/admin_controller_spec.rb
new file mode 100644
index 00000000..877f4262
--- /dev/null
+++ b/spec/requests/custom_wizard/admin/admin_controller_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+describe CustomWizard::AdminController do
+ fab!(:admin_user) { Fabricate(:user, admin: true) }
+
+ it "requires an admin" do
+ get "/admin/wizards.json"
+ expect(response.status).to eq(404)
+ end
+
+ context "with an admin" do
+ before do
+ sign_in(admin_user)
+ end
+
+ context "without a subscription" do
+ before do
+ disable_subscriptions
+ define_client_classes
+ end
+
+ it "returns the right subscription details" do
+ get "/admin/wizards.json"
+ expect(response.parsed_body["subscribed"]).to eq(false)
+ expect(response.parsed_body["subscription_attributes"]).to eq(CustomWizard::Subscription.attributes.as_json)
+ expect(response.parsed_body["subscription_client_installed"]).to eq(true)
+ end
+ end
+
+ context "with a subscription" do
+ before do
+ enable_subscription("standard")
+ define_client_classes
+ end
+
+ it "returns the right subscription details" do
+ get "/admin/wizards.json"
+ expect(response.parsed_body["subscribed"]).to eq(true)
+ expect(response.parsed_body["subscription_type"]).to eq("standard")
+ expect(response.parsed_body["subscription_client_installed"]).to eq(true)
+ end
+ end
+ end
+end
diff --git a/spec/requests/custom_wizard/admin/manager_controller_spec.rb b/spec/requests/custom_wizard/admin/manager_controller_spec.rb
index 30c1aa3a..c5282db6 100644
--- a/spec/requests/custom_wizard/admin/manager_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/manager_controller_spec.rb
@@ -13,8 +13,8 @@ describe CustomWizard::AdminManagerController do
template_3["id"] = 'super_mega_fun_wizard_3'
@template_array = [template, template_2, template_3]
- FileUtils.mkdir_p(file_from_fixtures_tmp_folder) unless Dir.exists?(file_from_fixtures_tmp_folder)
- @tmp_file_path = File.join(file_from_fixtures_tmp_folder, SecureRandom.hex << 'wizards.json')
+ FileUtils.mkdir_p(concurrency_safe_tmp_dir) unless Dir.exist?(concurrency_safe_tmp_dir)
+ @tmp_file_path = File.join(concurrency_safe_tmp_dir, SecureRandom.hex << 'wizards.json')
File.write(@tmp_file_path, @template_array.to_json)
end
diff --git a/spec/requests/custom_wizard/admin/submissions_controller_spec.rb b/spec/requests/custom_wizard/admin/submissions_controller_spec.rb
deleted file mode 100644
index 3c740c85..00000000
--- a/spec/requests/custom_wizard/admin/submissions_controller_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-describe CustomWizard::AdminSubmissionsController do
- fab!(:admin_user) { Fabricate(:user, admin: true) }
- fab!(:user1) { Fabricate(:user) }
- fab!(:user2) { Fabricate(:user) }
- fab!(:user3) { Fabricate(:user) }
-
- let(:template) { get_wizard_fixture("wizard") }
- let(:template_2) {
- temp = template.dup
- temp["id"] = "super_mega_fun_wizard_2"
- temp
- }
-
- before do
- CustomWizard::Template.save(template, skip_jobs: true)
- CustomWizard::Template.save(template_2, skip_jobs: true)
-
- wizard1 = CustomWizard::Wizard.create(template["id"], user1)
- wizard2 = CustomWizard::Wizard.create(template["id"], user2)
- wizard3 = CustomWizard::Wizard.create(template_2["id"], user3)
-
- CustomWizard::Submission.new(wizard1, step_1_field_1: "I am a user1's submission").save
- CustomWizard::Submission.new(wizard2, step_1_field_1: "I am a user2's submission").save
- CustomWizard::Submission.new(wizard3, step_1_field_1: "I am a user3's submission").save
-
- sign_in(admin_user)
- end
-
- it "returns a list of wizards" do
- get "/admin/wizards/submissions.json"
- expect(response.parsed_body.length).to eq(2)
- expect(response.parsed_body.first['id']).to eq(template['id'])
- end
-
- it "returns users' submissions for a wizard" do
- get "/admin/wizards/submissions/#{template['id']}.json"
- expect(response.parsed_body['submissions'].length).to eq(2)
- end
-
- it "downloads submissions" do
- get "/admin/wizards/submissions/#{template_2['id']}/download"
- expect(response.parsed_body.length).to eq(1)
- end
-end
diff --git a/spec/requests/custom_wizard/admin/wizard_controller_spec.rb b/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
index 9f63cb6b..c94007e2 100644
--- a/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
@@ -5,6 +5,7 @@ describe CustomWizard::AdminWizardController do
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
let(:template) { get_wizard_fixture("wizard") }
+ let(:category) { Fabricate(:category, custom_fields: { create_topic_wizard: template['name'].parameterize(separator: "_") }) }
before do
CustomWizard::Template.save(template, skip_jobs: true)
@@ -39,10 +40,12 @@ describe CustomWizard::AdminWizardController do
expect(response.parsed_body['steps'].length).to eq(3)
end
- it "removes wizard templates" do
+ it "removes wizard templates whilst making sure create_topic_wizard settings for that wizard are removed from Categories" do
+ expect(CategoryCustomField.find_by(category_id: category.id, name: 'create_topic_wizard', value: template['name'].parameterize(separator: "_"))).not_to eq(nil)
delete "/admin/wizards/wizard/#{template['id']}.json"
expect(response.status).to eq(200)
expect(CustomWizard::Template.exists?(template['id'])).to eq(false)
+ expect(CategoryCustomField.find_by(name: 'create_topic_wizard', value: template['name'].parameterize(separator: "_"))).to eq(nil)
end
it "saves wizard templates" do
diff --git a/spec/requests/custom_wizard/steps_controller_spec.rb b/spec/requests/custom_wizard/steps_controller_spec.rb
index e05ba917..4d8b96eb 100644
--- a/spec/requests/custom_wizard/steps_controller_spec.rb
+++ b/spec/requests/custom_wizard/steps_controller_spec.rb
@@ -7,192 +7,209 @@ describe CustomWizard::StepsController do
let(:wizard_field_condition_template) { get_wizard_fixture("condition/wizard_field_condition") }
let(:user_condition_template) { get_wizard_fixture("condition/user_condition") }
let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:route_to_template) { get_wizard_fixture("actions/route_to") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
before do
CustomWizard::Template.save(wizard_template, skip_jobs: true)
- sign_in(user)
end
- it 'performs a step update' do
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Text input"
+ def guest_template
+ temp = wizard_template.dup
+ temp["permitted"] = guests_permitted["permitted"]
+ temp.delete("actions")
+ temp["actions"] = [route_to_template]
+ temp
+ end
+
+ context "with guest" do
+ it "does not perform a step update" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
}
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
-
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
- expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
- end
-
- context "raises an error" do
- it "when the wizard doesnt exist" do
- put '/w/not-super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(400)
- end
-
- it "when the user cant access the wizard" do
- enable_subscription("standard")
- new_template = wizard_template.dup
- new_template["permitted"] = permitted_json["permitted"]
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json'
expect(response.status).to eq(403)
end
- it "when the step doesnt exist" do
- put '/w/super-mega-fun-wizard/steps/step_10.json'
- expect(response.status).to eq(400)
+ context "with guests permitted" do
+ before do
+ enable_subscription("standard")
+ result = CustomWizard::Template.save(guest_template, skip_jobs: true)
+ end
+
+ it "performs a step update" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, nil, cookies[:custom_wizard_guest_id])
+ expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
+ end
+
+ context "raises an error" do
+ it "when the wizard doesnt exist" do
+ put '/w/not-super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(400)
+ end
+
+ it "when the user cant access the wizard" do
+ enable_subscription("standard")
+ new_template = guest_template.dup
+ new_template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "when the step doesnt exist" do
+ put '/w/super-mega-fun-wizard/steps/step_10.json'
+ expect(response.status).to eq(400)
+ end
+ end
+
+ it "works if the step has no fields" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "returns an updated wizard when condition passes" do
+ new_template = guest_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "runs completion actions if guest has completed wizard" do
+ new_template = guest_template.dup
+
+ ## route_to action
+ new_template['actions'].last['run_after'] = 'wizard_completion'
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
+ end
end
end
- it "works if the step has no fields" do
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
- end
-
- it "returns an updated wizard when condition passes" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
- end
-
- it "runs completion actions if user has completed wizard" do
- new_template = wizard_template.dup
-
- ## route_to action
- new_template['actions'].last['run_after'] = 'wizard_completion'
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- put '/w/super-mega-fun-wizard/steps/step_3.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
- end
-
- it "saves results of completion actions if user has completed wizard" do
- new_template = wizard_template.dup
- new_template['actions'].first['run_after'] = 'wizard_completion'
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Topic title",
- step_1_field_2: "Topic post"
- }
- }
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- put '/w/super-mega-fun-wizard/steps/step_3.json'
-
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
-
- topic_id = wizard.submissions.first.fields[new_template['actions'].first['id']]
- topic = Topic.find(topic_id)
- expect(topic.present?).to eq(true)
- end
-
- it "returns a final step without conditions" do
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
-
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
-
- put '/w/super-mega-fun-wizard/steps/step_3.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
-
- context "subscription" do
+ context "with user" do
before do
- enable_subscription("standard")
+ sign_in(user)
end
- it "raises an error when user cant see the step due to conditions" do
- sign_in(user2)
-
- new_wizard_template = wizard_template.dup
- new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
- CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(403)
- end
-
- it "returns an updated wizard when condition doesnt pass" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
+ it 'performs a step update' do
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
fields: {
- step_1_field_1: "Condition wont pass"
+ step_1_field_1: "Text input"
}
}
expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_3")
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+ expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
end
- it "returns the correct final step when the conditional final step and last step are the same" do
- new_template = wizard_template.dup
- new_template['steps'][0]['condition'] = user_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ context "raises an error" do
+ it "when the wizard doesnt exist" do
+ put '/w/not-super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(400)
+ end
+
+ it "when the user cant access the wizard" do
+ enable_subscription("standard")
+ new_template = wizard_template.dup
+ new_template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "when the step doesnt exist" do
+ put '/w/super-mega-fun-wizard/steps/step_10.json'
+ expect(response.status).to eq(400)
+ end
end
- it "raises an error when user cant see the step due to conditions" do
- sign_in(user2)
-
- new_wizard_template = wizard_template.dup
- new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
- CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
-
+ it "works if the step has no fields" do
put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(403)
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
end
- it "returns an updated wizard when condition doesnt pass" do
+ it "returns an updated wizard when condition passes" do
new_template = wizard_template.dup
new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
CustomWizard::Template.save(new_template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition wont pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_3")
- end
-
- it "returns the correct final step when the conditional final step and last step are the same" do
- new_template = wizard_template.dup
- new_template['steps'][0]['condition'] = user_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
fields: {
step_1_field_1: "Condition will pass"
}
}
expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "runs completion actions if user has completed wizard" do
+ new_template = wizard_template.dup
+
+ ## route_to action
+ new_template['actions'].last['run_after'] = 'wizard_completion'
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
+ end
+
+ it "saves results of completion actions if user has completed wizard" do
+ new_template = wizard_template.dup
+ new_template['actions'].first['run_after'] = 'wizard_completion'
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Topic title",
+ step_1_field_2: "Topic post"
+ }
+ }
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+
+ topic_id = wizard.submissions.first.fields[new_template['actions'].first['id']]
+ topic = Topic.find(topic_id)
+ expect(topic.present?).to eq(true)
+ end
+
+ it "returns a final step without conditions" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(200)
expect(response.parsed_body['final']).to eq(false)
put '/w/super-mega-fun-wizard/steps/step_2.json'
@@ -204,66 +221,152 @@ describe CustomWizard::StepsController do
expect(response.parsed_body['final']).to eq(true)
end
- it "returns the correct final step when the conditional final step and last step are different" do
- new_template = wizard_template.dup
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ context "subscription" do
+ before do
+ enable_subscription("standard")
+ end
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
+ it "raises an error when user cant see the step due to conditions" do
+ sign_in(user2)
+
+ new_wizard_template = wizard_template.dup
+ new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
+ CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "returns an updated wizard when condition doesnt pass" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition wont pass"
+ }
}
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_3")
+ end
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
+ it "returns the correct final step when the conditional final step and last step are the same" do
+ new_template = wizard_template.dup
+ new_template['steps'][0]['condition'] = user_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+ end
- it "returns the correct final step when the conditional final step is determined in the same action" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ it "raises an error when user cant see the step due to conditions" do
+ sign_in(user2)
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
+ new_wizard_template = wizard_template.dup
+ new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
+ CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "returns an updated wizard when condition doesnt pass" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition wont pass"
+ }
}
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_3")
+ end
- it "excludes the non-included conditional fields from the submissions" do
- new_template = wizard_template.dup
- new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ it "returns the correct final step when the conditional final step and last step are the same" do
+ new_template = wizard_template.dup
+ new_template['steps'][0]['condition'] = user_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will pass"
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
}
- }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
- put '/w/super-mega-fun-wizard/steps/step_2.json', params: {
- fields: {
- step_2_field_1: "1995-04-23"
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
+
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
+
+ it "returns the correct final step when the conditional final step and last step are different" do
+ new_template = wizard_template.dup
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
}
- }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
+
+ it "returns the correct final step when the conditional final step is determined in the same action" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
}
- }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
- submission = wizard.current_submission
- expect(submission.fields.keys).not_to include("step_2_field_1")
+ it "excludes the non-included conditional fields from the submissions" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
+
+ put '/w/super-mega-fun-wizard/steps/step_2.json', params: {
+ fields: {
+ step_2_field_1: "1995-04-23"
+ }
+ }
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
+ }
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+ submission = wizard.current_submission
+ expect(submission.fields.keys).not_to include("step_2_field_1")
+ end
end
end
end
diff --git a/spec/requests/custom_wizard/wizard_controller_spec.rb b/spec/requests/custom_wizard/wizard_controller_spec.rb
index aa1f479b..93ec196b 100644
--- a/spec/requests/custom_wizard/wizard_controller_spec.rb
+++ b/spec/requests/custom_wizard/wizard_controller_spec.rb
@@ -8,7 +8,6 @@ describe CustomWizard::WizardController do
before do
CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find("super_mega_fun_wizard")
- sign_in(user)
end
context 'plugin disabled' do
@@ -32,65 +31,70 @@ describe CustomWizard::WizardController do
expect(response.parsed_body["error"]).to eq("We couldn't find a wizard at that address.")
end
- context 'when user skips the wizard' do
-
- it 'skips a wizard if user is allowed to skip' do
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
+ context "with user" do
+ before do
+ sign_in(user)
end
- it 'lets user skip if user cant access wizard' do
- enable_subscription("standard")
- @template["permitted"] = permitted_json["permitted"]
- CustomWizard::Template.save(@template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
- end
+ context 'when user skips' do
+ it 'skips a wizard if user is allowed to skip' do
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ end
- it 'returns a no skip message if user is not allowed to skip' do
- enable_subscription("standard")
- @template['required'] = 'true'
- CustomWizard::Template.save(@template)
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
- end
+ it 'lets user skip if user cant access wizard' do
+ enable_subscription("standard")
+ @template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(@template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ end
- it 'skip response contains a redirect_to if in users submissions' do
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.parsed_body['redirect_to']).to eq('/t/2')
- end
+ it 'returns a no skip message if user is not allowed to skip' do
+ enable_subscription("standard")
+ @template['required'] = 'true'
+ CustomWizard::Template.save(@template)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
+ end
- it 'deletes the users redirect_to_wizard if present' do
- user.custom_fields['redirect_to_wizard'] = @template["id"]
- user.save_custom_fields(true)
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
- expect(user.reload.redirect_to_wizard).to eq(nil)
- end
+ it 'skip response contains a redirect_to if in users submissions' do
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.parsed_body['redirect_to']).to eq('/t/2')
+ end
- it "deletes the submission if user has filled up some data" do
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
- current_submission = @wizard.current_submission
- put '/w/super-mega-fun-wizard/skip.json'
- submissions = CustomWizard::Submission.list(@wizard).submissions
+ it 'deletes the users redirect_to_wizard if present' do
+ user.custom_fields['redirect_to_wizard'] = @template["id"]
+ user.save_custom_fields(true)
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ expect(user.reload.redirect_to_wizard).to eq(nil)
+ end
- expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
- end
+ it "deletes the submission if user has filled up some data" do
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
+ current_submission = @wizard.current_submission
+ put '/w/super-mega-fun-wizard/skip.json'
+ submissions = CustomWizard::Submission.list(@wizard).submissions
- it "starts from the first step if user visits after skipping the wizard" do
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Text input"
+ expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
+ end
+
+ it "starts from the first step if user visits after skipping the wizard" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
}
- }
- put '/w/super-mega-fun-wizard/skip.json'
- get '/w/super-mega-fun-wizard.json'
+ put '/w/super-mega-fun-wizard/skip.json'
+ get '/w/super-mega-fun-wizard.json'
- expect(response.parsed_body["start"]).to eq('step_1')
+ expect(response.parsed_body["start"]).to eq('step_1')
+ end
end
end
end
diff --git a/spec/serializers/custom_wizard/log_serializer_spec.rb b/spec/serializers/custom_wizard/log_serializer_spec.rb
index 7dd1db0f..cad4a85b 100644
--- a/spec/serializers/custom_wizard/log_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/log_serializer_spec.rb
@@ -4,7 +4,7 @@ describe CustomWizard::LogSerializer do
fab!(:user) { Fabricate(:user) }
it 'should return log attributes' do
- CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message')
+ CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message', 1.day.ago)
CustomWizard::Log.create('second-test-wizard', 'perform_second_action', 'second_test_user', 'Second log message')
json_array = ActiveModel::ArraySerializer.new(
diff --git a/spec/serializers/custom_wizard/submission_serializer_spec.rb b/spec/serializers/custom_wizard/submission_serializer_spec.rb
index 02d8be8a..2fa000e8 100644
--- a/spec/serializers/custom_wizard/submission_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/submission_serializer_spec.rb
@@ -3,7 +3,8 @@
require_relative '../../plugin_helper'
describe CustomWizard::SubmissionSerializer do
- fab!(:user) { Fabricate(:user) }
+ fab!(:user1) { Fabricate(:user) }
+ fab!(:user2) { Fabricate(:user) }
let(:template_json) {
JSON.parse(File.open(
@@ -13,36 +14,43 @@ describe CustomWizard::SubmissionSerializer do
before do
CustomWizard::Template.save(template_json, skip_jobs: true)
- wizard = CustomWizard::Wizard.create(template_json["id"], user)
- CustomWizard::Submission.new(wizard,
- step_1_field_1: "I am user submission",
- submitted_at: Time.now.iso8601
- ).save
- @list = CustomWizard::Submission.list(wizard, page: 0)
+
+ wizard = CustomWizard::Wizard.create(template_json["id"], user1)
+ CustomWizard::Submission.new(wizard, step_1_field_1: "I am user1 submission", submitted_at: Time.now.iso8601).save
+
+ wizard = CustomWizard::Wizard.create(template_json["id"], user2)
+ CustomWizard::Submission.new(wizard, step_1_field_1: "I am user2 submission", submitted_at: Time.now.iso8601).save
end
it 'should return submission attributes' do
+ wizard = CustomWizard::Wizard.create(template_json["id"])
+ list = CustomWizard::Submission.list(wizard, page: 0)
+
json_array = ActiveModel::ArraySerializer.new(
- @list.submissions,
+ list.submissions,
each_serializer: described_class
).as_json
- expect(json_array.length).to eq(1)
+ expect(json_array.length).to eq(2)
expect(json_array[0][:id].present?).to eq(true)
- expect(json_array[0][:user].present?).to eq(true)
expect(json_array[0][:submitted_at].present?).to eq(true)
+ expect(json_array[0][:user]).to eq(BasicUserSerializer.new(user2, root: false).as_json)
+ expect(json_array[1][:user]).to eq(BasicUserSerializer.new(user1, root: false).as_json)
end
it "should return field values, types and labels" do
+ wizard = CustomWizard::Wizard.create(template_json["id"])
+ list = CustomWizard::Submission.list(wizard, page: 0)
+
json_array = ActiveModel::ArraySerializer.new(
- @list.submissions,
+ list.submissions,
each_serializer: described_class
).as_json
- expect(json_array.length).to eq(1)
+ expect(json_array.length).to eq(2)
expect(json_array[0][:fields].as_json).to eq({
"step_1_field_1": {
- "value": "I am user submission",
+ "value": "I am user2 submission",
"type": "text",
"label": "Text"
}
diff --git a/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb b/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
index 1ac2579e..0568f898 100644
--- a/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
@@ -29,6 +29,5 @@ describe CustomWizard::FieldSerializer do
scope: Guardian.new(user)
).as_json
expect(json_array[0][:format]).to eq("YYYY-MM-DD")
- expect(json_array[5][:file_types]).to eq(".jpg,.jpeg,.png")
end
end
diff --git a/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js b/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js
new file mode 100644
index 00000000..8811c989
--- /dev/null
+++ b/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js
@@ -0,0 +1,358 @@
+import {
+ acceptance,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, fillIn, findAll, visit, waitUntil } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getCustomFields,
+ getUnsubscribedAdminWizards,
+ getWizard,
+} from "../helpers/admin-wizard";
+import { Promise } from "rsvp";
+
+acceptance("Admin | Custom Fields Unsuscribed", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.put("/admin/wizards/custom-fields", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.delete("/admin/wizards/custom-fields/topic_custom_field", () => {
+ return helper.response({ success: "OK" });
+ });
+ });
+
+ async function selectTypeAndSerializerAndFillInName(
+ type,
+ serializer,
+ name,
+ summaryName
+ ) {
+ const typeDropdown = selectKit(
+ `.admin-wizard-container details:has(summary[name="${summaryName}"])`
+ );
+ await typeDropdown.expand();
+ await click(
+ `.select-kit-collection li[data-value="${type.toLowerCase()}"]`
+ );
+
+ const serializerDropdown = selectKit(
+ ".admin-wizard-container details.multi-select"
+ );
+ await serializerDropdown.expand();
+ await click(
+ `.select-kit-collection li[data-value="${serializer
+ .toLowerCase()
+ .replace(/ /g, "_")}"]`
+ );
+
+ await fillIn(
+ ".admin-wizard-container input",
+ name.toLowerCase().replace(/ /g, "_")
+ );
+ }
+
+ async function waitForSaveMessage() {
+ // Wait for the "Saved custom field" message to appear
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Saved custom field",
+ { timeout: 5000 }
+ );
+
+ // Wait for the message to change back to the original text
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "View, create, edit and destroy custom fields",
+ { timeout: 15000 }
+ );
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ }
+
+ test("Navigate to custom fields tab", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(find("table"));
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "View, create, edit and destroy custom fields"
+ ),
+ "it displays wizard message"
+ );
+ });
+ test("view available custom fields for unsubscribed plan", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+ assert.ok(
+ visible(".wizard-subscription-selector"),
+ "custom field class is present"
+ );
+ assert.ok(
+ visible(".wizard-subscription-selector-header"),
+ "custom field type is present"
+ );
+ assert.ok(visible(".input"), "custom field name is present");
+ assert.ok(visible(".multi-select"), "custom field serializer is present");
+ assert.ok(visible(".actions"), "custom field action buttons are present");
+
+ const dropdown1 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdown1.expand();
+ let enabledOptions1 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"]) ul li:not(.disabled)'
+ );
+ let disabledOptions1 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"]) ul li.disabled'
+ );
+ assert.equal(
+ enabledOptions1.length,
+ 2,
+ "There are two enabled options for class fields"
+ );
+ assert.equal(
+ disabledOptions1.length,
+ 2,
+ "There are two disabled options for class fields"
+ );
+ const dropdown2 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"])'
+ );
+ await dropdown2.expand();
+ let enabledOptions2 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"]) ul li:not(.disabled)'
+ );
+ let disabledOptions2 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"]) ul li.disabled'
+ );
+ assert.equal(
+ enabledOptions2.length,
+ 3,
+ "There are three enabled options for type"
+ );
+ assert.equal(
+ disabledOptions2.length,
+ 1,
+ "There is one disabled option for type"
+ );
+ });
+ test("change custom fields for unsubscribed plan", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdown1 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdown1.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ const serializerDropdown = selectKit(
+ ".admin-wizard-container details.multi-select"
+ );
+ await serializerDropdown.expand();
+ let enabledOptions1 = findAll(
+ ".admin-wizard-container details.multi-select ul li"
+ );
+ assert.equal(
+ enabledOptions1.length,
+ 2,
+ "There are two enabled options in the serializer dropdown for Topic"
+ );
+ await serializerDropdown.collapse();
+ const dropdown2 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Topic"])'
+ );
+ await dropdown2.expand();
+ await click('.select-kit-collection li[data-value="post"]');
+ await serializerDropdown.expand();
+ let enabledOptions2 = findAll(
+ ".admin-wizard-container details.multi-select ul li"
+ );
+ assert.equal(
+ enabledOptions2.length,
+ 1,
+ "There is one enabled option in the serializer dropdown for Post"
+ );
+ });
+
+ test("Create Topic and Post custom fields", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+
+ await click(".actions .save");
+ // Wait for the "Saved custom field" message to appear
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("topic"),
+ "Topic custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("topic_custom_field"),
+ "Topic custom field name is displayed"
+ );
+
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownPost = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownPost.expand();
+ await click('.select-kit-collection li[data-value="post"]');
+
+ await selectTypeAndSerializerAndFillInName(
+ "Boolean",
+ "Post",
+ "Post Custom Field",
+ "Filter by: Select a type"
+ );
+
+ await click(".actions .save");
+ // Wait for the "Saved custom field" message to appear
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("post"),
+ "Post custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("post_custom_field"),
+ "Post custom field name is displayed"
+ );
+ assert.ok(
+ findAll("table tbody tr").length === 6,
+ "Display added custom fields"
+ );
+ });
+ test("Update Topic custom field", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+ await click(".actions .save");
+ await waitForSaveMessage();
+ await click(".admin-wizard-container tbody tr:first-child button");
+ await selectTypeAndSerializerAndFillInName(
+ "Boolean",
+ "Topic List Item",
+ "Updated Topic Custom Field",
+ "Filter by: String"
+ );
+ await click(".admin-wizard-container tbody tr:first-child .save");
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("topic"),
+ "Topic custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(2) label"
+ ).innerText.includes("boolean"),
+ "Updated Type is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("updated_topic_custom_field"),
+ "Updated Topic custom field name is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(4)"
+ ).innerText.includes("topic_view"),
+ "Original Serializer is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(4)"
+ ).innerText.includes("topic_list_item"),
+ "Updated Serializer is displayed"
+ );
+ });
+ test("Delete Topic custom field", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+ await click(".actions .save");
+ await waitForSaveMessage();
+ assert.ok(
+ findAll("table tbody tr").length === 5,
+ "Display added custom fields"
+ );
+ await click(".admin-wizard-container tbody tr:first-child button");
+ await click(".actions .destroy");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display custom fields without deleted fields"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-logs-test.js b/test/javascripts/acceptance/admin-logs-test.js
new file mode 100644
index 00000000..c888a55a
--- /dev/null
+++ b/test/javascripts/acceptance/admin-logs-test.js
@@ -0,0 +1,69 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardTestingLog,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Logs", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/logs", () => {
+ return helper.response([
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ ]);
+ });
+ server.get("/admin/wizards/logs/this_is_testing_wizard", () => {
+ return helper.response(getWizardTestingLog);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ });
+ test("viewing logs fields tab", async (assert) => {
+ await visit("/admin/wizards/logs");
+ const wizards = selectKit(".select-kit");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard to see its logs"
+ ),
+ "it displays logs message"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes("Select a wizard"),
+ "it displays list of logs"
+ );
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "View recent logs for wizards on the forum"
+ ),
+ "it displays logs for a selected wizard"
+ );
+ assert.ok(find("table"));
+ assert.ok(findAll("table tbody tr").length === 2, "Displays logs list");
+
+ await click(".refresh.btn");
+ assert.ok(find("table"));
+ assert.ok(
+ findAll("table tbody tr").length === 2,
+ "Refresh button works correctly"
+ );
+
+ await wizards.expand();
+ await click('[data-name="Select a wizard"]');
+ const wizardContainerDiv = find(".admin-wizard-container");
+ assert.ok(wizardContainerDiv.children().length === 0, "the div is empty");
+ });
+});
diff --git a/test/javascripts/acceptance/admin-manager-test.js b/test/javascripts/acceptance/admin-manager-test.js
new file mode 100644
index 00000000..4ce1c0bf
--- /dev/null
+++ b/test/javascripts/acceptance/admin-manager-test.js
@@ -0,0 +1,112 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, find, findAll, visit, waitUntil } from "@ember/test-helpers";
+import {
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardTestingLog,
+} from "../helpers/admin-wizard";
+import { Promise } from "rsvp";
+
+acceptance("Admin | Manager", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/manager/this_is_testing_wizard", () => {
+ return helper.response(getWizardTestingLog);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.delete("/admin/wizards/manager/destroy", () => {
+ return helper.response({
+ success: "OK",
+ destroyed: [
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ ],
+ failures: [],
+ });
+ });
+ });
+ async function waitForDestructionAndResetMessage() {
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Destruction complete",
+ { timeout: 5000 }
+ );
+
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Export, import or destroy wizards" &&
+ !document.querySelector(".message-block.primary ul") &&
+ !find(".message-block.primary svg").classList.contains(
+ "d-icon-check-circle"
+ ),
+ { timeout: 15000 }
+ );
+ // Wait an additional second after the conditions are met
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ }
+
+ test("viewing manager fields content", async (assert) => {
+ await visit("/admin/wizards/manager");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Export, import or destroy wizards"
+ ),
+ "it displays manager message"
+ );
+ assert.ok(
+ find('table tr[data-wizard-id="this-is-testing-wizard"]'),
+ "table shows the wizard content list"
+ );
+
+ const checkbox = findAll(
+ 'table tr[data-wizard-id="this-is-testing-wizard"] input[type="checkbox"]'
+ );
+ const exportCheck = checkbox[0];
+ const destroyCheck = checkbox[1];
+
+ const exportButton = find("#export-button");
+ assert.ok(
+ exportButton.hasAttribute("disabled"),
+ "the export button is disabled when export checkbox is unchecked"
+ );
+
+ await click(exportCheck);
+ assert.ok(
+ !exportButton.hasAttribute("disabled"),
+ "the export button is enabled when export checkbox is clicked"
+ );
+ await click(exportCheck);
+ assert.ok(
+ exportButton.hasAttribute("disabled"),
+ "the export button is disabled when export checkbox is unchecked"
+ );
+ const destroyButton = find("#destroy-button");
+ assert.ok(
+ destroyButton.hasAttribute("disabled"),
+ "the destroy button is disabled when destroy checkbox is unchecked"
+ );
+ await click(destroyCheck);
+ assert.ok(
+ !destroyButton.hasAttribute("disabled"),
+ "the destroy button is enabled when destroy checkbox is clicked"
+ );
+ await click("#destroy-button");
+
+ assert.notOk(
+ find('table tr[data-wizard-id="this-is-testing-wizard"]'),
+ "the wizard row is removed after destroy button is clicked"
+ );
+ await waitForDestructionAndResetMessage();
+ });
+});
diff --git a/test/javascripts/acceptance/admin-submissions-test.js b/test/javascripts/acceptance/admin-submissions-test.js
new file mode 100644
index 00000000..50635a37
--- /dev/null
+++ b/test/javascripts/acceptance/admin-submissions-test.js
@@ -0,0 +1,229 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAnotherWizardSubmission,
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardSubmissions,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Submissions", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/submissions", () => {
+ return helper.response([
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ { id: "another_wizard", name: "another wizard" },
+ ]);
+ });
+ server.get("/admin/wizards/submissions/this_is_testing_wizard", () => {
+ return helper.response(getWizardSubmissions);
+ });
+ server.get("/admin/wizards/submissions/another_wizard", () => {
+ return helper.response(getAnotherWizardSubmission);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ });
+ test("View submissions fields tab and content", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = selectKit(".select-kit");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard to see its submissions"
+ ),
+ "it displays submissions message"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes("Select a wizard"),
+ "it displays list of wizards"
+ );
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're viewing the submissions of the This is testing wizard"
+ ),
+ "it displays submissions for a selected wizard"
+ );
+ const submissions = getWizardSubmissions.submissions; // Get submissions data from your JSON file
+ const rows = findAll("table tbody tr");
+
+ for (let i = 0; i < submissions.length; i++) {
+ const dateCell = rows[i].querySelector("td:nth-child(1)");
+ const userCell = rows[i].querySelector("td:nth-child(2)");
+ const stepCell = rows[i].querySelector("td:nth-child(3)");
+ const expectedDate = moment(submissions[i].submitted_at).format(
+ "MMM D, YYYY h:mm a"
+ );
+
+ assert.equal(
+ dateCell.innerText,
+ expectedDate,
+ `Date is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ userCell.innerText.trim(),
+ submissions[i].user.username,
+ `User is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ stepCell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_1_field_1.value,
+ `Step is displayed correctly for submission ${i + 1}`
+ );
+ }
+ assert.ok(
+ findAll("table tbody tr").length >= 1,
+ "Displays submissions list"
+ );
+
+ await wizards.expand();
+ await click('[data-name="Select a wizard"]');
+ const wizardContainerDiv = find(".admin-wizard-container");
+ assert.ok(wizardContainerDiv.children().length === 0, "the div is empty");
+ });
+ test("View submissions tab for another wizard with more steps", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = selectKit(".select-kit");
+
+ await wizards.expand();
+ await wizards.selectRowByValue("another_wizard");
+
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're viewing the submissions of the another wizard"
+ ),
+ "it displays submissions for another wizard"
+ );
+
+ const submissions = getAnotherWizardSubmission.submissions; // Get submissions data from your JSON file
+ const rows = findAll("table tbody tr");
+
+ for (let i = 0; i < submissions.length; i++) {
+ const dateCell = rows[i].querySelector("td:nth-child(1)");
+ const userCell = rows[i].querySelector("td:nth-child(2)");
+ const step1Cell = rows[i].querySelector("td:nth-child(3)");
+ const step2Cell = rows[i].querySelector("td:nth-child(4)");
+ const submission = submissions[i];
+ const expectedDate = moment(submission.submitted_at).format(
+ "MMM D, YYYY h:mm a"
+ );
+
+ assert.equal(
+ dateCell.innerText,
+ expectedDate,
+ `Date is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ userCell.innerText.trim(),
+ submissions[i].user.username,
+ `User is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ step1Cell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_1_field_1.value,
+ `Step 1 is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ step2Cell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_2_field_1.value,
+ `Step 2 is displayed correctly for submission ${i + 1}`
+ );
+ }
+
+ assert.ok(
+ findAll("table tbody tr").length >= 1,
+ "Displays submissions list for another wizard"
+ );
+ });
+ test("Modal actions for submissions", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = await selectKit(".select-kit");
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+
+ await click(".open-edit-columns-btn");
+ assert.dom(".modal-inner-container").exists("Modal is displayed");
+
+ const userCheckbox = find(
+ ".edit-directory-columns-container .edit-directory-column:nth-child(2) .left-content .column-name input"
+ );
+ assert.ok(userCheckbox, "User checkbox is present");
+ assert.ok(userCheckbox[0].checked, "User checkbox is checked by default");
+ await click(userCheckbox[0]);
+ assert.notOk(
+ userCheckbox[0].checked,
+ "User checkbox is unchecked after clicking"
+ );
+
+ await click(".modal-footer .btn-primary");
+ assert
+ .dom("table thead th")
+ .doesNotIncludeText("User", "User column is not displayed");
+
+ await click(".open-edit-columns-btn");
+ const submittedAtCheckbox = find(
+ ".edit-directory-columns-container .edit-directory-column:nth-child(1) .left-content .column-name input"
+ );
+ assert.ok(submittedAtCheckbox, "Submitted At checkbox is present");
+ assert.ok(
+ submittedAtCheckbox[0].checked,
+ "Submitted At checkbox is checked by default"
+ );
+ await click(submittedAtCheckbox[0]);
+
+ await click(".modal-footer .btn-primary");
+ assert.notOk(
+ submittedAtCheckbox[0].checked,
+ "Submitted At checkbox is unchecked after clicking"
+ );
+ assert
+ .dom("table thead th")
+ .doesNotIncludeText(
+ "Submitted At",
+ "Submitted At column is not displayed"
+ );
+
+ await click(".open-edit-columns-btn");
+ await click(".modal-footer .btn-secondary");
+
+ assert
+ .dom("table thead th:nth-child(1)")
+ .hasText("Submitted At", "Submitted At column is displayed after reset");
+ assert
+ .dom("table thead th:nth-child(2)")
+ .hasText("User", "User column is displayed after reset");
+ });
+ test("Download submissions", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = await selectKit(".select-kit");
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+
+ const downloadLinks = findAll(".download-link");
+ assert.ok(downloadLinks.length > 1, "Download links are present");
+
+ const downloadLink = downloadLinks[1];
+ await click(downloadLink);
+
+ const expectedURL =
+ "/admin/wizards/submissions/this_is_testing_wizard/download";
+ const actualURL = new URL(downloadLink.href);
+ assert.equal(
+ actualURL.pathname,
+ expectedURL,
+ "Download link has correct URL"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-api-test.js b/test/javascripts/acceptance/admin-wizards-api-test.js
new file mode 100644
index 00000000..80fb1014
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-api-test.js
@@ -0,0 +1,123 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getBusinessAdminWizard,
+ getCustomFields,
+ getNewApi,
+ getWizard,
+ putNewApi,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | API tab", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getBusinessAdminWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response([
+ {
+ name: "new_api",
+ title: "new API",
+ endpoints: [{ id: "59e3b6", name: "ag" }],
+ },
+ ]);
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.put("/admin/wizards/api/new_api", () => {
+ return helper.response(putNewApi);
+ });
+ server.get("/admin/wizards/api/new_api", () => {
+ return helper.response(getNewApi);
+ });
+ });
+
+ test("Visit API tab and fill data", async function (assert) {
+ await visit("/admin/wizards/api");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 6, "There should be 6 admin tabs");
+
+ // create new api
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".wizard-header.large").innerText.includes("New API"),
+ "it displays API creation message"
+ );
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/api/create",
+ "clicking the button navigates to the correct URL"
+ );
+ // fill data
+ await fillIn('.metadata input[placeholder="Display name"]', "new API");
+ await fillIn('.metadata input[placeholder="Underscored"]', "new_api");
+ const fieldTypeDropdown = selectKit(
+ ".wizard-api-authentication .settings .control-group.auth-type .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("basic");
+ await fillIn(
+ ".wizard-api-authentication .settings .control-group:nth-child(3) .controls input",
+ "some_username"
+ );
+ await fillIn(
+ ".wizard-api-authentication .settings .control-group:nth-child(4) .controls input",
+ "some_password"
+ );
+ await click(".wizard-api-endpoints button");
+ await fillIn(
+ '.wizard-api-endpoints .endpoint .top input[placeholder="Endpoint name"]',
+ "endpoint_name"
+ );
+ await fillIn(
+ '.wizard-api-endpoints .endpoint .top input[placeholder="Enter a url"]',
+ "https://test.api.com"
+ );
+ const endpointMethodDropdown = await selectKit(
+ '.wizard-api-endpoints .endpoint .bottom details:has(summary[name="Filter by: Select a method"])'
+ );
+ await endpointMethodDropdown.expand();
+ await endpointMethodDropdown.selectRowByValue("POST");
+
+ const contentTypeDropdown = await selectKit(
+ '.wizard-api-endpoints .endpoint .bottom details:has(summary[name="Filter by: Select a content type"])'
+ );
+ await contentTypeDropdown.expand();
+ await contentTypeDropdown.selectRowByValue("application/json");
+
+ const successCodesDropdown = await selectKit(
+ ".wizard-api-endpoints .endpoint .bottom details.multi-select"
+ );
+ await successCodesDropdown.expand();
+ await successCodesDropdown.selectRowByValue(200);
+ await successCodesDropdown.selectRowByValue(100);
+
+ assert.strictEqual(
+ successCodesDropdown.header().value(),
+ "200,100",
+ "group should be set"
+ );
+ await click(".wizard-api-header.page button.btn-primary");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/api/new_api",
+ "clicking the button navigates to the correct URL"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-business-subscription-test.js b/test/javascripts/acceptance/admin-wizards-business-subscription-test.js
new file mode 100644
index 00000000..a3edc9bc
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-business-subscription-test.js
@@ -0,0 +1,252 @@
+import {
+ acceptance,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getBusinessAdminWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Business Subscription", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getBusinessAdminWizard);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response([]);
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ });
+
+ test("Displaying all tabs including API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 6, "There should be 6 admin tabs");
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ // "Step 1: Inserting a title
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 1,
+ "Wizard subscription features are accesible"
+ );
+ await click(
+ '.wizard-subscription-container .subscription-settings .setting-value input[type="checkbox"]'
+ );
+ assert.ok(
+ find(
+ '.wizard-subscription-container .subscription-settings .setting-value input[type="checkbox"]'
+ ).is(":checked"),
+ "subscription feature available"
+ );
+
+ // Step 2: Creating a step section
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 2,
+ "Steps subscription features are accesible"
+ );
+ // Step 3: Creating a field section
+ await click(".field .link-list button");
+
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 3,
+ "Field subscription features are accesible"
+ );
+
+ // Step 4: Creating a action section
+ await click(".action .link-list button");
+
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 0,
+ "Disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 11,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("send_to_api");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 5,
+ "Display all settings of send to api"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_category");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 9,
+ "Display all settings of create categories"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_group");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 14,
+ "Display all settings of create group"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ //Step 5: Save wizard
+ await click(".admin-wizard-buttons button");
+
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "clicking the button navigates to the correct URL"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js b/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js
new file mode 100644
index 00000000..364ee26f
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js
@@ -0,0 +1,245 @@
+import {
+ acceptance,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getStandardAdminWizard,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Standard Subscription", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getStandardAdminWizard);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ });
+
+ test("Displaying all tabs except API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 5, "There should be 5 admin tabs");
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ // ("Step 1: Inserting a title")
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 1,
+ "Wizard subscription features are accesible"
+ );
+ const subsFeature = find(
+ ".wizard-subscription-container .subscription-settings .setting-value input"
+ );
+ await click(
+ ".wizard-subscription-container .subscription-settings .setting-value input"
+ );
+ assert.ok(subsFeature.is(":checked"), "subscription feature available");
+ // ("Step 2: Creating a step section")
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 2,
+ "Steps subscription features are accesible"
+ );
+ // step("Step 3: Creating a field section")
+ await click(".field .link-list button");
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 3,
+ "Field subscription features are accesible"
+ );
+ // ("Step 4: Creating a action section")
+ await click(".action .link-list button");
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 4,
+ "Disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 7,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("send_message");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 9,
+ "Display all settings of send message"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("watch_categories");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 7,
+ "Display all settings of watch categories"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("add_to_group");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 3,
+ "Display all settings of add to group"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ // step("Step 5: Save wizard");
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ await click(".admin-wizard-buttons button");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "clicking the button navigates to the correct URL"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-unsuscribed-test.js b/test/javascripts/acceptance/admin-wizards-unsuscribed-test.js
new file mode 100644
index 00000000..9e2b00e7
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-unsuscribed-test.js
@@ -0,0 +1,566 @@
+import {
+ acceptance,
+ exists,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getUniqueWizard,
+ getUnsubscribedAdminWizards,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Unsuscribed", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ server.get("/admin/wizards/wizard/unique_wizard", () => {
+ return helper.response(getUniqueWizard);
+ });
+ });
+
+ async function appendText(selector, text) {
+ let element = document.querySelector(selector);
+ if (element) {
+ let currentValue = element.value;
+ let newValue = currentValue + text;
+ await fillIn(selector, newValue);
+ }
+ }
+
+ test("Displaying all tabs except API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 5, "There should be 5 admin tabs");
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ await click(".btn-after-time");
+ assert.ok(
+ exists(".d-date-time-input .d-time-input span.name"),
+ "a time selector is shown"
+ );
+ let timeText = query(
+ ".d-date-time-input .d-time-input span.name"
+ ).innerText;
+ const regex = /\d\d\:\d\d/;
+ assert.ok(regex.test(timeText));
+ assert.equal(
+ $.trim($("a[title='Subscribe to use these features']").text()),
+ "Not Subscribed",
+ "Show messsage and link of user not subscribed"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 1,
+ "Wizard subscription features are not accesible"
+ );
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 2,
+ "Steps subscription features are not accesible"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "Input in step description composer"
+ );
+ await click(".wizard-custom-step .wizard-editor-gutter button:first-child");
+ assert.strictEqual(
+ query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper p"
+ ).textContent.trim(),
+ "Input in step description composer"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n**Bold text**"
+ );
+ let boldText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper strong"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ boldText,
+ "Bold text",
+ "The bold text in the preview wrapper should be 'Bold Text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n*emphasized text*"
+ );
+ let empText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper em"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ empText,
+ "emphasized text",
+ "The emphasized text in the preview wrapper should be 'emphasized text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n> Blockqoute text"
+ );
+ let blockquoteText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper blockquote p"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ blockquoteText,
+ "Blockqoute text",
+ "The emphasized text in the preview wrapper should be 'Blockqoute text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n\`\`\`
+ \code text
+ \n\`\`\``
+ );
+ let codeText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper code"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ codeText,
+ "code text",
+ "The emphasized text in the preview wrapper should be 'code text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n* List item\n* List item`
+ );
+ let listItems = findAll(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper ul li"
+ );
+ assert.strictEqual(
+ listItems.length,
+ 2,
+ "There should be two list items in the unordered list in the preview wrapper"
+ );
+ assert.strictEqual(
+ listItems[0].textContent.trim(),
+ "List item",
+ "The first list item should be 'List item'"
+ );
+ assert.strictEqual(
+ listItems[1].textContent.trim(),
+ "List item",
+ "The second list item should be 'List item'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n1. List item\n1. List item`
+ );
+ let orderedListItems = findAll(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper ol li"
+ );
+ assert.strictEqual(
+ orderedListItems.length,
+ 2,
+ "There should be two list items in the ordered list in the preview wrapper"
+ );
+ assert.strictEqual(
+ orderedListItems[0].textContent.trim(),
+ "List item",
+ "The first list item should be 'List item'"
+ );
+ assert.strictEqual(
+ orderedListItems[1].textContent.trim(),
+ "List item",
+ "The second list item should be 'List item'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n`
+ );
+ await click(
+ ".wizard-custom-step .wizard-text-editor .d-editor button.link"
+ );
+ assert.ok(exists(".insert-link.modal-body"), "hyperlink modal visible");
+
+ await fillIn(".modal-body .link-url", "google.com");
+ await fillIn(".modal-body .link-text", "Google");
+ await click(".modal-footer button.btn-primary");
+ let urlText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper a"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ urlText,
+ "Google",
+ "The link text in the preview wrapper should be 'Google'"
+ );
+ await click(
+ ".wizard-custom-step .wizard-text-editor .d-editor button.local-dates"
+ );
+ assert.ok(
+ exists(".discourse-local-dates-create-modal.modal-body"),
+ "Insert date-time modal visible"
+ );
+ assert.ok(
+ !exists(
+ ".discourse-local-dates-create-modal.modal-body .advanced-options"
+ ),
+ "Advanced mode not visible"
+ );
+ await click(".modal-footer button.advanced-mode-btn");
+ assert.ok(
+ exists(
+ ".discourse-local-dates-create-modal.modal-body .advanced-options"
+ ),
+ "Advanced mode is visible"
+ );
+ await click(".modal-footer button.btn-primary");
+ assert.ok(
+ exists(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper span.discourse-local-date"
+ ),
+ "Date inserted"
+ );
+
+ await click(".field .link-list button");
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await fillIn(
+ ".wizard-custom-field textarea[name='description']",
+ "First step field description"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ await fillIn(
+ ".wizard-custom-field textarea[name='description']",
+ "First step field description"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 3,
+ "Field subscription features are not accesible"
+ );
+ await click(".action .link-list button");
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 7,
+ "disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 4,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("open_composer");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 8,
+ "Display all settings of open composer"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("update_profile");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 4,
+ "Display all settings of update profile"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("route_to");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 4,
+ "Display all settings of route to"
+ );
+ await actionTypeDropdown.expand();
+ await click('[data-name="Select a type"]');
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 2,
+ "the settings options is empty when no action is selected"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ const fieldsContentIf = [4, 8];
+ for (let i = 0; i < fieldsContentIf.length; i++) {
+ await click(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) button`
+ );
+ let selectKitInsideThirdSetting = await selectKit(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .select-kit`
+ );
+ await selectKitInsideThirdSetting.expand();
+ await selectKitInsideThirdSetting.selectRowByIndex(1);
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .key input`,
+ "Action title"
+ );
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .value input`,
+ "Some value"
+ );
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .output input`,
+ "Result text"
+ );
+ const actualTitle = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .key input`
+ ).value;
+ const actualValue = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .value input`
+ ).value;
+ const actualResultText = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .output input`
+ ).value;
+
+ assert.strictEqual(actualTitle, "Action title", "Title is correct");
+ assert.strictEqual(actualValue, "Some value", "Value is correct");
+ assert.strictEqual(actualResultText, "Result text", "Text is correct");
+ }
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ await click(".admin-wizard-buttons button");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "Wizard saved successfully"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+ test("viewing content for a selected wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard, or create a new one"
+ ),
+ "it displays wizard message"
+ );
+ const wizards = selectKit(".select-kit");
+ await wizards.expand();
+
+ await wizards.selectRowByValue("unique_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes("You're editing a wizard"),
+ "it displays wizard message for a selected wizard"
+ );
+ assert.equal(
+ query(".admin-wizard-container .wizard-header input").value,
+ getUniqueWizard.name,
+ "The wizard name is correctly displayed"
+ );
+ // Save wizard Submissions
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(1) input").checked,
+ getUniqueWizard.save_submissions,
+ "The save submissions flag is correctly set"
+ );
+
+ // Multiple Submissions
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(2) input").checked,
+ getUniqueWizard.multiple_submissions,
+ "The multiple submissions flag is correctly set"
+ );
+
+ // After Signup
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(3) input").checked,
+ getUniqueWizard.after_signup,
+ "The after signup flag is correctly set"
+ );
+
+ // Prompt Completion
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(4) input").checked,
+ getUniqueWizard.prompt_completion,
+ "The prompt completion flag is correctly set"
+ );
+ // step content
+ for (let i = 0; i < getUniqueWizard.steps.length; i++) {
+ // click on the step that is needed
+ await click(
+ `.wizard-links.step .link-list div:nth-of-type(${
+ i + 1
+ }) button.btn-text`
+ );
+ assert.equal(
+ query(".wizard-custom-step input[name='title']").value,
+ getUniqueWizard.steps[i].title,
+ "Step title is correct"
+ );
+ assert.equal(
+ query(".wizard-custom-step .wizard-text-editor textarea").value,
+ getUniqueWizard.steps[i].description,
+ "Step description is correct"
+ );
+ // field content
+ for (let j = 0; j < getUniqueWizard.steps[i].fields.length; j++) {
+ await click(
+ `.wizard-links.field .link-list div:nth-of-type(${
+ j + 1
+ }) button.btn-text`
+ );
+ assert.equal(
+ query(".wizard-custom-field.visible .setting:nth-of-type(1) input")
+ .value,
+ getUniqueWizard.steps[i].fields[j].label,
+ "Field title is correct"
+ );
+ assert.equal(
+ query(".wizard-custom-field.visible .setting:nth-of-type(3) textarea")
+ .value,
+ getUniqueWizard.steps[i].fields[j].description,
+ "Field description is correct"
+ );
+ let selectTypeElement = document.querySelector(
+ `.admin-wizard-container .wizard-custom-field.visible .setting:nth-of-type(5) .select-kit`
+ );
+ let summaryElement = selectTypeElement.querySelector("summary");
+ assert.equal(
+ summaryElement.getAttribute("data-value"),
+ getUniqueWizard.steps[i].fields[j].type,
+ "The correct data-value is selected"
+ );
+ }
+ }
+ });
+});
diff --git a/test/javascripts/acceptance/field-test.js b/test/javascripts/acceptance/field-test.js
index 5eecce4f..f1d97130 100644
--- a/test/javascripts/acceptance/field-test.js
+++ b/test/javascripts/acceptance/field-test.js
@@ -54,6 +54,70 @@ acceptance("Field | Fields", function (needs) {
"Input in composer"
);
});
+ test("Composer - Hyperlink", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(
+ visible(".wizard-field.composer-field .wizard-field-composer textarea")
+ );
+ assert.ok(
+ exists(".wizard-field.composer-field .d-editor-button-bar button")
+ );
+ assert.ok(visible(".wizard-btn.toggle-preview"));
+ await fillIn(
+ ".wizard-field.composer-field .wizard-field-composer textarea",
+ "This is a link to "
+ );
+ assert.ok(
+ !exists(".insert-link.modal-body"),
+ "no hyperlink modal by default"
+ );
+ await click(
+ ".wizard-field.composer-field .wizard-field-composer .d-editor button.link"
+ );
+ assert.ok(exists(".insert-link.modal-body"), "hyperlink modal visible");
+
+ await fillIn(".modal-body .link-url", "google.com");
+ await fillIn(".modal-body .link-text", "Google");
+ await click(".modal-footer button.btn-primary");
+
+ assert.strictEqual(
+ query(".wizard-field.composer-field .wizard-field-composer textarea")
+ .value,
+ "This is a link to [Google](https://google.com)",
+ "adds link with url and text, prepends 'https://'"
+ );
+
+ assert.ok(
+ !exists(
+ ".wizard-field.composer-field .wizard-field-composer .insert-link.modal-body"
+ ),
+ "modal dismissed after submitting link"
+ );
+
+ await fillIn(
+ ".wizard-field.composer-field .wizard-field-composer textarea",
+ "Reset textarea contents."
+ );
+
+ await click(
+ ".wizard-field.composer-field .wizard-field-composer .d-editor button.link"
+ );
+ await fillIn(".modal-body .link-url", "google.com");
+ await fillIn(".modal-body .link-text", "Google");
+ await click(".modal-footer button.btn-danger");
+
+ assert.strictEqual(
+ query(".wizard-field.composer-field .wizard-field-composer textarea")
+ .value,
+ "Reset textarea contents.",
+ "does not insert anything after cancelling"
+ );
+
+ assert.ok(
+ !exists(".insert-link.modal-body"),
+ "modal dismissed after cancelling"
+ );
+ });
test("Text Only", async function (assert) {
await visit("/w/wizard");
diff --git a/test/javascripts/acceptance/wizard-test.js b/test/javascripts/acceptance/wizard-test.js
index 063c80fb..dd441649 100644
--- a/test/javascripts/acceptance/wizard-test.js
+++ b/test/javascripts/acceptance/wizard-test.js
@@ -9,9 +9,12 @@ import {
import {
wizard,
wizardCompleted,
+ wizardGuest,
wizardNoUser,
wizardNotPermitted,
} from "../helpers/wizard";
+import DiscourseURL from "discourse/lib/url";
+import sinon from "sinon";
acceptance("Wizard | Not logged in", function (needs) {
needs.pretender((server, helper) => {
@@ -53,6 +56,26 @@ acceptance("Wizard | Completed", function (needs) {
});
});
+acceptance("Wizard | Redirect", function (needs) {
+ needs.user({
+ redirect_to_wizard: "wizard",
+ });
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => {
+ return helper.response(wizard);
+ });
+ });
+
+ test("Redirect to pending Wizard", async function (assert) {
+ sinon.stub(DiscourseURL, "routeTo");
+ await visit("/latest");
+ assert.ok(
+ DiscourseURL.routeTo.calledWith("/w/wizard"),
+ "pending wizard routing works"
+ );
+ });
+});
+
acceptance("Wizard | Wizard", function (needs) {
needs.user();
needs.pretender((server, helper) => {
@@ -106,3 +129,59 @@ acceptance("Wizard | Wizard", function (needs) {
assert.strictEqual($("body.custom-wizard").length, 0);
});
});
+
+acceptance("Wizard | Guest access", function (needs) {
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizardGuest));
+ });
+
+ test("Does not require login", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(!exists(".wizard-no-access.requires-login"));
+ });
+
+ test("Starts", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(query(".wizard-column"), true);
+ });
+
+ test("Applies the wizard body class", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body.custom-wizard").length);
+ });
+
+ test("Applies the body background color", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body")[0].style.background);
+ });
+
+ test("Renders the wizard form", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-column-contents .wizard-step"), true);
+ assert.ok(exists(".wizard-footer img"), true);
+ });
+
+ test("Renders the first step", async function (assert) {
+ await visit("/w/wizard");
+ assert.strictEqual(
+ query(".wizard-step-title p").textContent.trim(),
+ "Text"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(count(".wizard-step-form .wizard-field"), 6);
+ assert.ok(exists(".wizard-step-footer .wizard-progress"), true);
+ assert.ok(exists(".wizard-step-footer .wizard-buttons"), true);
+ });
+
+ test("Removes the wizard body class when navigating away", async function (assert) {
+ await visit("/");
+ assert.strictEqual($("body.custom-wizard").length, 0);
+ });
+});
diff --git a/test/javascripts/fixtures/wizard.js.es6 b/test/javascripts/fixtures/wizard.js.es6
index 73fe45c1..a3b83063 100644
--- a/test/javascripts/fixtures/wizard.js.es6
+++ b/test/javascripts/fixtures/wizard.js.es6
@@ -6,7 +6,7 @@ export default {
submission_last_updated_at: "2022-03-15T21:11:01+01:00",
theme_id: 2,
required: false,
- permitted: true,
+ permitted: false,
uncategorized_category_id: 1,
categories: [],
subscribed: false,
diff --git a/test/javascripts/helpers/admin-wizard.js b/test/javascripts/helpers/admin-wizard.js
new file mode 100644
index 00000000..6c5dd84c
--- /dev/null
+++ b/test/javascripts/helpers/admin-wizard.js
@@ -0,0 +1,934 @@
+const getWizard = {
+ wizard_list: [
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ { id: "another_wizard", name: "another wizard" },
+ { id: "unique_wizard", name: "Unique wizard for testing" },
+ ],
+ field_types: {
+ text: {
+ min_length: null,
+ max_length: null,
+ prefill: null,
+ char_counter: null,
+ validations: null,
+ placeholder: null,
+ },
+ textarea: {
+ min_length: null,
+ max_length: null,
+ prefill: null,
+ char_counter: null,
+ placeholder: null,
+ },
+ composer: {
+ min_length: null,
+ max_length: null,
+ char_counter: null,
+ placeholder: null,
+ },
+ text_only: {},
+ composer_preview: { preview_template: null },
+ date: { format: "YYYY-MM-DD" },
+ time: { format: "HH:mm" },
+ date_time: { format: "" },
+ number: {},
+ checkbox: {},
+ url: { min_length: null },
+ upload: { file_types: ".jpg,.jpeg,.png" },
+ dropdown: { prefill: null, content: null },
+ tag: { limit: null, prefill: null, content: null, tag_groups: null },
+ category: { limit: 1, property: "id", prefill: null, content: null },
+ group: { prefill: null, content: null },
+ user_selector: {},
+ },
+ realtime_validations: {
+ similar_topics: {
+ types: ["text"],
+ component: "similar-topics-validator",
+ backend: true,
+ required_params: [],
+ },
+ },
+ custom_fields: [
+ {
+ id: "external",
+ klass: "category",
+ name: "require_topic_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "require_reply_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "num_auto_bump_daily",
+ type: "integer",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "has_chat_enabled",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "missing uploads",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "missing uploads ignored",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "notice",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "local_dates",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "has_polls",
+ type: "boolean",
+ serializers: null,
+ },
+ ],
+};
+const getUnsubscribedAdminWizards = {
+ subscribed: false,
+ subscription_type: "none",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+ subscription_client_installed: false,
+};
+const getCustomFields = {
+ custom_fields: [
+ {
+ id: "external",
+ klass: "category",
+ name: "require_topic_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "require_reply_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "num_auto_bump_daily",
+ type: "integer",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "has_chat_enabled",
+ type: "boolean",
+ serializers: null,
+ },
+ ],
+};
+const getWizardTestingLog = {
+ wizard: {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ },
+ logs: [
+ {
+ date: "2022-12-13T05:32:38.906-04:00",
+ action: "create_topic",
+ username: "christin",
+ message: "success: created topic - id: 119",
+ user: {
+ id: 55,
+ username: "christin",
+ name: "Sybil Ratke",
+ avatar_template: "",
+ },
+ },
+ {
+ date: "2022-12-12T09:41:57.888-04:00",
+ action: "create_topic",
+ username: "someuser",
+ message:
+ "error: invalid topic params - title: ; post: creating a text for this text area that is being displayed here.",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 2,
+};
+const getWizardSubmissions = {
+ wizard: {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ },
+ submissions: [
+ {
+ id: "1",
+ fields: {
+ step_1_field_1: {
+ value:
+ "creating a text for this text area that is being displayed here.",
+ type: "textarea",
+ label: "label field",
+ },
+ },
+ submitted_at: "2022-12-12T09:41:57-04:00",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 1,
+};
+const getAnotherWizardSubmission = {
+ wizard: { id: "another_wizard", name: "another wizard" },
+ submissions: [
+ {
+ id: "00925bcd58366d07fb698dc5",
+ fields: {
+ step_1_field_1: {
+ value: "More content here by user",
+ type: "text",
+ label: "Content to be inserted",
+ },
+ step_2_field_1: {
+ value: "body of the content created by the user",
+ type: "textarea",
+ label: "Step 2 content",
+ },
+ },
+ submitted_at: "2023-05-10T20:58:11-04:00",
+ user: {
+ id: 29,
+ username: "anotheruser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ {
+ id: "dc094efcd4873d6da4666c1a",
+ fields: {
+ step_1_field_1: {
+ value: "Title for the content being created",
+ type: "text",
+ label: "Content to be inserted",
+ },
+ step_2_field_1: {
+ value: "THis is the body of the content that will be created",
+ type: "textarea",
+ label: "Step 2 content",
+ },
+ },
+ submitted_at: "2023-05-10T20:56:14-04:00",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 2,
+};
+const getBusinessAdminWizard = {
+ subscribed: true,
+ subscription_type: "business",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+ subscription_client_installed: false,
+};
+const getStandardAdminWizard = {
+ subscribed: true,
+ subscription_type: "standard",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+ subscription_client_installed: false,
+};
+const getAdminTestingWizard = {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ save_submissions: true,
+ after_time: false,
+ after_time_scheduled: "2022-12-12T13:45:00.000Z",
+ prompt_completion: true,
+ steps: [
+ {
+ id: "step_1",
+ title: "step 1",
+ raw_description: "This is a description for step 1 sads",
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "label field",
+ description: "this is the label description",
+ type: "textarea",
+ placeholder: "insert a textarea text here.",
+ },
+ ],
+ description: "This is a description for step 1 sads",
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ skip_redirect: false,
+ post: "step_1_field_1",
+ post_builder: false,
+ title: [
+ {
+ type: "assignment",
+ output: "Testing title",
+ output_type: "text",
+ output_connector: "set",
+ pairs: [],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [30],
+ },
+ ],
+ },
+ ],
+};
+const getCreatedWizard = {
+ id: "new_wizard_for_testing",
+ name: "New wizard for testing",
+ save_submissions: true,
+ multiple_submissions: false,
+ after_signup: false,
+ prompt_completion: false,
+ steps: [
+ {
+ id: "step_1",
+ title: "step title",
+ raw_description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "field title",
+ description: "First step field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ post_builder: false,
+ post_template: "Wizard Fields w{step_1_field_1}",
+ title: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [10],
+ },
+ ],
+ tags: [
+ {
+ type: "assignment",
+ output_type: "tag",
+ output_connector: "set",
+ pairs: [],
+ output: ["gazelle"],
+ },
+ ],
+ visible: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+const getUniqueWizard = {
+ id: "unique_wizard",
+ name: "Unique wizard for testing",
+ save_submissions: true,
+ multiple_submissions: false,
+ after_signup: false,
+ prompt_completion: false,
+ steps: [
+ {
+ id: "step_1",
+ title: "step title",
+ raw_description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "field title",
+ description: "First step field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ },
+ {
+ id: "step_2",
+ title: "step title two",
+ raw_description: "Input in step description composer",
+ fields: [
+ {
+ id: "step_2_field_1",
+ label: "step 2 field title",
+ description: "First step field description",
+ type: "textarea",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ {
+ id: "step_2_field_2",
+ label: "step 2 field two title",
+ description: "Second Step field two field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert more text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description: "Input in step description composer",
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ post_builder: false,
+ post_template: "Wizard Fields w{step_1_field_1}",
+ title: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [10],
+ },
+ ],
+ tags: [
+ {
+ type: "assignment",
+ output_type: "tag",
+ output_connector: "set",
+ pairs: [],
+ output: ["gazelle"],
+ },
+ ],
+ visible: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+const getNewApi = {
+ name: "new_api",
+ title: "new API",
+ authorization: {
+ auth_type: "basic",
+ auth_url: null,
+ token_url: null,
+ client_id: null,
+ client_secret: null,
+ authorized: null,
+ auth_params: [],
+ access_token: null,
+ refresh_token: null,
+ token_expires_at: null,
+ token_refresh_at: null,
+ code: null,
+ username: "some_username",
+ password: "some_password",
+ },
+ endpoints: [
+ {
+ id: "8371de",
+ name: "endpoint_name",
+ method: "POST",
+ url: "https://test.api.com",
+ content_type: "application/json",
+ success_codes: [200, 100],
+ },
+ ],
+ log: [],
+};
+const putNewApi = {
+ success: "OK",
+ api: {
+ name: "new_api",
+ title: "new API",
+ authorization: {
+ auth_type: "basic",
+ auth_url: null,
+ token_url: null,
+ client_id: null,
+ client_secret: null,
+ authorized: null,
+ auth_params: [],
+ access_token: null,
+ refresh_token: null,
+ token_expires_at: null,
+ token_refresh_at: null,
+ code: null,
+ username: "some_username",
+ password: "some_password",
+ },
+ endpoints: [
+ {
+ id: "8371de",
+ name: "endpoint_name",
+ method: "POST",
+ url: "https://test.api.com",
+ content_type: "application/json",
+ success_codes: [200, 100],
+ },
+ ],
+ log: [],
+ },
+};
+export {
+ getWizard,
+ getUnsubscribedAdminWizards,
+ getCustomFields,
+ getWizardTestingLog,
+ getWizardSubmissions,
+ getBusinessAdminWizard,
+ getStandardAdminWizard,
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getNewApi,
+ putNewApi,
+ getAnotherWizardSubmission,
+ getUniqueWizard,
+};
diff --git a/test/javascripts/helpers/wizard.js b/test/javascripts/helpers/wizard.js
index 700cedc7..e02e2e99 100644
--- a/test/javascripts/helpers/wizard.js
+++ b/test/javascripts/helpers/wizard.js
@@ -6,8 +6,11 @@ import updateJson from "../fixtures/update";
import { cloneJSON } from "discourse-common/lib/object";
const wizardNoUser = cloneJSON(wizardJson);
+const wizardGuest = cloneJSON(wizardJson);
+wizardGuest.permitted = true;
const wizard = cloneJSON(wizardJson);
wizard.user = cloneJSON(userJson);
+wizard.permitted = true;
const wizardNotPermitted = cloneJSON(wizard);
wizardNotPermitted.permitted = false;
@@ -40,6 +43,7 @@ export {
wizardNoUser,
wizardNotPermitted,
wizardCompleted,
+ wizardGuest,
stepNotPermitted,
allFieldsWizard,
wizard,
diff --git a/yarn.lock b/yarn.lock
index b9d7fc0e..51d8803b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,101 +2,292 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
- integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
- dependencies:
- "@babel/highlight" "^7.16.7"
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
-"@babel/generator@^7.17.9":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc"
- integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
dependencies:
- "@babel/types" "^7.17.0"
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
+ integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
+ dependencies:
+ "@babel/highlight" "^7.22.5"
+
+"@babel/compat-data@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544"
+ integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==
+
+"@babel/core@^7.22.5":
+ version "7.22.8"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785"
+ integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.7"
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helpers" "^7.22.6"
+ "@babel/parser" "^7.22.7"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.8"
+ "@babel/types" "^7.22.5"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.2"
+
+"@babel/eslint-parser@^7.22.5":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz#d2807fbd1fa4376162716da63dfd3c69a2249fed"
+ integrity sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg==
+ dependencies:
+ "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ eslint-visitor-keys "^2.1.0"
+
+"@babel/generator@^7.22.7":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5"
+ integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==
+ dependencies:
+ "@babel/types" "^7.22.5"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
- source-map "^0.5.0"
-"@babel/helper-environment-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
- integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+"@babel/helper-annotate-as-pure@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+ integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/types" "^7.22.5"
-"@babel/helper-function-name@^7.17.9":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
- integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+"@babel/helper-compilation-targets@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52"
+ integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==
dependencies:
- "@babel/template" "^7.16.7"
- "@babel/types" "^7.17.0"
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-validator-option" "^7.22.5"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ browserslist "^4.21.9"
+ lru-cache "^5.1.1"
-"@babel/helper-hoist-variables@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
- integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+"@babel/helper-create-class-features-plugin@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950"
+ integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.5"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
-"@babel/helper-split-export-declaration@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
- integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+"@babel/helper-environment-visitor@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
+ integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
+
+"@babel/helper-function-name@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be"
+ integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/template" "^7.22.5"
+ "@babel/types" "^7.22.5"
-"@babel/helper-validator-identifier@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
- integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
-
-"@babel/highlight@^7.16.7":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
- integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2"
+ integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-imports@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
+ integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-transforms@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
+ integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-module-imports" "^7.22.5"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
+ integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-replace-supers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc"
+ integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.5"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
+ integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
+"@babel/helper-validator-identifier@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
+ integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
+
+"@babel/helper-validator-option@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
+ integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
+
+"@babel/helpers@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd"
+ integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==
+ dependencies:
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.6"
+ "@babel/types" "^7.22.5"
+
+"@babel/highlight@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
+ integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.5"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.16.7", "@babel/parser@^7.17.9", "@babel/parser@^7.7.0":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
- integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
+"@babel/parser@^7.22.5", "@babel/parser@^7.22.7":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
+ integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
-"@babel/template@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
- integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+"@babel/plugin-proposal-decorators@^7.22.5":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7"
+ integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==
dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/parser" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/plugin-syntax-decorators" "^7.22.5"
-"@babel/traverse@^7.7.0":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d"
- integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==
+"@babel/plugin-syntax-decorators@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a"
+ integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==
dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.9"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.17.9"
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.17.9"
- "@babel/types" "^7.17.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/runtime@^7.21.0":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438"
+ integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
+"@babel/template@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
+ integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/parser" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
+ version "7.22.8"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e"
+ integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.7"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.22.7"
+ "@babel/types" "^7.22.5"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.7.0":
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
- integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+"@babel/types@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
+ integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
to-fast-properties "^2.0.0"
"@ember-data/rfc395-data@^0.0.4":
@@ -104,67 +295,180 @@
resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843"
integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0":
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
+ integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
+
+"@eslint/eslintrc@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d"
+ integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.44.0":
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af"
+ integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==
+
"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7":
version "0.1.7"
resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07"
integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc=
-"@glimmer/global-context@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.65.4.tgz#1da1d59dd4260ce912c40e474cd39c2e82de51b8"
- integrity sha512-RSYCPG/uVR5XCDcPREBclncU7R0zkjACbADP+n3FWAH1TfWbXRMDIkvO/ZlwHkjHoCZf6tIM6p5S/MoFzfJEJA==
+"@glimmer/global-context@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.84.3.tgz#f8bf2cda9562716f2ddf3f96837e7559600635c4"
+ integrity sha512-8Oy9Wg5IZxMEeAnVmzD2NkObf89BeHoFSzJgJROE/deutd3rxg83mvlOez4zBBGYwnTb+VGU2LYRpet92egJjA==
dependencies:
"@glimmer/env" "^0.1.7"
-"@glimmer/interfaces@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.65.4.tgz#d298cc2b12b8ebcf269f39246ca7ab92816f6680"
- integrity sha512-R0kby79tGNKZOojVJa/7y0JH9Eq4SV+L1s6GcZy30QUZ1g1AAGS5XwCIXc9Sc09coGcv//q+6NLeSw7nlx1y4A==
+"@glimmer/interfaces@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.84.3.tgz#629777a4abe373b0785656f6c8d08989f5784805"
+ integrity sha512-dk32ykoNojt0mvEaIW6Vli5MGTbQo58uy3Epj7ahCgTHmWOKuw/0G83f2UmFprRwFx689YTXG38I/vbpltEjzg==
dependencies:
"@simple-dom/interface" "^1.4.0"
-"@glimmer/reference@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.65.4.tgz#bbc8becd6a1bf01fc189b6489e27446437194711"
- integrity sha512-yuRVE4qyqrlCndDMrHKDWUbDmGDCjPzsFtlTmxxnhDMJAdQsnr2cRLITHvQRDm1tXfigVvyKnomeuYhRRbBqYQ==
+"@glimmer/reference@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.84.3.tgz#6420ad9c102633ac83939fd1b2457269d21fb632"
+ integrity sha512-lV+p/aWPVC8vUjmlvYVU7WQJsLh319SdXuAWoX/SE3pq340BJlAJiEcAc6q52y9JNhT57gMwtjMX96W5Xcx/qw==
dependencies:
"@glimmer/env" "^0.1.7"
- "@glimmer/global-context" "0.65.4"
- "@glimmer/interfaces" "0.65.4"
- "@glimmer/util" "0.65.4"
- "@glimmer/validator" "0.65.4"
+ "@glimmer/global-context" "0.84.3"
+ "@glimmer/interfaces" "0.84.3"
+ "@glimmer/util" "0.84.3"
+ "@glimmer/validator" "0.84.3"
-"@glimmer/syntax@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.65.4.tgz#49164de5dc9e8b67084ec009bdd865e379d8a971"
- integrity sha512-y+/C3e8w96efk3a/Z5If9o4ztKJwrr8RtDpbhV2J8X+DUsn5ic2N3IIdlThbt/Zn6tkP1K3dY6uaFUx3pGTvVQ==
+"@glimmer/syntax@^0.84.2", "@glimmer/syntax@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.84.3.tgz#4045a1708cef7fd810cff42fe6deeba40c7286d0"
+ integrity sha512-ioVbTic6ZisLxqTgRBL2PCjYZTFIwobifCustrozRU2xGDiYvVIL0vt25h2c1ioDsX59UgVlDkIK4YTAQQSd2A==
dependencies:
- "@glimmer/interfaces" "0.65.4"
- "@glimmer/util" "0.65.4"
- "@handlebars/parser" "^1.1.0"
- simple-html-tokenizer "^0.5.10"
+ "@glimmer/interfaces" "0.84.3"
+ "@glimmer/util" "0.84.3"
+ "@handlebars/parser" "~2.0.0"
+ simple-html-tokenizer "^0.5.11"
-"@glimmer/util@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.4.tgz#e464145078f3f40da9013ff2590a6016515455d2"
- integrity sha512-aofe+rdBhkREKP2GZta6jy1UcbRRMfWx7M18zxGxspPoeD08NscD04Kx+WiOKXmC1TcrfITr8jvqMfrKrMzYWQ==
+"@glimmer/util@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.84.3.tgz#9ae0166982c0b48aa94b02d6ba8c2c81976ade4b"
+ integrity sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw==
dependencies:
"@glimmer/env" "0.1.7"
- "@glimmer/interfaces" "0.65.4"
+ "@glimmer/interfaces" "0.84.3"
"@simple-dom/interface" "^1.4.0"
-"@glimmer/validator@0.65.4", "@glimmer/validator@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.4.tgz#12c27a9a63706c60e6499fd687940e9d1affb32c"
- integrity sha512-0YUjAyo45DF5JkQxdv5kHn96nMNhvZiEwsAD4Jme0kk5Q9MQcPOUtN76pQAS4f+C6GdF9DeUr2yGXZLFMmb+LA==
+"@glimmer/validator@0.84.3", "@glimmer/validator@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.84.3.tgz#cd83b7f9ab78953f23cc11a32d83d7f729c54df2"
+ integrity sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ==
dependencies:
"@glimmer/env" "^0.1.7"
- "@glimmer/global-context" "0.65.4"
+ "@glimmer/global-context" "0.84.3"
-"@handlebars/parser@^1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf"
- integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A==
+"@handlebars/parser@~2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5"
+ integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==
+
+"@humanwhocodes/config-array@^0.11.10":
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2"
+ integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@1.4.14":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
+ integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
+ dependencies:
+ "@jridgewell/resolve-uri" "3.1.0"
+ "@jridgewell/sourcemap-codec" "1.4.14"
+
+"@lint-todo/utils@^13.0.3":
+ version "13.1.0"
+ resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.1.0.tgz#bb99b479e357f20fbf5fa200c59cafda2a02f849"
+ integrity sha512-uzcZPIPH7hcs+hKMiHfp58MosJpI9sTTgl1pGYau4zq34q1ppswJ6nLeohv/cDhqEBrHjtvldt8zDnVJXRvBlA==
+ dependencies:
+ "@types/eslint" "^7.2.13"
+ find-up "^5.0.0"
+ fs-extra "^9.1.0"
+ proper-lockfile "^4.1.2"
+ slash "^3.0.0"
+ tslib "^2.4.0"
+ upath "^2.0.1"
+
+"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
+ version "5.1.1-v1"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
+ integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==
+ dependencies:
+ eslint-scope "5.1.1"
+
+"@nicolo-ribaudo/semver-v6@^6.3.3":
+ version "6.3.3"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29"
+ integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -179,7 +483,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-"@nodelib/fs.walk@^1.2.3":
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -192,17 +496,45 @@
resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f"
integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==
-acorn-jsx@^5.2.0:
+"@types/eslint@^7.2.13":
+ version "7.29.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78"
+ integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
+ integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
+
+"@types/json-schema@*":
+ version "7.0.12"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+
+"@types/minimatch@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
+"@types/symlink-or-copy@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a"
+ integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg==
+
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^7.1.1:
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
- integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+acorn@^8.9.0:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
-ajv@^6.10.0, ajv@^6.10.2:
+ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -212,24 +544,12 @@ ajv@^6.10.0, ajv@^6.10.2:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ansi-escapes@^4.2.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
- integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
- dependencies:
- type-fest "^0.21.3"
-
-ansi-regex@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
- integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
-
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
@@ -243,24 +563,50 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-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==
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+aria-query@^5.0.2:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
+ integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
dependencies:
- sprintf-js "~1.0.2"
+ dequal "^2.0.3"
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+ integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+async-disk-cache@^1.2.1:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.5.tgz#cc6206ed79bb6982b878fc52e0505e4f52b62a02"
+ integrity sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==
+ dependencies:
+ debug "^2.1.3"
+ heimdalljs "^0.2.3"
+ istextorbinary "2.1.0"
+ mkdirp "^0.5.0"
+ rimraf "^2.5.3"
+ rsvp "^3.0.18"
+ username-sync "^1.0.2"
-async-promise-queue@^1.0.5:
+async-promise-queue@^1.0.3, async-promise-queue@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d"
integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw==
@@ -275,17 +621,20 @@ async@^2.4.1:
dependencies:
lodash "^4.17.14"
-babel-eslint@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
- integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
- eslint-visitor-keys "^1.0.0"
- resolve "^1.12.0"
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+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"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+babel-import-util@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23"
+ integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag==
balanced-match@^1.0.0:
version "1.0.2"
@@ -297,6 +646,11 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+"binaryextensions@1 || 2":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22"
+ integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==
+
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -306,6 +660,11 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
+blank-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9"
+ integrity sha512-kXQ19Xhoghiyw66CUiGypnuRpWlbHAzY/+NyvqTEdTfhfQGH1/dbEMYiXju7fYKIFePpzp/y9dsu5Cu/PkmawQ==
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -321,6 +680,123 @@ braces@^3.0.2:
dependencies:
fill-range "^7.0.1"
+broccoli-debug@^0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78"
+ integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==
+ dependencies:
+ broccoli-plugin "^1.2.1"
+ fs-tree-diff "^0.5.2"
+ heimdalljs "^0.2.1"
+ heimdalljs-logger "^0.1.7"
+ symlink-or-copy "^1.1.8"
+ tree-sync "^1.2.2"
+
+broccoli-funnel@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75"
+ integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==
+ dependencies:
+ array-equal "^1.0.0"
+ blank-object "^1.0.1"
+ broccoli-plugin "^1.3.0"
+ debug "^2.2.0"
+ fast-ordered-set "^1.0.0"
+ fs-tree-diff "^0.5.3"
+ heimdalljs "^0.2.0"
+ minimatch "^3.0.0"
+ mkdirp "^0.5.0"
+ path-posix "^1.0.0"
+ rimraf "^2.4.3"
+ symlink-or-copy "^1.0.0"
+ walk-sync "^0.3.1"
+
+broccoli-kitchen-sink-helpers@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06"
+ integrity sha512-gqYnKSJxBSjj/uJqeuRAzYVbmjWhG0mOZ8jrp6+fnUIOgLN6MvI7XxBECDHkYMIFPJ8Smf4xaI066Q2FqQDnXg==
+ dependencies:
+ glob "^5.0.10"
+ mkdirp "^0.5.1"
+
+broccoli-merge-trees@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d"
+ integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==
+ dependencies:
+ broccoli-plugin "^1.3.0"
+ merge-trees "^2.0.0"
+
+broccoli-persistent-filter@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72"
+ integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g==
+ dependencies:
+ async-disk-cache "^1.2.1"
+ async-promise-queue "^1.0.3"
+ broccoli-plugin "^1.0.0"
+ fs-tree-diff "^2.0.0"
+ hash-for-dep "^1.5.0"
+ heimdalljs "^0.2.1"
+ heimdalljs-logger "^0.1.7"
+ mkdirp "^0.5.1"
+ promise-map-series "^0.2.1"
+ rimraf "^2.6.1"
+ rsvp "^4.7.0"
+ symlink-or-copy "^1.0.1"
+ sync-disk-cache "^1.3.3"
+ walk-sync "^1.0.0"
+
+broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd"
+ integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ==
+ dependencies:
+ promise-map-series "^0.2.1"
+ quick-temp "^0.1.3"
+ rimraf "^2.3.4"
+ symlink-or-copy "^1.1.8"
+
+broccoli-plugin@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334"
+ integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw==
+ dependencies:
+ promise-map-series "^0.2.1"
+ quick-temp "^0.1.3"
+ rimraf "^2.3.4"
+ symlink-or-copy "^1.1.8"
+
+broccoli-stew@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95"
+ integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg==
+ dependencies:
+ broccoli-debug "^0.6.5"
+ broccoli-funnel "^2.0.0"
+ broccoli-merge-trees "^3.0.1"
+ broccoli-persistent-filter "^2.3.0"
+ broccoli-plugin "^2.1.0"
+ chalk "^2.4.1"
+ debug "^4.1.1"
+ ensure-posix-path "^1.0.1"
+ fs-extra "^8.0.1"
+ minimatch "^3.0.4"
+ resolve "^1.11.1"
+ rsvp "^4.8.5"
+ symlink-or-copy "^1.2.0"
+ walk-sync "^1.1.3"
+
+browserslist@^4.21.9:
+ version "4.21.9"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
+ integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
+ dependencies:
+ caniuse-lite "^1.0.30001503"
+ electron-to-chromium "^1.4.431"
+ node-releases "^2.0.12"
+ update-browserslist-db "^1.0.11"
+
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
@@ -329,12 +805,32 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-chalk@^2.0.0, chalk@^2.1.0:
+can-symlink@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219"
+ integrity sha512-RbsNrFyhwkx+6psk/0fK/Q9orOUr9VMxohGd8vTa4djf4TGLfblBgUfqZChrZuW0Q+mz2eBPFLusw9Jfukzmhg==
+ dependencies:
+ tmp "0.0.28"
+
+caniuse-lite@^1.0.30001503:
+ version "1.0.30001514"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309"
+ integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==
+
+chalk@^2.0.0, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -351,10 +847,20 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chardet@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
- integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+chalk@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
+ integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
+
+ci-info@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
+ integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+
+clean-up-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5"
+ integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw==
cli-cursor@^3.1.0:
version "3.1.0"
@@ -368,18 +874,13 @@ cli-spinners@^2.5.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
-cli-width@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
- integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
-
-cliui@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
- integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
- strip-ansi "^6.0.0"
+ strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
clone@^1.0.2:
@@ -416,42 +917,60 @@ colors@^1.4.0:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-commander@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
- integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+commander@^8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
- dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
+convert-source-map@^1.7.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-debug@^2.6.8:
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-tree@^2.0.4:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20"
+ integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==
+ dependencies:
+ mdn-data "2.0.30"
+ source-map-js "^1.0.1"
+
+date-fns@^2.30.0:
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+debug@^2.1.3, debug@^2.2.0, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
-debug@^4.0.1, debug@^4.1.0:
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
-deep-is@~0.1.3:
+deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
@@ -463,6 +982,19 @@ defaults@^1.0.3:
dependencies:
clone "^1.0.2"
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
+ integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+dequal@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -477,60 +1009,172 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-ember-rfc176-data@^0.3.11:
- version "0.3.17"
- resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a"
- integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw==
-
-ember-template-lint-plugin-discourse@latest:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ember-template-lint-plugin-discourse/-/ember-template-lint-plugin-discourse-2.0.0.tgz#9805dff60763fae68b5df82b92fb431eb739c13e"
- integrity sha512-2bPz/47OfuYGj4w2RNyDcXCYA/4JtRAXRIsaA6PTm4Uc44exK/GBd4RfT2ywmq0CImvj2kGkqpuUgkAtVf6aZQ==
-
-ember-template-lint@^2.11.0:
- version "2.21.0"
- resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b"
- integrity sha512-19QbEqJQdMfcRS7PsQsubflRowEtnkbD0tpYR4q/xq4lodmhU7hhOFvlTQgbxD/jwW5Ur+tkOwH4KFy9JwOyXA==
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
dependencies:
- chalk "^4.0.0"
- ember-template-recast "^5.0.1"
- find-up "^5.0.0"
- fuse.js "^6.4.6"
- get-stdin "^8.0.0"
- globby "^11.0.2"
- is-glob "^4.0.1"
- micromatch "^4.0.2"
- resolve "^1.20.0"
- v8-compile-cache "^2.2.0"
- yargs "^16.2.0"
+ no-case "^3.0.4"
+ tslib "^2.0.3"
-ember-template-recast@^5.0.1:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-5.0.3.tgz#79df27a70bdce7be17f14db13886afde1e9d02d6"
- integrity sha512-qsJYQhf29Dk6QMfviXhUPE+byMOs6iRQxUDHgkj8yqjeppvjHaFG96hZi/NAXJTm/M7o3PpfF5YlmeaKtI9UeQ==
+editions@^1.1.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
+ integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==
+
+electron-to-chromium@^1.4.431:
+ version "1.4.454"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz#774dc7cb5e58576d0125939ec34a4182f3ccc87d"
+ integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==
+
+ember-cli-babel-plugin-helpers@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879"
+ integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw==
+
+ember-cli-version-checker@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0"
+ integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q==
dependencies:
- "@glimmer/reference" "^0.65.0"
- "@glimmer/syntax" "^0.65.0"
- "@glimmer/validator" "^0.65.0"
+ resolve-package-path "^3.1.0"
+ semver "^7.3.4"
+ silent-error "^1.1.1"
+
+ember-rfc176-data@^0.3.15:
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.18.tgz#bb6fdcef49999981317ea81b6cc9210fb4108d65"
+ integrity sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==
+
+ember-template-imports@^3.4.1, ember-template-imports@^3.4.2:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/ember-template-imports/-/ember-template-imports-3.4.2.tgz#6cf7de7d4b8348a0fddf3aaec4947aa1211289e6"
+ integrity sha512-OS8TUVG2kQYYwP3netunLVfeijPoOKIs1SvPQRTNOQX4Pu8xGGBEZmrv0U1YTnQn12Eg+p6w/0UdGbUnITjyzw==
+ dependencies:
+ babel-import-util "^0.2.0"
+ broccoli-stew "^3.0.0"
+ ember-cli-babel-plugin-helpers "^1.1.1"
+ ember-cli-version-checker "^5.1.2"
+ line-column "^1.0.2"
+ magic-string "^0.25.7"
+ parse-static-imports "^1.1.0"
+ string.prototype.matchall "^4.0.6"
+ validate-peer-dependencies "^1.1.0"
+
+ember-template-lint-plugin-discourse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ember-template-lint-plugin-discourse/-/ember-template-lint-plugin-discourse-3.0.0.tgz#9212226e4d2f6dce2e35b480aaf240067d736246"
+ integrity sha512-4zi/qN+vXs0ZpJZrwdMfZ5hMThJbeVCFdof6iek4PmgIJhnlA0lzqIa1BrKpSKhr3ckd5K0rUMNcCAm0uKNOtg==
+
+ember-template-lint@^5.10.3:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-5.11.0.tgz#539ed054a9040066fd2ad2a81ffb391e8b96ce71"
+ integrity sha512-uoVz4IAFRyg3JnMTL+SDtZkHPZM6O1qhvvgcb7LD6325W6asjPZGF1YHDyxnssEOnCSVsu1S5bk77tqE5NnyNg==
+ dependencies:
+ "@lint-todo/utils" "^13.0.3"
+ aria-query "^5.0.2"
+ chalk "^5.2.0"
+ ci-info "^3.8.0"
+ date-fns "^2.30.0"
+ ember-template-imports "^3.4.2"
+ ember-template-recast "^6.1.4"
+ eslint-formatter-kakoune "^1.0.0"
+ find-up "^6.3.0"
+ fuse.js "^6.5.3"
+ get-stdin "^9.0.0"
+ globby "^13.2.0"
+ is-glob "^4.0.3"
+ language-tags "^1.0.8"
+ micromatch "^4.0.5"
+ resolve "^1.22.3"
+ v8-compile-cache "^2.3.0"
+ yargs "^17.7.2"
+
+ember-template-recast@^6.1.4:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-6.1.4.tgz#e964c184adfd876878009f8aa0b84c95633fce20"
+ integrity sha512-fCh+rOK6z+/tsdkTbOE+e7f84P6ObnIRQrCCrnu21E4X05hPeradikIkRMhJdxn4NWrxitfZskQDd37TR/lsNQ==
+ dependencies:
+ "@glimmer/reference" "^0.84.3"
+ "@glimmer/syntax" "^0.84.3"
+ "@glimmer/validator" "^0.84.3"
async-promise-queue "^1.0.5"
colors "^1.4.0"
- commander "^6.2.1"
+ commander "^8.3.0"
globby "^11.0.3"
ora "^5.4.0"
slash "^3.0.0"
tmp "^0.2.1"
- workerpool "^6.1.4"
-
-emoji-regex@^7.0.1:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+ workerpool "^6.4.0"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce"
+ integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==
+
+es-abstract@^1.19.0, es-abstract@^1.20.4:
+ version "1.21.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
+ integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.2.0"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.10"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.7"
+ string.prototype.trimend "^1.0.6"
+ string.prototype.trimstart "^1.0.6"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.9"
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
+ integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ dependencies:
+ get-intrinsic "^1.1.3"
+ has "^1.0.3"
+ has-tostringtag "^1.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -541,20 +1185,34 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-eslint-config-discourse@^1.1.8:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-1.1.9.tgz#9a5ee6b3a4b986e5243f517e7945d1709c4e22df"
- integrity sha512-a4KG+/9/7ZhYVV0URGK70K7QtxlydYKjie0ZssHEGxl2auOUTDcdRMBfZQBtIxQr9X8TF0+eeUUsScBXNU6xZw==
+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==
+
+eslint-config-discourse@^3.4.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-3.5.0.tgz#528db8a5b64e5d0aa96d958a50f9d75456c91e4e"
+ integrity sha512-IwxNmfyomRKrMCP3dsgxEepKYv/QW5tcLi/NRv7hl06uRK5o+a8QvrFjFiC+KfYcNRQhTQA4So+YwXSrVpCk0A==
dependencies:
- babel-eslint "^10.1.0"
- ember-template-lint "^2.11.0"
- ember-template-lint-plugin-discourse latest
- eslint "^6.8.0"
+ "@babel/core" "^7.22.5"
+ "@babel/eslint-parser" "^7.22.5"
+ "@babel/plugin-proposal-decorators" "^7.22.5"
+ ember-template-imports "^3.4.1"
+ ember-template-lint "^5.10.3"
+ ember-template-lint-plugin-discourse "^3.0.0"
+ eslint "^8.43.0"
eslint-plugin-discourse-ember latest
- eslint-plugin-ember "^6.10.0"
+ eslint-plugin-ember "^11.8.0"
eslint-plugin-lodash "^7.1.0"
- eslint-plugin-node "^8.0.0"
- prettier "2.2.1"
+ eslint-plugin-node "^11.1.0"
+ eslint-plugin-sort-class-members "^1.18.0"
+ prettier "2.8.8"
+
+eslint-formatter-kakoune@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-formatter-kakoune/-/eslint-formatter-kakoune-1.0.0.tgz#a95cc4fe1fbc06b84e0f2397e83f5f0b68340125"
+ integrity sha512-Uk/TVLt6Nf6Xoz7C1iYuZjOSdJxe5aaauGRke8JhKeJwD66Y61/pY2FjtLP04Ooq9PwV34bzrkKkU2UZ5FtDRA==
eslint-plugin-discourse-ember@latest:
version "0.0.3"
@@ -563,22 +1221,32 @@ eslint-plugin-discourse-ember@latest:
dependencies:
requireindex "~1.1.0"
-eslint-plugin-ember@^6.10.0:
- version "6.10.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.10.1.tgz#ca7a5cc28b91a247c31b1686421a66281467f238"
- integrity sha512-RZI0+UoR4xeD6UE3KQCUwbN2nZOIIPaFCCXqBIRXDr0rFuwvknAHqYtDPJVZicvTzNHa4TEZvAKqfbE8t7SztQ==
+eslint-plugin-ember@^11.8.0:
+ version "11.10.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-11.10.0.tgz#46a696ebabcfefcf8212eb0eb2b11d61360c70fc"
+ integrity sha512-/5VanfpfzIdmWgXWyQ6ylAJWITu8mXivRce06h0uoifVpUoGaBdAkwuto/PLGfDxWdi43xWUFLb5Tpkhx2MoFg==
dependencies:
"@ember-data/rfc395-data" "^0.0.4"
- ember-rfc176-data "^0.3.11"
- snake-case "^2.1.0"
+ "@glimmer/syntax" "^0.84.2"
+ css-tree "^2.0.4"
+ ember-rfc176-data "^0.3.15"
+ ember-template-imports "^3.4.2"
+ ember-template-recast "^6.1.4"
+ eslint-utils "^3.0.0"
+ estraverse "^5.2.0"
+ lodash.camelcase "^4.1.1"
+ lodash.kebabcase "^4.1.1"
+ magic-string "^0.30.0"
+ requireindex "^1.2.0"
+ snake-case "^3.0.3"
-eslint-plugin-es@^1.3.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
- integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
+eslint-plugin-es@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
+ integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
dependencies:
- eslint-utils "^1.4.2"
- regexpp "^2.0.1"
+ eslint-utils "^2.0.0"
+ regexpp "^3.0.0"
eslint-plugin-lodash@^7.1.0:
version "7.4.0"
@@ -587,19 +1255,24 @@ eslint-plugin-lodash@^7.1.0:
dependencies:
lodash "^4.17.21"
-eslint-plugin-node@^8.0.0:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964"
- integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==
+eslint-plugin-node@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
+ integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
dependencies:
- eslint-plugin-es "^1.3.1"
- eslint-utils "^1.3.1"
- ignore "^5.0.2"
+ eslint-plugin-es "^3.0.0"
+ eslint-utils "^2.0.0"
+ ignore "^5.1.1"
minimatch "^3.0.4"
- resolve "^1.8.1"
- semver "^5.5.0"
+ resolve "^1.10.1"
+ semver "^6.1.0"
-eslint-scope@^5.0.0:
+eslint-plugin-sort-class-members@^1.18.0:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.18.0.tgz#561746eb30abc4e8bb8d582d359c652299e450d8"
+ integrity sha512-y4r5OC3LJNHJZCWfVwFnnRiNrQ/LRf7Pb1wD6/CP8Y4qmUvjtmkwrLvyY755p8SFTOOXVd33HgFuF3XxVW1xbg==
+
+eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -607,79 +1280,101 @@ eslint-scope@^5.0.0:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^1.3.1, eslint-utils@^1.4.2, eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+eslint-scope@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b"
+ integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint@^6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
+ integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
+
+eslint@^8.43.0:
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500"
+ integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==
dependencies:
- "@babel/code-frame" "^7.0.0"
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.4.0"
+ "@eslint/eslintrc" "^2.1.0"
+ "@eslint/js" "8.44.0"
+ "@humanwhocodes/config-array" "^0.11.10"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
- eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.0"
+ eslint-visitor-keys "^3.4.1"
+ espree "^9.6.0"
+ esquery "^1.4.2"
esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
- ignore "^4.0.6"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
- inquirer "^7.0.0"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
- optionator "^0.8.3"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-espree@^6.1.2:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
- integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+espree@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f"
+ integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==
dependencies:
- acorn "^7.1.1"
- acorn-jsx "^5.2.0"
- eslint-visitor-keys "^1.1.0"
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-esquery@^1.0.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
- integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
dependencies:
estraverse "^5.1.0"
@@ -705,16 +1400,7 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
- dependencies:
- chardet "^0.7.0"
- iconv-lite "^0.4.24"
- tmp "^0.0.33"
-
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@@ -730,15 +1416,33 @@ fast-glob@^3.2.9:
merge2 "^1.3.0"
micromatch "^4.0.4"
+fast-glob@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0"
+ integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-ordered-set@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb"
+ integrity sha512-MxBW4URybFszOx1YlACEoK52P6lE3xiFcPaGCUZ7QQOZ6uJXKo++Se8wa31SjcZ+NC/fdAWX7UtKEfaGgHS2Vg==
+ dependencies:
+ blank-object "^1.0.1"
fastq@^1.6.0:
version "1.13.0"
@@ -747,19 +1451,12 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-figures@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
- integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
- escape-string-regexp "^1.0.5"
-
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
+ flat-cache "^3.0.4"
fill-range@^7.0.1:
version "7.0.1"
@@ -776,19 +1473,84 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+find-up@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790"
+ integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==
dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
+ locate-path "^7.1.0"
+ path-exists "^5.0.0"
-flatted@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
- integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
+ integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+fs-extra@^8.0.1:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.6:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946"
+ integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw==
+ dependencies:
+ heimdalljs-logger "^0.1.7"
+ object-assign "^4.1.0"
+ path-posix "^1.0.0"
+ symlink-or-copy "^1.1.8"
+
+fs-tree-diff@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa"
+ integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==
+ dependencies:
+ "@types/symlink-or-copy" "^1.2.0"
+ heimdalljs-logger "^0.1.7"
+ object-assign "^4.1.0"
+ path-posix "^1.0.0"
+ symlink-or-copy "^1.1.8"
+
+fs-updater@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b"
+ integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg==
+ dependencies:
+ can-symlink "^1.0.0"
+ clean-up-path "^1.0.0"
+ heimdalljs "^0.2.5"
+ heimdalljs-logger "^0.1.9"
+ rimraf "^2.6.2"
fs.realpath@^1.0.0:
version "1.0.0"
@@ -800,33 +1562,84 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+function.prototype.name@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+ integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
-fuse.js@^6.4.6:
- version "6.5.3"
- resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.5.3.tgz#7446c0acbc4ab0ab36fa602e97499bdb69452b93"
- integrity sha512-sA5etGE7yD/pOqivZRBvUBd/NaL2sjAu6QuSaFoe1H2BrJSkH/T/UXAJ8CdXdw7DvY3Hs8CXKYkDWX7RiP5KOg==
+functions-have-names@^1.2.2, functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+fuse.js@^6.5.3:
+ version "6.6.2"
+ resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111"
+ integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-stdin@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
- integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
-glob-parent@^5.0.0, glob-parent@^5.1.2:
+get-stdin@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
+ integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^5.0.10:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
glob@^7.1.3:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -844,14 +1657,21 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+globals@^13.19.0:
+ version "13.20.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
+ integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
dependencies:
- type-fest "^0.8.1"
+ type-fest "^0.20.2"
-globby@^11.0.2, globby@^11.0.3:
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^11.0.3:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -863,6 +1683,39 @@ globby@^11.0.2, globby@^11.0.3:
merge2 "^1.4.1"
slash "^3.0.0"
+globby@^13.2.0:
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
+ dependencies:
+ dir-glob "^3.0.1"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
+ merge2 "^1.4.1"
+ slash "^4.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -873,6 +1726,30 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -880,29 +1757,49 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-iconv-lite@^0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+hash-for-dep@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3"
+ integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==
dependencies:
- safer-buffer ">= 2.1.2 < 3"
+ broccoli-kitchen-sink-helpers "^0.3.1"
+ heimdalljs "^0.2.3"
+ heimdalljs-logger "^0.1.7"
+ path-root "^0.1.1"
+ resolve "^1.10.0"
+ resolve-package-path "^1.0.11"
+
+heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7"
+ integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g==
+ dependencies:
+ debug "^2.2.0"
+ heimdalljs "^0.2.6"
+
+heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe"
+ integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA==
+ dependencies:
+ rsvp "~3.2.1"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+ignore@^5.1.1, ignore@^5.2.4:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
-ignore@^5.0.2, ignore@^5.2.0:
+ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
-import-fresh@^3.0.0:
+import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -928,48 +1825,69 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-inquirer@^7.0.0:
- version "7.3.3"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
- integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
+internal-slot@^1.0.3, internal-slot@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
+ integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
dependencies:
- ansi-escapes "^4.2.1"
- chalk "^4.1.0"
- cli-cursor "^3.1.0"
- cli-width "^3.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.19"
- mute-stream "0.0.8"
- run-async "^2.4.0"
- rxjs "^6.6.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
- through "^2.3.6"
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
-is-core-module@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
- integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.11.0, is-core-module@^2.12.0:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
+ integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
dependencies:
has "^1.0.3"
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-is-glob@^4.0.0, is-glob@^4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -981,33 +1899,117 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+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==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+istextorbinary@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874"
+ integrity sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A==
+ dependencies:
+ binaryextensions "1 || 2"
+ editions "^1.1.1"
+ textextensions "1 || 2"
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
+ argparse "^2.0.1"
jsesc@^2.5.1:
version "2.5.2"
@@ -1024,13 +2026,54 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+json5@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+language-subtag-registry@^0.3.20:
+ version "0.3.22"
+ resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
+ integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+
+language-tags@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.8.tgz#042b4bdb0d4e771a9f8cc2fdc9bb26a52a367312"
+ integrity sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==
+ dependencies:
+ language-subtag-registry "^0.3.20"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+line-column@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
+ integrity sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==
+ dependencies:
+ isarray "^1.0.0"
+ isobject "^2.0.0"
locate-path@^6.0.0:
version "6.0.0"
@@ -1039,7 +2082,29 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
-lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
+locate-path@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
+ integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
+ dependencies:
+ p-locate "^6.0.0"
+
+lodash.camelcase@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.kebabcase@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@^4.17.14, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1052,22 +2117,72 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
-lower-case@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
- integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
lru-cache@^7.4.0:
version "7.8.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.1.tgz#68ee3f4807a57d2ba185b7fd90827d5c21ce82bb"
integrity sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==
+magic-string@^0.25.7:
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
+ integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+magic-string@^0.30.0:
+ version "0.30.1"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d"
+ integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+matcher-collection@^1.0.0, matcher-collection@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838"
+ integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==
+ dependencies:
+ minimatch "^3.0.2"
+
+mdn-data@2.0.30:
+ version "2.0.30"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc"
+ integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==
+
+merge-trees@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161"
+ integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw==
+ dependencies:
+ fs-updater "^1.0.4"
+ heimdalljs "^0.2.5"
+
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micromatch@^4.0.2, micromatch@^4.0.4:
+micromatch@^4.0.4, micromatch@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -1080,7 +2195,7 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-minimatch@^3.0.4:
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -1092,13 +2207,18 @@ minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-mkdirp@^0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
dependencies:
minimist "^1.2.6"
+mktemp@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b"
+ integrity sha512-IXnMcJ6ZyTuhRmJSjzvHSRhlVPiN9Jwc6e59V0bEJ0ba6OBeX2L0E+mRN1QseeOF4mM+F1Rit6Nh7o+rl2Yn/A==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -1109,27 +2229,48 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-mute-stream@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-nice-try@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-
-no-case@^2.2.0:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
- integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
dependencies:
- lower-case "^1.1.1"
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-releases@^2.0.12:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.12.3, object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
once@^1.3.0:
version "1.4.0"
@@ -1145,17 +2286,17 @@ onetime@^5.1.0:
dependencies:
mimic-fn "^2.1.0"
-optionator@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
- integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.6"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- word-wrap "~1.2.3"
+ "@aashutoshrathi/word-wrap" "^1.2.3"
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
ora@^5.4.0:
version "5.4.1"
@@ -1172,10 +2313,10 @@ ora@^5.4.0:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
-os-tmpdir@~1.0.2:
+os-tmpdir@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
p-limit@^3.0.2:
version "3.1.0"
@@ -1184,6 +2325,13 @@ p-limit@^3.0.2:
dependencies:
yocto-queue "^0.1.0"
+p-limit@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644"
+ integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
@@ -1191,6 +2339,13 @@ p-locate@^5.0.0:
dependencies:
p-limit "^3.0.2"
+p-locate@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f"
+ integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==
+ dependencies:
+ p-limit "^4.0.0"
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -1198,50 +2353,93 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-static-imports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d"
+ integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA==
+
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+path-exists@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
+ integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-key@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+path-posix@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f"
+ integrity sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==
+
+path-root-regex@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+ integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==
+
+path-root@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+ integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==
+ dependencies:
+ path-root-regex "^0.1.0"
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prettier@2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
- integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
+prettier@2.8.8:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+promise-map-series@^0.2.1:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847"
+ integrity sha512-wx9Chrutvqu1N/NHzTayZjE1BgIwt6SJykQoCOic4IZ9yUDjKyVYrpLa/4YCNsV61eRENfs29hrEquVuB13Zlw==
+ dependencies:
+ rsvp "^3.0.14"
+
+proper-lockfile@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
+ integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ retry "^0.12.0"
+ signal-exit "^3.0.2"
punycode@^2.1.0:
version "2.1.1"
@@ -1253,6 +2451,15 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+quick-temp@^0.1.3, quick-temp@^0.1.5:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408"
+ integrity sha512-YsmIFfD9j2zaFwJkzI6eMG7y0lQP7YeWzgtFgNl38pGWZBSXJooZbOWwkcRot7Vt0Fg9L23pX0tqWU3VvLDsiA==
+ dependencies:
+ mktemp "~0.4.0"
+ rimraf "^2.5.4"
+ underscore.string "~3.3.4"
+
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -1262,16 +2469,35 @@ readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+regenerator-runtime@^0.13.11:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
+ integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ functions-have-names "^1.2.3"
+
+regexpp@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+requireindex@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
+ integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
+
requireindex@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
@@ -1282,12 +2508,37 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.12.0, resolve@^1.20.0, resolve@^1.8.1:
- version "1.22.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
- integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+resolve-package-path@^1.0.11:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e"
+ integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==
dependencies:
- is-core-module "^2.8.1"
+ path-root "^0.1.1"
+ resolve "^1.10.0"
+
+resolve-package-path@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-3.1.0.tgz#35faaa5d54a9c7dd481eb7c4b2a44410c9c763d8"
+ integrity sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA==
+ dependencies:
+ path-root "^0.1.1"
+ resolve "^1.17.0"
+
+resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.17.0:
+ version "1.22.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
+ integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
+ dependencies:
+ is-core-module "^2.11.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^1.22.3:
+ version "1.22.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283"
+ integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==
+ dependencies:
+ is-core-module "^2.12.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -1299,29 +2550,44 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
-rimraf@^3.0.0:
+rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
-run-async@^2.4.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
- integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+rsvp@^3.0.14, rsvp@^3.0.18:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
+ integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==
+
+rsvp@^4.7.0, rsvp@^4.8.5:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+ integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+
+rsvp@~3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a"
+ integrity sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg==
run-parallel@^1.1.9:
version "1.2.0"
@@ -1330,33 +2596,32 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-rxjs@^6.6.0:
- version "6.6.7"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
- integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
- dependencies:
- tslib "^1.9.0"
-
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-"safer-buffer@>= 2.1.2 < 3":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
-semver@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@^6.1.2:
+semver@^6.1.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^7.3.2, semver@^7.3.4:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
semver@^7.3.5:
version "7.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
@@ -1364,24 +2629,40 @@ semver@^7.3.5:
dependencies:
lru-cache "^7.4.0"
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
- shebang-regex "^1.0.0"
+ shebang-regex "^3.0.0"
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-simple-html-tokenizer@^0.5.10:
+silent-error@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662"
+ integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==
+ dependencies:
+ debug "^2.2.0"
+
+simple-html-tokenizer@^0.5.11:
version "0.5.11"
resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9"
integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==
@@ -1391,42 +2672,35 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
+
+snake-case@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
+ integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==
dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
-snake-case@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
- integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=
- dependencies:
- no-case "^2.2.0"
+source-map-js@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-source-map@^0.5.0:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+sprintf-js@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
-string-width@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
- integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
- dependencies:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-string-width@^4.1.0, string-width@^4.2.0:
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -1435,6 +2709,47 @@ string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string.prototype.matchall@^4.0.6:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
+ integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+
+string.prototype.trim@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
+ integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimend@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
+ integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimstart@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
+ integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -1442,13 +2757,6 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
-strip-ansi@^5.1.0, strip-ansi@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
- integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
- dependencies:
- ansi-regex "^4.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"
@@ -1456,7 +2764,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
-strip-json-comments@^3.0.1:
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -1480,32 +2788,38 @@ 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==
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe"
+ integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==
+
+sync-disk-cache@^1.3.3:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.4.tgz#53a2c5a09d8f4bb53160bce182a456ad71574024"
+ integrity sha512-GlkGeM81GPPEKz/lH7QUTbvqLq7K/IUTuaKDSMulP9XQ42glqNJIN/RKgSOw4y8vxL1gOVvj+W7ruEO4s36eCw==
dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
+ debug "^2.1.3"
+ heimdalljs "^0.2.3"
+ mkdirp "^0.5.0"
+ rimraf "^2.2.8"
+ username-sync "^1.0.2"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-through@^2.3.6:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+"textextensions@1 || 2":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4"
+ integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==
-tmp@^0.0.33:
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
- integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+tmp@0.0.28:
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
+ integrity sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==
dependencies:
- os-tmpdir "~1.0.2"
+ os-tmpdir "~1.0.1"
tmp@^0.2.1:
version "0.2.1"
@@ -1526,27 +2840,83 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-tslib@^1.9.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
- integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+tree-sync@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6"
+ integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ==
dependencies:
- prelude-ls "~1.1.2"
+ debug "^2.2.0"
+ fs-tree-diff "^0.5.6"
+ mkdirp "^0.5.1"
+ quick-temp "^0.1.5"
+ walk-sync "^0.3.3"
-type-fest@^0.21.3:
- version "0.21.3"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
- integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+tslib@^2.0.3, tslib@^2.4.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3"
+ integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==
-type-fest@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
- integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+underscore.string@~3.3.4:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.6.tgz#ad8cf23d7423cb3b53b898476117588f4e2f9159"
+ integrity sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==
+ dependencies:
+ sprintf-js "^1.1.1"
+ util-deprecate "^1.0.2"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+upath@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b"
+ integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
+
+update-browserslist-db@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
+ integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
uri-js@^4.2.2:
version "4.4.1"
@@ -1555,16 +2925,46 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-util-deprecate@^1.0.1:
+username-sync@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.3.tgz#ae41c5c8a4c8c2ecc1443a7d0742742bd7e36732"
+ integrity sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+validate-peer-dependencies@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036"
+ integrity sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA==
+ dependencies:
+ resolve-package-path "^3.1.0"
+ semver "^7.3.2"
+
+walk-sync@^0.3.1, walk-sync@^0.3.3:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4"
+ integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==
+ dependencies:
+ ensure-posix-path "^1.0.0"
+ matcher-collection "^1.0.0"
+
+walk-sync@^1.0.0, walk-sync@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d"
+ integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA==
+ dependencies:
+ "@types/minimatch" "^3.0.3"
+ ensure-posix-path "^1.1.0"
+ matcher-collection "^1.1.1"
+
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
@@ -1572,22 +2972,40 @@ wcwidth@^1.0.1:
dependencies:
defaults "^1.0.3"
-which@^1.2.9:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
-word-wrap@~1.2.3:
- version "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==
-
-workerpool@^6.1.4:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
- integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
+workerpool@^6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.4.0.tgz#f8d5cfb45fde32fa3b7af72ad617c3369567a462"
+ integrity sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A==
wrap-ansi@^7.0.0:
version "7.0.0"
@@ -1603,37 +3021,45 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
-yargs-parser@^20.2.2:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yargs@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
- integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
dependencies:
- cliui "^7.0.2"
+ cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
- string-width "^4.2.0"
+ string-width "^4.2.3"
y18n "^5.0.5"
- yargs-parser "^20.2.2"
+ yargs-parser "^21.1.1"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==