diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 36af219..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged diff --git a/charts/planka/Chart.yaml b/charts/planka/Chart.yaml index 5a6debe..45196fc 100644 --- a/charts/planka/Chart.yaml +++ b/charts/planka/Chart.yaml @@ -1,31 +1,31 @@ -apiVersion: v2 -name: planka -description: A Helm chart to deploy Planka and it's dependencies. - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.1.23 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "1.16.2" - -dependencies: - - alias: postgresql - condition: postgresql.enabled - name: postgresql - repository: &bitnami-repo https://charts.bitnami.com/bitnami - version: 12.5.1 +apiVersion: v2 +name: planka +description: A Helm chart to deploy Planka and it's dependencies. + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.23 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.2" + +dependencies: + - alias: postgresql + condition: postgresql.enabled + name: postgresql + repository: &bitnami-repo https://charts.bitnami.com/bitnami + version: 12.5.1 diff --git a/charts/planka/templates/deployment.yaml b/charts/planka/templates/deployment.yaml index 2d0d35b..b23e5fc 100644 --- a/charts/planka/templates/deployment.yaml +++ b/charts/planka/templates/deployment.yaml @@ -1,141 +1,141 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "planka.fullname" . }} - labels: - {{- include "planka.labels" . | nindent 4 }} -spec: - {{- if not .Values.autoscaling.enabled }} - replicas: {{ .Values.replicaCount }} - {{- end }} - selector: - matchLabels: - {{- include "planka.selectorLabels" . | nindent 6 }} - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "planka.selectorLabels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - serviceAccountName: {{ include "planka.serviceAccountName" . }} - securityContext: - {{- toYaml .Values.podSecurityContext | nindent 8 }} - containers: - - name: {{ .Chart.Name }} - securityContext: - {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - ports: - - name: http - containerPort: {{ .Values.service.containerPort | default 1337 }} - protocol: TCP - livenessProbe: - httpGet: - path: / - port: http - readinessProbe: - httpGet: - path: / - port: http - volumeMounts: - - mountPath: /app/public/user-avatars - subPath: user-avatars - name: planka - - mountPath: /app/public/project-background-images - subPath: project-background-images - name: planka - - mountPath: /app/private/attachments - subPath: attachments - name: planka - resources: - {{- toYaml .Values.resources | nindent 12 }} - env: - {{- if not .Values.postgresql.enabled }} - - name: DATABASE_URL - value: {{ required "If the included postgresql deployment is disabled you need to define a Database URL in 'dburl'" .Values.dburl }} - {{- else }} - - name: DATABASE_URL - valueFrom: - secretKeyRef: - name: planka-postgresql-svcbind-custom-user - key: uri - {{- end }} - - name: BASE_URL - {{- if .Values.baseUrl }} - value: {{ .Values.baseUrl }} - {{- else if .Values.ingress.enabled }} - value: {{ printf "https://%s" (first .Values.ingress.hosts).host }} - {{- else }} - value: http://localhost:3000 - {{- end }} - - name: SECRET_KEY - value: {{ required "A secret key needs to be generated using 'openssl rand -hex 64' and assigned to secretkey." .Values.secretkey }} - - name: TRUST_PROXY - value: "0" - - name: DEFAULT_ADMIN_EMAIL - value: {{ .Values.admin_email }} - - name: DEFAULT_ADMIN_PASSWORD - value: {{ .Values.admin_password }} - - name: DEFAULT_ADMIN_NAME - value: {{ .Values.admin_name }} - - name: DEFAULT_ADMIN_USERNAME - value: {{ .Values.admin_username }} - {{ range $k, $v := .Values.env }} - - name: {{ $k | quote }} - value: {{ $v | quote }} - {{- end }} - {{- if .Values.oidc.enabled }} - {{- $secretName := default (printf "%s-oidc" (include "planka.fullname" .)) .Values.oidc.existingSecret }} - - name: OIDC_CLIENT_ID - valueFrom: - secretKeyRef: - key: clientId - name: {{ $secretName }} - - name: OIDC_CLIENT_SECRET - valueFrom: - secretKeyRef: - key: clientSecret - name: {{ $secretName }} - - name: OIDC_ISSUER - value: {{ required "issuerUrl is required when configuring OIDC" .Values.oidc.issuerUrl | quote }} - - name: OIDC_SCOPES - value: {{ join " " .Values.oidc.scopes | default "openid profile email" | quote }} - {{- if .Values.oidc.admin.roles }} - - name: OIDC_ADMIN_ROLES - value: {{ join "," .Values.oidc.admin.roles | quote }} - {{- end }} - - name: OIDC_ROLES_ATTRIBUTE - value: {{ .Values.oidc.admin.rolesAttribute | default "groups" | quote }} - {{- if .Values.oidc.admin.ignoreRoles }} - - name: OIDC_IGNORE_ROLES - value: {{ .Values.oidc.admin.ignoreRoles | quote }} - {{- end }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - volumes: - - name: planka - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "planka.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "planka.fullname" . }} + labels: + {{- include "planka.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "planka.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "planka.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "planka.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.service.containerPort | default 1337 }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + readinessProbe: + httpGet: + path: / + port: http + volumeMounts: + - mountPath: /app/public/user-avatars + subPath: user-avatars + name: planka + - mountPath: /app/public/project-background-images + subPath: project-background-images + name: planka + - mountPath: /app/private/attachments + subPath: attachments + name: planka + resources: + {{- toYaml .Values.resources | nindent 12 }} + env: + {{- if not .Values.postgresql.enabled }} + - name: DATABASE_URL + value: {{ required "If the included postgresql deployment is disabled you need to define a Database URL in 'dburl'" .Values.dburl }} + {{- else }} + - name: DATABASE_URL + valueFrom: + secretKeyRef: + name: planka-postgresql-svcbind-custom-user + key: uri + {{- end }} + - name: BASE_URL + {{- if .Values.baseUrl }} + value: {{ .Values.baseUrl }} + {{- else if .Values.ingress.enabled }} + value: {{ printf "https://%s" (first .Values.ingress.hosts).host }} + {{- else }} + value: http://localhost:3000 + {{- end }} + - name: SECRET_KEY + value: {{ required "A secret key needs to be generated using 'openssl rand -hex 64' and assigned to secretkey." .Values.secretkey }} + - name: TRUST_PROXY + value: "0" + - name: DEFAULT_ADMIN_EMAIL + value: {{ .Values.admin_email }} + - name: DEFAULT_ADMIN_PASSWORD + value: {{ .Values.admin_password }} + - name: DEFAULT_ADMIN_NAME + value: {{ .Values.admin_name }} + - name: DEFAULT_ADMIN_USERNAME + value: {{ .Values.admin_username }} + {{ range $k, $v := .Values.env }} + - name: {{ $k | quote }} + value: {{ $v | quote }} + {{- end }} + {{- if .Values.oidc.enabled }} + {{- $secretName := default (printf "%s-oidc" (include "planka.fullname" .)) .Values.oidc.existingSecret }} + - name: OIDC_CLIENT_ID + valueFrom: + secretKeyRef: + key: clientId + name: {{ $secretName }} + - name: OIDC_CLIENT_SECRET + valueFrom: + secretKeyRef: + key: clientSecret + name: {{ $secretName }} + - name: OIDC_ISSUER + value: {{ required "issuerUrl is required when configuring OIDC" .Values.oidc.issuerUrl | quote }} + - name: OIDC_SCOPES + value: {{ join " " .Values.oidc.scopes | default "openid profile email" | quote }} + {{- if .Values.oidc.admin.roles }} + - name: OIDC_ADMIN_ROLES + value: {{ join "," .Values.oidc.admin.roles | quote }} + {{- end }} + - name: OIDC_ROLES_ATTRIBUTE + value: {{ .Values.oidc.admin.rolesAttribute | default "groups" | quote }} + {{- if .Values.oidc.admin.ignoreRoles }} + - name: OIDC_IGNORE_ROLES + value: {{ .Values.oidc.admin.ignoreRoles | quote }} + {{- end }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: planka + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.persistence.existingClaim | default (include "planka.fullname" .) }} + {{- else }} + emptyDir: {} + {{- end }} diff --git a/charts/planka/values.yaml b/charts/planka/values.yaml index 8adf94f..02cbfdd 100644 --- a/charts/planka/values.yaml +++ b/charts/planka/values.yaml @@ -1,182 +1,182 @@ -# Default values for planka. -# This is a YAML-formatted file. -# Declare variables to be passed into your templates. - -replicaCount: 1 - -image: - repository: ghcr.io/plankanban/planka - pullPolicy: IfNotPresent - # Overrides the image tag whose default is the chart appVersion. - tag: "" - -imagePullSecrets: [] -nameOverride: "" -fullnameOverride: "" - -# Generate a secret using openssl rand -base64 45 -secretkey: "" - -# Base url for Planka. Will override `ingress.hosts[0].host` -# Defaults to `http://localhost:3000` if ingress is disabled. -baseUrl: "" - -serviceAccount: - # Specifies whether a service account should be created - create: true - # Annotations to add to the service account - annotations: {} - # The name of the service account to use. - # If not set and create is true, a name is generated using the fullname template - name: "" - -podAnnotations: {} - -podSecurityContext: {} - # fsGroup: 2000 - -securityContext: {} - # capabilities: - # drop: - # - ALL - # readOnlyRootFilesystem: true - # runAsNonRoot: true - # runAsUser: 1000 - -service: - type: ClusterIP - port: 1337 - ## @param service.containerPort Planka HTTP container port - ## If empty will default to 1337 - ## - containerPort: 1337 - -ingress: - enabled: false - className: "" - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - hosts: - # Used to set planka BASE_URL if no `baseurl` is provided. - - host: planka.local - paths: - - path: / - pathType: ImplementationSpecific - tls: [] - # - secretName: planka-tls - # hosts: - # - planka.local - -resources: {} - # We usually recommend not to specify default resources and to leave this as a conscious - # choice for the user. This also increases chances charts run on environments with little - # resources, such as Minikube. If you do want to specify resources, uncomment the following - # lines, adjust them as necessary, and remove the curly braces after 'resources:'. - # limits: - # cpu: 100m - # memory: 128Mi - # requests: - # cpu: 100m - # memory: 128Mi - -autoscaling: - enabled: false - minReplicas: 1 - maxReplicas: 100 - targetCPUUtilizationPercentage: 80 - # targetMemoryUtilizationPercentage: 80 - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -postgresql: - enabled: true - auth: - database: planka - username: planka - password: "" - postgresPassword: "" - replicationPassword: "" - # existingSecret: planka-postgresql - serviceBindings: - enabled: true - -## Set this if you disable the built-in postgresql deployment -dburl: - -## PVC-based data storage configuration -persistence: - enabled: false - # existingClaim: netbox-data - # storageClass: "-" - accessMode: ReadWriteOnce - size: 10Gi - -## OpenID Identity Management configuration -## -## Example: -## --------------- -## oidc: -## enabled: true -## clientId: sxxaAIAxVXlCxTmc1YLHBbQr8NL8MqLI2DUbt42d -## clientSecret: om4RTMRVHRszU7bqxB7RZNkHIzA8e4sGYWxeCwIMYQXPwEBWe4SY5a0wwCe9ltB3zrq5f0dnFnp34cEHD7QSMHsKvV9AiV5Z7eqDraMnv0I8IFivmuV5wovAECAYreSI -## issuerUrl: https://auth.local/application/o/planka/ -## admin: -## roles: -## - planka-admin -## -## --------------- -## NOTE: A minimal configuration requires setting `clientId`, `clientSecret` and `issuerUrl`. (plus `admin.roles` for administrators) -## ref: https://docs.planka.cloud/docs/Configuration/OIDC -## -oidc: - ## @param oidc.enabled Enable single sign-on (SSO) with OpenID Connect (OIDC) - ## - enabled: false - - ## OIDC credentials - ## @param oidc.clientId A string unique to the provider that identifies your app. - ## @param oidc.clientSecret A secret string that the provider uses to confirm ownership of a client ID. - ## - ## NOTE: Either specify inline `clientId` and `clientSecret` or refer to them via `existingSecret` - ## - clientId: "" - clientSecret: "" - - ## @param oidc.existingSecret Name of an existing secret containing OIDC credentials - ## NOTE: Must contain key `clientId` and `clientSecret` - ## NOTE: When it's set, the `clientId` and `clientSecret` parameters are ignored - ## - existingSecret: "" - - ## @param oidc.issuerUrl The OpenID connect metadata document endpoint - ## - issuerUrl: "" - - ## @param oidc.scopes A list of scopes required for OIDC client. - ## If empty will default to `openid`, `profile` and `email` - ## NOTE: Planka needs the email and name claims - ## - scopes: [] - - ## Admin permissions configuration - admin: - ## @param oidc.admin.ignoreRoles If set to true, the admin roles will be ignored. - ## It is useful if you want to use OIDC for authentication but not for authorization. - ## If empty will default to `false` - ## - ignoreRoles: false - - ## @param oidc.admin.rolesAttribute The name of a custom group claim that you have configured in your OIDC provider - ## If empty will default to `groups` - ## - rolesAttribute: groups - - ## @param oidc.admin.roles The names of the admin groups - ## - roles: [] - # - planka-admin +# Default values for planka. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: ghcr.io/plankanban/planka + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +# Generate a secret using openssl rand -base64 45 +secretkey: "" + +# Base url for Planka. Will override `ingress.hosts[0].host` +# Defaults to `http://localhost:3000` if ingress is disabled. +baseUrl: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 1337 + ## @param service.containerPort Planka HTTP container port + ## If empty will default to 1337 + ## + containerPort: 1337 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + # Used to set planka BASE_URL if no `baseurl` is provided. + - host: planka.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: planka-tls + # hosts: + # - planka.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +postgresql: + enabled: true + auth: + database: planka + username: planka + password: "" + postgresPassword: "" + replicationPassword: "" + # existingSecret: planka-postgresql + serviceBindings: + enabled: true + +## Set this if you disable the built-in postgresql deployment +dburl: + +## PVC-based data storage configuration +persistence: + enabled: false + # existingClaim: netbox-data + # storageClass: "-" + accessMode: ReadWriteOnce + size: 10Gi + +## OpenID Identity Management configuration +## +## Example: +## --------------- +## oidc: +## enabled: true +## clientId: sxxaAIAxVXlCxTmc1YLHBbQr8NL8MqLI2DUbt42d +## clientSecret: om4RTMRVHRszU7bqxB7RZNkHIzA8e4sGYWxeCwIMYQXPwEBWe4SY5a0wwCe9ltB3zrq5f0dnFnp34cEHD7QSMHsKvV9AiV5Z7eqDraMnv0I8IFivmuV5wovAECAYreSI +## issuerUrl: https://auth.local/application/o/planka/ +## admin: +## roles: +## - planka-admin +## +## --------------- +## NOTE: A minimal configuration requires setting `clientId`, `clientSecret` and `issuerUrl`. (plus `admin.roles` for administrators) +## ref: https://docs.planka.cloud/docs/Configuration/OIDC +## +oidc: + ## @param oidc.enabled Enable single sign-on (SSO) with OpenID Connect (OIDC) + ## + enabled: false + + ## OIDC credentials + ## @param oidc.clientId A string unique to the provider that identifies your app. + ## @param oidc.clientSecret A secret string that the provider uses to confirm ownership of a client ID. + ## + ## NOTE: Either specify inline `clientId` and `clientSecret` or refer to them via `existingSecret` + ## + clientId: "" + clientSecret: "" + + ## @param oidc.existingSecret Name of an existing secret containing OIDC credentials + ## NOTE: Must contain key `clientId` and `clientSecret` + ## NOTE: When it's set, the `clientId` and `clientSecret` parameters are ignored + ## + existingSecret: "" + + ## @param oidc.issuerUrl The OpenID connect metadata document endpoint + ## + issuerUrl: "" + + ## @param oidc.scopes A list of scopes required for OIDC client. + ## If empty will default to `openid`, `profile` and `email` + ## NOTE: Planka needs the email and name claims + ## + scopes: [] + + ## Admin permissions configuration + admin: + ## @param oidc.admin.ignoreRoles If set to true, the admin roles will be ignored. + ## It is useful if you want to use OIDC for authentication but not for authorization. + ## If empty will default to `false` + ## + ignoreRoles: false + + ## @param oidc.admin.rolesAttribute The name of a custom group claim that you have configured in your OIDC provider + ## If empty will default to `groups` + ## + rolesAttribute: groups + + ## @param oidc.admin.roles The names of the admin groups + ## + roles: [] + # - planka-admin diff --git a/client/.env b/client/.env index e17aeb7..8ede5bb 100644 --- a/client/.env +++ b/client/.env @@ -1 +1 @@ -REACT_APP_VERSION=1.16.2 +REACT_APP_VERSION=1.16.2 diff --git a/client/src/actions/cards.js b/client/src/actions/cards.js index 2bbe194..81d43b8 100644 --- a/client/src/actions/cards.js +++ b/client/src/actions/cards.js @@ -1,132 +1,132 @@ -import ActionTypes from '../constants/ActionTypes'; - -const createCard = (card) => ({ - type: ActionTypes.CARD_CREATE, - payload: { - card, - }, -}); - -createCard.success = (localId, card) => ({ - type: ActionTypes.CARD_CREATE__SUCCESS, - payload: { - localId, - card, - }, -}); - -createCard.failure = (localId, error) => ({ - type: ActionTypes.CARD_CREATE__FAILURE, - payload: { - localId, - error, - }, -}); - -const handleCardCreate = (card, cardMemberships, cardLabels, tasks, attachments) => ({ - type: ActionTypes.CARD_CREATE_HANDLE, - payload: { - card, - cardMemberships, - cardLabels, - tasks, - attachments, - }, -}); - -const updateCard = (id, data) => ({ - type: ActionTypes.CARD_UPDATE, - payload: { - id, - data, - }, -}); - -updateCard.success = (card) => ({ - type: ActionTypes.CARD_UPDATE__SUCCESS, - payload: { - card, - }, -}); - -updateCard.failure = (id, error) => ({ - type: ActionTypes.CARD_UPDATE__FAILURE, - payload: { - id, - error, - }, -}); - -const handleCardUpdate = (card) => ({ - type: ActionTypes.CARD_UPDATE_HANDLE, - payload: { - card, - }, -}); - -const duplicateCard = (id, card, taskIds) => ({ - type: ActionTypes.CARD_DUPLICATE, - payload: { - id, - card, - taskIds, - }, -}); - -duplicateCard.success = (localId, card, cardMemberships, cardLabels, tasks) => ({ - type: ActionTypes.CARD_DUPLICATE__SUCCESS, - payload: { - localId, - card, - cardMemberships, - cardLabels, - tasks, - }, -}); - -duplicateCard.failure = (id, error) => ({ - type: ActionTypes.CARD_DUPLICATE__FAILURE, - payload: { - id, - error, - }, -}); - -const deleteCard = (id) => ({ - type: ActionTypes.CARD_DELETE, - payload: { - id, - }, -}); - -deleteCard.success = (card) => ({ - type: ActionTypes.CARD_DELETE__SUCCESS, - payload: { - card, - }, -}); - -deleteCard.failure = (id, error) => ({ - type: ActionTypes.CARD_DELETE__FAILURE, - payload: { - id, - error, - }, -}); - -const handleCardDelete = (card) => ({ - type: ActionTypes.CARD_DELETE_HANDLE, - payload: { - card, - }, -}); - -export default { - createCard, - handleCardCreate, - updateCard, - handleCardUpdate, - duplicateCard, - deleteCard, - handleCardDelete, -}; +import ActionTypes from '../constants/ActionTypes'; + +const createCard = (card) => ({ + type: ActionTypes.CARD_CREATE, + payload: { + card, + }, +}); + +createCard.success = (localId, card) => ({ + type: ActionTypes.CARD_CREATE__SUCCESS, + payload: { + localId, + card, + }, +}); + +createCard.failure = (localId, error) => ({ + type: ActionTypes.CARD_CREATE__FAILURE, + payload: { + localId, + error, + }, +}); + +const handleCardCreate = (card, cardMemberships, cardLabels, tasks, attachments) => ({ + type: ActionTypes.CARD_CREATE_HANDLE, + payload: { + card, + cardMemberships, + cardLabels, + tasks, + attachments, + }, +}); + +const updateCard = (id, data) => ({ + type: ActionTypes.CARD_UPDATE, + payload: { + id, + data, + }, +}); + +updateCard.success = (card) => ({ + type: ActionTypes.CARD_UPDATE__SUCCESS, + payload: { + card, + }, +}); + +updateCard.failure = (id, error) => ({ + type: ActionTypes.CARD_UPDATE__FAILURE, + payload: { + id, + error, + }, +}); + +const handleCardUpdate = (card) => ({ + type: ActionTypes.CARD_UPDATE_HANDLE, + payload: { + card, + }, +}); + +const duplicateCard = (id, card, taskIds) => ({ + type: ActionTypes.CARD_DUPLICATE, + payload: { + id, + card, + taskIds, + }, +}); + +duplicateCard.success = (localId, card, cardMemberships, cardLabels, tasks) => ({ + type: ActionTypes.CARD_DUPLICATE__SUCCESS, + payload: { + localId, + card, + cardMemberships, + cardLabels, + tasks, + }, +}); + +duplicateCard.failure = (id, error) => ({ + type: ActionTypes.CARD_DUPLICATE__FAILURE, + payload: { + id, + error, + }, +}); + +const deleteCard = (id) => ({ + type: ActionTypes.CARD_DELETE, + payload: { + id, + }, +}); + +deleteCard.success = (card) => ({ + type: ActionTypes.CARD_DELETE__SUCCESS, + payload: { + card, + }, +}); + +deleteCard.failure = (id, error) => ({ + type: ActionTypes.CARD_DELETE__FAILURE, + payload: { + id, + error, + }, +}); + +const handleCardDelete = (card) => ({ + type: ActionTypes.CARD_DELETE_HANDLE, + payload: { + card, + }, +}); + +export default { + createCard, + handleCardCreate, + updateCard, + handleCardUpdate, + duplicateCard, + deleteCard, + handleCardDelete, +}; diff --git a/client/src/api/cards.js b/client/src/api/cards.js index 568ca8e..235ba4c 100755 --- a/client/src/api/cards.js +++ b/client/src/api/cards.js @@ -1,94 +1,94 @@ -import socket from './socket'; -import { transformAttachment } from './attachments'; - -/* Transformers */ - -export const transformCard = (card) => ({ - ...card, - ...(card.dueDate && { - dueDate: new Date(card.dueDate), - }), - ...(card.stopwatch && { - stopwatch: { - ...card.stopwatch, - ...(card.stopwatch.startedAt && { - startedAt: new Date(card.stopwatch.startedAt), - }), - }, - }), -}); - -export const transformCardData = (data) => ({ - ...data, - ...(data.dueDate && { - dueDate: data.dueDate.toISOString(), - }), - ...(data.stopwatch && { - stopwatch: { - ...data.stopwatch, - ...(data.stopwatch.startedAt && { - startedAt: data.stopwatch.startedAt.toISOString(), - }), - }, - }), -}); - -/* Actions */ - -const createCard = (listId, data, headers) => - socket.post(`/lists/${listId}/cards`, transformCardData(data), headers).then((body) => ({ - ...body, - item: transformCard(body.item), - })); - -const getCard = (id, headers) => - socket.get(`/cards/${id}`, undefined, headers).then((body) => ({ - ...body, - item: transformCard(body.item), - included: { - ...body.included, - attachments: body.included.attachments.map(transformAttachment), - }, - })); - -const updateCard = (id, data, headers) => - socket.patch(`/cards/${id}`, transformCardData(data), headers).then((body) => ({ - ...body, - item: transformCard(body.item), - })); - -const duplicateCard = (id, data, headers) => - socket.post(`/cards/${id}/duplicate`, data, headers).then((body) => ({ - ...body, - item: transformCard(body.item), - })); - -const deleteCard = (id, headers) => - socket.delete(`/cards/${id}`, undefined, headers).then((body) => ({ - ...body, - item: transformCard(body.item), - })); - -/* Event handlers */ - -const makeHandleCardCreate = (next) => (body) => { - next({ - ...body, - item: transformCard(body.item), - }); -}; - -const makeHandleCardUpdate = makeHandleCardCreate; - -const makeHandleCardDelete = makeHandleCardCreate; - -export default { - createCard, - getCard, - updateCard, - deleteCard, - duplicateCard, - makeHandleCardCreate, - makeHandleCardUpdate, - makeHandleCardDelete, -}; +import socket from './socket'; +import { transformAttachment } from './attachments'; + +/* Transformers */ + +export const transformCard = (card) => ({ + ...card, + ...(card.dueDate && { + dueDate: new Date(card.dueDate), + }), + ...(card.stopwatch && { + stopwatch: { + ...card.stopwatch, + ...(card.stopwatch.startedAt && { + startedAt: new Date(card.stopwatch.startedAt), + }), + }, + }), +}); + +export const transformCardData = (data) => ({ + ...data, + ...(data.dueDate && { + dueDate: data.dueDate.toISOString(), + }), + ...(data.stopwatch && { + stopwatch: { + ...data.stopwatch, + ...(data.stopwatch.startedAt && { + startedAt: data.stopwatch.startedAt.toISOString(), + }), + }, + }), +}); + +/* Actions */ + +const createCard = (listId, data, headers) => + socket.post(`/lists/${listId}/cards`, transformCardData(data), headers).then((body) => ({ + ...body, + item: transformCard(body.item), + })); + +const getCard = (id, headers) => + socket.get(`/cards/${id}`, undefined, headers).then((body) => ({ + ...body, + item: transformCard(body.item), + included: { + ...body.included, + attachments: body.included.attachments.map(transformAttachment), + }, + })); + +const updateCard = (id, data, headers) => + socket.patch(`/cards/${id}`, transformCardData(data), headers).then((body) => ({ + ...body, + item: transformCard(body.item), + })); + +const duplicateCard = (id, data, headers) => + socket.post(`/cards/${id}/duplicate`, data, headers).then((body) => ({ + ...body, + item: transformCard(body.item), + })); + +const deleteCard = (id, headers) => + socket.delete(`/cards/${id}`, undefined, headers).then((body) => ({ + ...body, + item: transformCard(body.item), + })); + +/* Event handlers */ + +const makeHandleCardCreate = (next) => (body) => { + next({ + ...body, + item: transformCard(body.item), + }); +}; + +const makeHandleCardUpdate = makeHandleCardCreate; + +const makeHandleCardDelete = makeHandleCardCreate; + +export default { + createCard, + getCard, + updateCard, + deleteCard, + duplicateCard, + makeHandleCardCreate, + makeHandleCardUpdate, + makeHandleCardDelete, +}; diff --git a/client/src/components/Card/ActionsStep.jsx b/client/src/components/Card/ActionsStep.jsx index bd9db9e..55a8438 100644 --- a/client/src/components/Card/ActionsStep.jsx +++ b/client/src/components/Card/ActionsStep.jsx @@ -1,260 +1,260 @@ -import pick from 'lodash/pick'; -import React, { useCallback } from 'react'; -import PropTypes from 'prop-types'; -import { useTranslation } from 'react-i18next'; -import { Menu } from 'semantic-ui-react'; -import { Popup } from '../../lib/custom-ui'; - -import { useSteps } from '../../hooks'; -import BoardMembershipsStep from '../BoardMembershipsStep'; -import LabelsStep from '../LabelsStep'; -import DueDateEditStep from '../DueDateEditStep'; -import StopwatchEditStep from '../StopwatchEditStep'; -import CardMoveStep from '../CardMoveStep'; -import DeleteStep from '../DeleteStep'; - -import styles from './ActionsStep.module.scss'; - -const StepTypes = { - USERS: 'USERS', - LABELS: 'LABELS', - EDIT_DUE_DATE: 'EDIT_DUE_DATE', - EDIT_STOPWATCH: 'EDIT_STOPWATCH', - MOVE: 'MOVE', - DELETE: 'DELETE', -}; - -const ActionsStep = React.memo( - ({ - card, - projectsToLists, - boardMemberships, - currentUserIds, - labels, - currentLabelIds, - onNameEdit, - onUpdate, - onMove, - onTransfer, - onDuplicate, - onDelete, - onUserAdd, - onUserRemove, - onBoardFetch, - onLabelAdd, - onLabelRemove, - onLabelCreate, - onLabelUpdate, - onLabelMove, - onLabelDelete, - onClose, - }) => { - const [t] = useTranslation(); - const [step, openStep, handleBack] = useSteps(); - - const handleEditNameClick = useCallback(() => { - onNameEdit(); - onClose(); - }, [onNameEdit, onClose]); - - const handleUsersClick = useCallback(() => { - openStep(StepTypes.USERS); - }, [openStep]); - - const handleLabelsClick = useCallback(() => { - openStep(StepTypes.LABELS); - }, [openStep]); - - const handleEditDueDateClick = useCallback(() => { - openStep(StepTypes.EDIT_DUE_DATE); - }, [openStep]); - - const handleEditStopwatchClick = useCallback(() => { - openStep(StepTypes.EDIT_STOPWATCH); - }, [openStep]); - - const handleMoveClick = useCallback(() => { - openStep(StepTypes.MOVE); - }, [openStep]); - - const handleDuplicateClick = useCallback(() => { - onDuplicate(); - onClose(); - }, [onDuplicate, onClose]); - - const handleDeleteClick = useCallback(() => { - openStep(StepTypes.DELETE); - }, [openStep]); - - const handleDueDateUpdate = useCallback( - (dueDate) => { - onUpdate({ - dueDate, - }); - }, - [onUpdate], - ); - - const handleStopwatchUpdate = useCallback( - (stopwatch) => { - onUpdate({ - stopwatch, - }); - }, - [onUpdate], - ); - - if (step) { - switch (step.type) { - case StepTypes.USERS: - return ( - - ); - case StepTypes.LABELS: - return ( - - ); - case StepTypes.EDIT_DUE_DATE: - return ( - - ); - case StepTypes.EDIT_STOPWATCH: - return ( - - ); - case StepTypes.MOVE: - return ( - - ); - case StepTypes.DELETE: - return ( - - ); - default: - } - } - - return ( - <> - - {t('common.cardActions', { - context: 'title', - })} - - - - - {t('action.editTitle', { - context: 'title', - })} - - - {t('common.members', { - context: 'title', - })} - - - {t('common.labels', { - context: 'title', - })} - - - {t('action.editDueDate', { - context: 'title', - })} - - - {t('action.editStopwatch', { - context: 'title', - })} - - - {t('action.moveCard', { - context: 'title', - })} - - - {t('action.duplicateCard', { - context: 'title', - })} - - - {t('action.deleteCard', { - context: 'title', - })} - - - - - ); - }, -); - -ActionsStep.propTypes = { - /* eslint-disable react/forbid-prop-types */ - card: PropTypes.object.isRequired, - projectsToLists: PropTypes.array.isRequired, - boardMemberships: PropTypes.array.isRequired, - currentUserIds: PropTypes.array.isRequired, - labels: PropTypes.array.isRequired, - currentLabelIds: PropTypes.array.isRequired, - /* eslint-enable react/forbid-prop-types */ - onNameEdit: PropTypes.func.isRequired, - onUpdate: PropTypes.func.isRequired, - onMove: PropTypes.func.isRequired, - onTransfer: PropTypes.func.isRequired, - onDuplicate: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired, - onUserAdd: PropTypes.func.isRequired, - onUserRemove: PropTypes.func.isRequired, - onBoardFetch: PropTypes.func.isRequired, - onLabelAdd: PropTypes.func.isRequired, - onLabelRemove: PropTypes.func.isRequired, - onLabelCreate: PropTypes.func.isRequired, - onLabelUpdate: PropTypes.func.isRequired, - onLabelMove: PropTypes.func.isRequired, - onLabelDelete: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, -}; - -export default ActionsStep; +import pick from 'lodash/pick'; +import React, { useCallback } from 'react'; +import PropTypes from 'prop-types'; +import { useTranslation } from 'react-i18next'; +import { Menu } from 'semantic-ui-react'; +import { Popup } from '../../lib/custom-ui'; + +import { useSteps } from '../../hooks'; +import BoardMembershipsStep from '../BoardMembershipsStep'; +import LabelsStep from '../LabelsStep'; +import DueDateEditStep from '../DueDateEditStep'; +import StopwatchEditStep from '../StopwatchEditStep'; +import CardMoveStep from '../CardMoveStep'; +import DeleteStep from '../DeleteStep'; + +import styles from './ActionsStep.module.scss'; + +const StepTypes = { + USERS: 'USERS', + LABELS: 'LABELS', + EDIT_DUE_DATE: 'EDIT_DUE_DATE', + EDIT_STOPWATCH: 'EDIT_STOPWATCH', + MOVE: 'MOVE', + DELETE: 'DELETE', +}; + +const ActionsStep = React.memo( + ({ + card, + projectsToLists, + boardMemberships, + currentUserIds, + labels, + currentLabelIds, + onNameEdit, + onUpdate, + onMove, + onTransfer, + onDuplicate, + onDelete, + onUserAdd, + onUserRemove, + onBoardFetch, + onLabelAdd, + onLabelRemove, + onLabelCreate, + onLabelUpdate, + onLabelMove, + onLabelDelete, + onClose, + }) => { + const [t] = useTranslation(); + const [step, openStep, handleBack] = useSteps(); + + const handleEditNameClick = useCallback(() => { + onNameEdit(); + onClose(); + }, [onNameEdit, onClose]); + + const handleUsersClick = useCallback(() => { + openStep(StepTypes.USERS); + }, [openStep]); + + const handleLabelsClick = useCallback(() => { + openStep(StepTypes.LABELS); + }, [openStep]); + + const handleEditDueDateClick = useCallback(() => { + openStep(StepTypes.EDIT_DUE_DATE); + }, [openStep]); + + const handleEditStopwatchClick = useCallback(() => { + openStep(StepTypes.EDIT_STOPWATCH); + }, [openStep]); + + const handleMoveClick = useCallback(() => { + openStep(StepTypes.MOVE); + }, [openStep]); + + const handleDuplicateClick = useCallback(() => { + onDuplicate(); + onClose(); + }, [onDuplicate, onClose]); + + const handleDeleteClick = useCallback(() => { + openStep(StepTypes.DELETE); + }, [openStep]); + + const handleDueDateUpdate = useCallback( + (dueDate) => { + onUpdate({ + dueDate, + }); + }, + [onUpdate], + ); + + const handleStopwatchUpdate = useCallback( + (stopwatch) => { + onUpdate({ + stopwatch, + }); + }, + [onUpdate], + ); + + if (step) { + switch (step.type) { + case StepTypes.USERS: + return ( + + ); + case StepTypes.LABELS: + return ( + + ); + case StepTypes.EDIT_DUE_DATE: + return ( + + ); + case StepTypes.EDIT_STOPWATCH: + return ( + + ); + case StepTypes.MOVE: + return ( + + ); + case StepTypes.DELETE: + return ( + + ); + default: + } + } + + return ( + <> + + {t('common.cardActions', { + context: 'title', + })} + + + + + {t('action.editTitle', { + context: 'title', + })} + + + {t('common.members', { + context: 'title', + })} + + + {t('common.labels', { + context: 'title', + })} + + + {t('action.editDueDate', { + context: 'title', + })} + + + {t('action.editStopwatch', { + context: 'title', + })} + + + {t('action.moveCard', { + context: 'title', + })} + + + {t('action.duplicateCard', { + context: 'title', + })} + + + {t('action.deleteCard', { + context: 'title', + })} + + + + + ); + }, +); + +ActionsStep.propTypes = { + /* eslint-disable react/forbid-prop-types */ + card: PropTypes.object.isRequired, + projectsToLists: PropTypes.array.isRequired, + boardMemberships: PropTypes.array.isRequired, + currentUserIds: PropTypes.array.isRequired, + labels: PropTypes.array.isRequired, + currentLabelIds: PropTypes.array.isRequired, + /* eslint-enable react/forbid-prop-types */ + onNameEdit: PropTypes.func.isRequired, + onUpdate: PropTypes.func.isRequired, + onMove: PropTypes.func.isRequired, + onTransfer: PropTypes.func.isRequired, + onDuplicate: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + onUserAdd: PropTypes.func.isRequired, + onUserRemove: PropTypes.func.isRequired, + onBoardFetch: PropTypes.func.isRequired, + onLabelAdd: PropTypes.func.isRequired, + onLabelRemove: PropTypes.func.isRequired, + onLabelCreate: PropTypes.func.isRequired, + onLabelUpdate: PropTypes.func.isRequired, + onLabelMove: PropTypes.func.isRequired, + onLabelDelete: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +}; + +export default ActionsStep; diff --git a/client/src/components/Card/Card.jsx b/client/src/components/Card/Card.jsx index 4adddbc..a344f75 100755 --- a/client/src/components/Card/Card.jsx +++ b/client/src/components/Card/Card.jsx @@ -1,262 +1,262 @@ -import React, { useCallback, useRef } from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import { Button, Icon } from 'semantic-ui-react'; -import { Link } from 'react-router-dom'; -import { Draggable } from 'react-beautiful-dnd'; -import { usePopup } from '../../lib/popup'; - -import { startStopwatch, stopStopwatch } from '../../utils/stopwatch'; -import Paths from '../../constants/Paths'; -import Tasks from './Tasks'; -import NameEdit from './NameEdit'; -import ActionsStep from './ActionsStep'; -import User from '../User'; -import Label from '../Label'; -import DueDate from '../DueDate'; -import Stopwatch from '../Stopwatch'; - -import styles from './Card.module.scss'; - -const Card = React.memo( - ({ - id, - index, - name, - dueDate, - stopwatch, - coverUrl, - boardId, - listId, - projectId, - isPersisted, - notificationsTotal, - users, - labels, - tasks, - allProjectsToLists, - allBoardMemberships, - allLabels, - canEdit, - onUpdate, - onMove, - onTransfer, - onDuplicate, - onDelete, - onUserAdd, - onUserRemove, - onBoardFetch, - onLabelAdd, - onLabelRemove, - onLabelCreate, - onLabelUpdate, - onLabelMove, - onLabelDelete, - }) => { - const nameEdit = useRef(null); - - const handleClick = useCallback(() => { - if (document.activeElement) { - document.activeElement.blur(); - } - }, []); - - const handleToggleStopwatchClick = useCallback( - (event) => { - event.preventDefault(); - - onUpdate({ - stopwatch: stopwatch.startedAt ? stopStopwatch(stopwatch) : startStopwatch(stopwatch), - }); - }, - [stopwatch, onUpdate], - ); - - const handleNameUpdate = useCallback( - (newName) => { - onUpdate({ - name: newName, - }); - }, - [onUpdate], - ); - - const handleNameEdit = useCallback(() => { - nameEdit.current.open(); - }, []); - - const ActionsPopup = usePopup(ActionsStep); - - const contentNode = ( - <> - {coverUrl && } -
- {labels.length > 0 && ( - - {labels.map((label) => ( - - - ))} - - )} -
{name}
- {tasks.length > 0 && } - {(dueDate || stopwatch || notificationsTotal > 0) && ( - - {notificationsTotal > 0 && ( - - {notificationsTotal} - - )} - {dueDate && ( - - - - )} - {stopwatch && ( - - - - )} - - )} - {users.length > 0 && ( - - {users.map((user) => ( - - - - ))} - - )} -
- - ); - - return ( - - {({ innerRef, draggableProps, dragHandleProps }) => ( - // eslint-disable-next-line react/jsx-props-no-spreading -
- -
- {isPersisted ? ( - <> - - {contentNode} - - {canEdit && ( - user.id)} - labels={allLabels} - currentLabelIds={labels.map((label) => label.id)} - onNameEdit={handleNameEdit} - onUpdate={onUpdate} - onMove={onMove} - onTransfer={onTransfer} - onDuplicate={onDuplicate} - onDelete={onDelete} - onUserAdd={onUserAdd} - onUserRemove={onUserRemove} - onBoardFetch={onBoardFetch} - onLabelAdd={onLabelAdd} - onLabelRemove={onLabelRemove} - onLabelCreate={onLabelCreate} - onLabelUpdate={onLabelUpdate} - onLabelMove={onLabelMove} - onLabelDelete={onLabelDelete} - > - - - )} - - ) : ( - {contentNode} - )} -
-
-
- )} -
- ); - }, -); - -Card.propTypes = { - id: PropTypes.string.isRequired, - index: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - dueDate: PropTypes.instanceOf(Date), - stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types - coverUrl: PropTypes.string, - boardId: PropTypes.string.isRequired, - listId: PropTypes.string.isRequired, - projectId: PropTypes.string.isRequired, - isPersisted: PropTypes.bool.isRequired, - notificationsTotal: PropTypes.number.isRequired, - /* eslint-disable react/forbid-prop-types */ - users: PropTypes.array.isRequired, - labels: PropTypes.array.isRequired, - tasks: PropTypes.array.isRequired, - allProjectsToLists: PropTypes.array.isRequired, - allBoardMemberships: PropTypes.array.isRequired, - allLabels: PropTypes.array.isRequired, - /* eslint-enable react/forbid-prop-types */ - canEdit: PropTypes.bool.isRequired, - onUpdate: PropTypes.func.isRequired, - onMove: PropTypes.func.isRequired, - onTransfer: PropTypes.func.isRequired, - onDuplicate: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired, - onUserAdd: PropTypes.func.isRequired, - onUserRemove: PropTypes.func.isRequired, - onBoardFetch: PropTypes.func.isRequired, - onLabelAdd: PropTypes.func.isRequired, - onLabelRemove: PropTypes.func.isRequired, - onLabelCreate: PropTypes.func.isRequired, - onLabelUpdate: PropTypes.func.isRequired, - onLabelMove: PropTypes.func.isRequired, - onLabelDelete: PropTypes.func.isRequired, -}; - -Card.defaultProps = { - dueDate: undefined, - stopwatch: undefined, - coverUrl: undefined, -}; - -export default Card; +import React, { useCallback, useRef } from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { Button, Icon } from 'semantic-ui-react'; +import { Link } from 'react-router-dom'; +import { Draggable } from 'react-beautiful-dnd'; +import { usePopup } from '../../lib/popup'; + +import { startStopwatch, stopStopwatch } from '../../utils/stopwatch'; +import Paths from '../../constants/Paths'; +import Tasks from './Tasks'; +import NameEdit from './NameEdit'; +import ActionsStep from './ActionsStep'; +import User from '../User'; +import Label from '../Label'; +import DueDate from '../DueDate'; +import Stopwatch from '../Stopwatch'; + +import styles from './Card.module.scss'; + +const Card = React.memo( + ({ + id, + index, + name, + dueDate, + stopwatch, + coverUrl, + boardId, + listId, + projectId, + isPersisted, + notificationsTotal, + users, + labels, + tasks, + allProjectsToLists, + allBoardMemberships, + allLabels, + canEdit, + onUpdate, + onMove, + onTransfer, + onDuplicate, + onDelete, + onUserAdd, + onUserRemove, + onBoardFetch, + onLabelAdd, + onLabelRemove, + onLabelCreate, + onLabelUpdate, + onLabelMove, + onLabelDelete, + }) => { + const nameEdit = useRef(null); + + const handleClick = useCallback(() => { + if (document.activeElement) { + document.activeElement.blur(); + } + }, []); + + const handleToggleStopwatchClick = useCallback( + (event) => { + event.preventDefault(); + + onUpdate({ + stopwatch: stopwatch.startedAt ? stopStopwatch(stopwatch) : startStopwatch(stopwatch), + }); + }, + [stopwatch, onUpdate], + ); + + const handleNameUpdate = useCallback( + (newName) => { + onUpdate({ + name: newName, + }); + }, + [onUpdate], + ); + + const handleNameEdit = useCallback(() => { + nameEdit.current.open(); + }, []); + + const ActionsPopup = usePopup(ActionsStep); + + const contentNode = ( + <> + {coverUrl && } +
+ {labels.length > 0 && ( + + {labels.map((label) => ( + + + ))} + + )} +
{name}
+ {tasks.length > 0 && } + {(dueDate || stopwatch || notificationsTotal > 0) && ( + + {notificationsTotal > 0 && ( + + {notificationsTotal} + + )} + {dueDate && ( + + + + )} + {stopwatch && ( + + + + )} + + )} + {users.length > 0 && ( + + {users.map((user) => ( + + + + ))} + + )} +
+ + ); + + return ( + + {({ innerRef, draggableProps, dragHandleProps }) => ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+ +
+ {isPersisted ? ( + <> + + {contentNode} + + {canEdit && ( + user.id)} + labels={allLabels} + currentLabelIds={labels.map((label) => label.id)} + onNameEdit={handleNameEdit} + onUpdate={onUpdate} + onMove={onMove} + onTransfer={onTransfer} + onDuplicate={onDuplicate} + onDelete={onDelete} + onUserAdd={onUserAdd} + onUserRemove={onUserRemove} + onBoardFetch={onBoardFetch} + onLabelAdd={onLabelAdd} + onLabelRemove={onLabelRemove} + onLabelCreate={onLabelCreate} + onLabelUpdate={onLabelUpdate} + onLabelMove={onLabelMove} + onLabelDelete={onLabelDelete} + > + + + )} + + ) : ( + {contentNode} + )} +
+
+
+ )} +
+ ); + }, +); + +Card.propTypes = { + id: PropTypes.string.isRequired, + index: PropTypes.number.isRequired, + name: PropTypes.string.isRequired, + dueDate: PropTypes.instanceOf(Date), + stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types + coverUrl: PropTypes.string, + boardId: PropTypes.string.isRequired, + listId: PropTypes.string.isRequired, + projectId: PropTypes.string.isRequired, + isPersisted: PropTypes.bool.isRequired, + notificationsTotal: PropTypes.number.isRequired, + /* eslint-disable react/forbid-prop-types */ + users: PropTypes.array.isRequired, + labels: PropTypes.array.isRequired, + tasks: PropTypes.array.isRequired, + allProjectsToLists: PropTypes.array.isRequired, + allBoardMemberships: PropTypes.array.isRequired, + allLabels: PropTypes.array.isRequired, + /* eslint-enable react/forbid-prop-types */ + canEdit: PropTypes.bool.isRequired, + onUpdate: PropTypes.func.isRequired, + onMove: PropTypes.func.isRequired, + onTransfer: PropTypes.func.isRequired, + onDuplicate: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + onUserAdd: PropTypes.func.isRequired, + onUserRemove: PropTypes.func.isRequired, + onBoardFetch: PropTypes.func.isRequired, + onLabelAdd: PropTypes.func.isRequired, + onLabelRemove: PropTypes.func.isRequired, + onLabelCreate: PropTypes.func.isRequired, + onLabelUpdate: PropTypes.func.isRequired, + onLabelMove: PropTypes.func.isRequired, + onLabelDelete: PropTypes.func.isRequired, +}; + +Card.defaultProps = { + dueDate: undefined, + stopwatch: undefined, + coverUrl: undefined, +}; + +export default Card; diff --git a/client/src/components/CardModal/CardModal.jsx b/client/src/components/CardModal/CardModal.jsx index ff77aa9..791e30f 100755 --- a/client/src/components/CardModal/CardModal.jsx +++ b/client/src/components/CardModal/CardModal.jsx @@ -1,600 +1,600 @@ -import React, { useCallback, useRef } from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import { useTranslation } from 'react-i18next'; -import { Button, Grid, Icon, Modal } from 'semantic-ui-react'; -import { usePopup } from '../../lib/popup'; -import { Markdown } from '../../lib/custom-ui'; - -import { startStopwatch, stopStopwatch } from '../../utils/stopwatch'; -import NameField from './NameField'; -import DescriptionEdit from './DescriptionEdit'; -import Tasks from './Tasks'; -import Attachments from './Attachments'; -import AttachmentAddZone from './AttachmentAddZone'; -import AttachmentAddStep from './AttachmentAddStep'; -import Activities from './Activities'; -import User from '../User'; -import Label from '../Label'; -import DueDate from '../DueDate'; -import Stopwatch from '../Stopwatch'; -import BoardMembershipsStep from '../BoardMembershipsStep'; -import LabelsStep from '../LabelsStep'; -import DueDateEditStep from '../DueDateEditStep'; -import StopwatchEditStep from '../StopwatchEditStep'; -import CardMoveStep from '../CardMoveStep'; -import DeleteStep from '../DeleteStep'; - -import styles from './CardModal.module.scss'; - -const CardModal = React.memo( - ({ - name, - description, - dueDate, - stopwatch, - isSubscribed, - isActivitiesFetching, - isAllActivitiesFetched, - isActivitiesDetailsVisible, - isActivitiesDetailsFetching, - listId, - boardId, - projectId, - users, - labels, - tasks, - attachments, - activities, - allProjectsToLists, - allBoardMemberships, - allLabels, - canEdit, - canEditCommentActivities, - canEditAllCommentActivities, - onUpdate, - onMove, - onTransfer, - onDuplicate, - onDelete, - onUserAdd, - onUserRemove, - onBoardFetch, - onLabelAdd, - onLabelRemove, - onLabelCreate, - onLabelUpdate, - onLabelMove, - onLabelDelete, - onTaskCreate, - onTaskUpdate, - onTaskMove, - onTaskDelete, - onAttachmentCreate, - onAttachmentUpdate, - onAttachmentDelete, - onActivitiesFetch, - onActivitiesDetailsToggle, - onCommentActivityCreate, - onCommentActivityUpdate, - onCommentActivityDelete, - onClose, - }) => { - const [t] = useTranslation(); - - const isGalleryOpened = useRef(false); - - const handleToggleStopwatchClick = useCallback(() => { - onUpdate({ - stopwatch: stopwatch.startedAt ? stopStopwatch(stopwatch) : startStopwatch(stopwatch), - }); - }, [stopwatch, onUpdate]); - - const handleNameUpdate = useCallback( - (newName) => { - onUpdate({ - name: newName, - }); - }, - [onUpdate], - ); - - const handleDescriptionUpdate = useCallback( - (newDescription) => { - onUpdate({ - description: newDescription, - }); - }, - [onUpdate], - ); - - const handleDueDateUpdate = useCallback( - (newDueDate) => { - onUpdate({ - dueDate: newDueDate, - }); - }, - [onUpdate], - ); - - const handleStopwatchUpdate = useCallback( - (newStopwatch) => { - onUpdate({ - stopwatch: newStopwatch, - }); - }, - [onUpdate], - ); - - const handleCoverUpdate = useCallback( - (newCoverAttachmentId) => { - onUpdate({ - coverAttachmentId: newCoverAttachmentId, - }); - }, - [onUpdate], - ); - - const handleToggleSubscriptionClick = useCallback(() => { - onUpdate({ - isSubscribed: !isSubscribed, - }); - }, [isSubscribed, onUpdate]); - - const handleDuplicateClick = useCallback(() => { - onDuplicate(); - onClose(); - }, [onDuplicate, onClose]); - - const handleGalleryOpen = useCallback(() => { - isGalleryOpened.current = true; - }, []); - - const handleGalleryClose = useCallback(() => { - isGalleryOpened.current = false; - }, []); - - const handleClose = useCallback(() => { - if (isGalleryOpened.current) { - return; - } - - onClose(); - }, [onClose]); - - const AttachmentAddPopup = usePopup(AttachmentAddStep); - const BoardMembershipsPopup = usePopup(BoardMembershipsStep); - const LabelsPopup = usePopup(LabelsStep); - const DueDateEditPopup = usePopup(DueDateEditStep); - const StopwatchEditPopup = usePopup(StopwatchEditStep); - const CardMovePopup = usePopup(CardMoveStep); - const DeletePopup = usePopup(DeleteStep); - - const userIds = users.map((user) => user.id); - const labelIds = labels.map((label) => label.id); - - const contentNode = ( - - - -
- -
- {canEdit ? ( - - ) : ( -
{name}
- )} -
-
-
-
- - - {(users.length > 0 || labels.length > 0 || dueDate || stopwatch) && ( -
- {users.length > 0 && ( -
-
- {t('common.members', { - context: 'title', - })} -
- {users.map((user) => ( - - {canEdit ? ( - - - - ) : ( - - )} - - ))} - {canEdit && ( - - {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} - - - )} -
- )} - {labels.length > 0 && ( -
-
- {t('common.labels', { - context: 'title', - })} -
- {labels.map((label) => ( - - {canEdit ? ( - - - ) : ( - - ))} - {canEdit && ( - - {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} - - - )} -
- )} - {dueDate && ( -
-
- {t('common.dueDate', { - context: 'title', - })} -
- - {canEdit ? ( - - - - ) : ( - - )} - -
- )} - {stopwatch && ( -
-
- {t('common.stopwatch', { - context: 'title', - })} -
- - {canEdit ? ( - - - - ) : ( - - )} - - {canEdit && ( - // eslint-disable-next-line jsx-a11y/control-has-associated-label - - )} -
- )} -
- )} - {(description || canEdit) && ( -
-
- -
{t('common.description')}
- {canEdit ? ( - - {description ? ( - - ) : ( - - )} - - ) : ( -
- - {description} - -
- )} -
-
- )} - {(tasks.length > 0 || canEdit) && ( -
-
- -
{t('common.tasks')}
- -
-
- )} - {attachments.length > 0 && ( -
-
- -
{t('common.attachments')}
- -
-
- )} - -
- {canEdit && ( - -
- {t('action.addToCard')} - - - - - - - - - - - - - - - -
-
- {t('common.actions')} - - - - - - - - -
-
- )} -
-
- ); - - return ( - - {canEdit ? ( - {contentNode} - ) : ( - contentNode - )} - - ); - }, -); - -CardModal.propTypes = { - name: PropTypes.string.isRequired, - description: PropTypes.string, - dueDate: PropTypes.instanceOf(Date), - stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types - isSubscribed: PropTypes.bool.isRequired, - isActivitiesFetching: PropTypes.bool.isRequired, - isAllActivitiesFetched: PropTypes.bool.isRequired, - isActivitiesDetailsVisible: PropTypes.bool.isRequired, - isActivitiesDetailsFetching: PropTypes.bool.isRequired, - listId: PropTypes.string.isRequired, - boardId: PropTypes.string.isRequired, - projectId: PropTypes.string.isRequired, - /* eslint-disable react/forbid-prop-types */ - users: PropTypes.array.isRequired, - labels: PropTypes.array.isRequired, - tasks: PropTypes.array.isRequired, - attachments: PropTypes.array.isRequired, - activities: PropTypes.array.isRequired, - allProjectsToLists: PropTypes.array.isRequired, - allBoardMemberships: PropTypes.array.isRequired, - allLabels: PropTypes.array.isRequired, - /* eslint-enable react/forbid-prop-types */ - canEdit: PropTypes.bool.isRequired, - canEditCommentActivities: PropTypes.bool.isRequired, - canEditAllCommentActivities: PropTypes.bool.isRequired, - onUpdate: PropTypes.func.isRequired, - onMove: PropTypes.func.isRequired, - onTransfer: PropTypes.func.isRequired, - onDuplicate: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired, - onUserAdd: PropTypes.func.isRequired, - onUserRemove: PropTypes.func.isRequired, - onBoardFetch: PropTypes.func.isRequired, - onLabelAdd: PropTypes.func.isRequired, - onLabelRemove: PropTypes.func.isRequired, - onLabelCreate: PropTypes.func.isRequired, - onLabelUpdate: PropTypes.func.isRequired, - onLabelMove: PropTypes.func.isRequired, - onLabelDelete: PropTypes.func.isRequired, - onTaskCreate: PropTypes.func.isRequired, - onTaskUpdate: PropTypes.func.isRequired, - onTaskMove: PropTypes.func.isRequired, - onTaskDelete: PropTypes.func.isRequired, - onAttachmentCreate: PropTypes.func.isRequired, - onAttachmentUpdate: PropTypes.func.isRequired, - onAttachmentDelete: PropTypes.func.isRequired, - onActivitiesFetch: PropTypes.func.isRequired, - onActivitiesDetailsToggle: PropTypes.func.isRequired, - onCommentActivityCreate: PropTypes.func.isRequired, - onCommentActivityUpdate: PropTypes.func.isRequired, - onCommentActivityDelete: PropTypes.func.isRequired, - onClose: PropTypes.func.isRequired, -}; - -CardModal.defaultProps = { - description: undefined, - dueDate: undefined, - stopwatch: undefined, -}; - -export default CardModal; +import React, { useCallback, useRef } from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { useTranslation } from 'react-i18next'; +import { Button, Grid, Icon, Modal } from 'semantic-ui-react'; +import { usePopup } from '../../lib/popup'; +import { Markdown } from '../../lib/custom-ui'; + +import { startStopwatch, stopStopwatch } from '../../utils/stopwatch'; +import NameField from './NameField'; +import DescriptionEdit from './DescriptionEdit'; +import Tasks from './Tasks'; +import Attachments from './Attachments'; +import AttachmentAddZone from './AttachmentAddZone'; +import AttachmentAddStep from './AttachmentAddStep'; +import Activities from './Activities'; +import User from '../User'; +import Label from '../Label'; +import DueDate from '../DueDate'; +import Stopwatch from '../Stopwatch'; +import BoardMembershipsStep from '../BoardMembershipsStep'; +import LabelsStep from '../LabelsStep'; +import DueDateEditStep from '../DueDateEditStep'; +import StopwatchEditStep from '../StopwatchEditStep'; +import CardMoveStep from '../CardMoveStep'; +import DeleteStep from '../DeleteStep'; + +import styles from './CardModal.module.scss'; + +const CardModal = React.memo( + ({ + name, + description, + dueDate, + stopwatch, + isSubscribed, + isActivitiesFetching, + isAllActivitiesFetched, + isActivitiesDetailsVisible, + isActivitiesDetailsFetching, + listId, + boardId, + projectId, + users, + labels, + tasks, + attachments, + activities, + allProjectsToLists, + allBoardMemberships, + allLabels, + canEdit, + canEditCommentActivities, + canEditAllCommentActivities, + onUpdate, + onMove, + onTransfer, + onDuplicate, + onDelete, + onUserAdd, + onUserRemove, + onBoardFetch, + onLabelAdd, + onLabelRemove, + onLabelCreate, + onLabelUpdate, + onLabelMove, + onLabelDelete, + onTaskCreate, + onTaskUpdate, + onTaskMove, + onTaskDelete, + onAttachmentCreate, + onAttachmentUpdate, + onAttachmentDelete, + onActivitiesFetch, + onActivitiesDetailsToggle, + onCommentActivityCreate, + onCommentActivityUpdate, + onCommentActivityDelete, + onClose, + }) => { + const [t] = useTranslation(); + + const isGalleryOpened = useRef(false); + + const handleToggleStopwatchClick = useCallback(() => { + onUpdate({ + stopwatch: stopwatch.startedAt ? stopStopwatch(stopwatch) : startStopwatch(stopwatch), + }); + }, [stopwatch, onUpdate]); + + const handleNameUpdate = useCallback( + (newName) => { + onUpdate({ + name: newName, + }); + }, + [onUpdate], + ); + + const handleDescriptionUpdate = useCallback( + (newDescription) => { + onUpdate({ + description: newDescription, + }); + }, + [onUpdate], + ); + + const handleDueDateUpdate = useCallback( + (newDueDate) => { + onUpdate({ + dueDate: newDueDate, + }); + }, + [onUpdate], + ); + + const handleStopwatchUpdate = useCallback( + (newStopwatch) => { + onUpdate({ + stopwatch: newStopwatch, + }); + }, + [onUpdate], + ); + + const handleCoverUpdate = useCallback( + (newCoverAttachmentId) => { + onUpdate({ + coverAttachmentId: newCoverAttachmentId, + }); + }, + [onUpdate], + ); + + const handleToggleSubscriptionClick = useCallback(() => { + onUpdate({ + isSubscribed: !isSubscribed, + }); + }, [isSubscribed, onUpdate]); + + const handleDuplicateClick = useCallback(() => { + onDuplicate(); + onClose(); + }, [onDuplicate, onClose]); + + const handleGalleryOpen = useCallback(() => { + isGalleryOpened.current = true; + }, []); + + const handleGalleryClose = useCallback(() => { + isGalleryOpened.current = false; + }, []); + + const handleClose = useCallback(() => { + if (isGalleryOpened.current) { + return; + } + + onClose(); + }, [onClose]); + + const AttachmentAddPopup = usePopup(AttachmentAddStep); + const BoardMembershipsPopup = usePopup(BoardMembershipsStep); + const LabelsPopup = usePopup(LabelsStep); + const DueDateEditPopup = usePopup(DueDateEditStep); + const StopwatchEditPopup = usePopup(StopwatchEditStep); + const CardMovePopup = usePopup(CardMoveStep); + const DeletePopup = usePopup(DeleteStep); + + const userIds = users.map((user) => user.id); + const labelIds = labels.map((label) => label.id); + + const contentNode = ( + + + +
+ +
+ {canEdit ? ( + + ) : ( +
{name}
+ )} +
+
+
+
+ + + {(users.length > 0 || labels.length > 0 || dueDate || stopwatch) && ( +
+ {users.length > 0 && ( +
+
+ {t('common.members', { + context: 'title', + })} +
+ {users.map((user) => ( + + {canEdit ? ( + + + + ) : ( + + )} + + ))} + {canEdit && ( + + {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} + + + )} +
+ )} + {labels.length > 0 && ( +
+
+ {t('common.labels', { + context: 'title', + })} +
+ {labels.map((label) => ( + + {canEdit ? ( + + + ) : ( + + ))} + {canEdit && ( + + {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} + + + )} +
+ )} + {dueDate && ( +
+
+ {t('common.dueDate', { + context: 'title', + })} +
+ + {canEdit ? ( + + + + ) : ( + + )} + +
+ )} + {stopwatch && ( +
+
+ {t('common.stopwatch', { + context: 'title', + })} +
+ + {canEdit ? ( + + + + ) : ( + + )} + + {canEdit && ( + // eslint-disable-next-line jsx-a11y/control-has-associated-label + + )} +
+ )} +
+ )} + {(description || canEdit) && ( +
+
+ +
{t('common.description')}
+ {canEdit ? ( + + {description ? ( + + ) : ( + + )} + + ) : ( +
+ + {description} + +
+ )} +
+
+ )} + {(tasks.length > 0 || canEdit) && ( +
+
+ +
{t('common.tasks')}
+ +
+
+ )} + {attachments.length > 0 && ( +
+
+ +
{t('common.attachments')}
+ +
+
+ )} + +
+ {canEdit && ( + +
+ {t('action.addToCard')} + + + + + + + + + + + + + + + +
+
+ {t('common.actions')} + + + + + + + + +
+
+ )} +
+
+ ); + + return ( + + {canEdit ? ( + {contentNode} + ) : ( + contentNode + )} + + ); + }, +); + +CardModal.propTypes = { + name: PropTypes.string.isRequired, + description: PropTypes.string, + dueDate: PropTypes.instanceOf(Date), + stopwatch: PropTypes.object, // eslint-disable-line react/forbid-prop-types + isSubscribed: PropTypes.bool.isRequired, + isActivitiesFetching: PropTypes.bool.isRequired, + isAllActivitiesFetched: PropTypes.bool.isRequired, + isActivitiesDetailsVisible: PropTypes.bool.isRequired, + isActivitiesDetailsFetching: PropTypes.bool.isRequired, + listId: PropTypes.string.isRequired, + boardId: PropTypes.string.isRequired, + projectId: PropTypes.string.isRequired, + /* eslint-disable react/forbid-prop-types */ + users: PropTypes.array.isRequired, + labels: PropTypes.array.isRequired, + tasks: PropTypes.array.isRequired, + attachments: PropTypes.array.isRequired, + activities: PropTypes.array.isRequired, + allProjectsToLists: PropTypes.array.isRequired, + allBoardMemberships: PropTypes.array.isRequired, + allLabels: PropTypes.array.isRequired, + /* eslint-enable react/forbid-prop-types */ + canEdit: PropTypes.bool.isRequired, + canEditCommentActivities: PropTypes.bool.isRequired, + canEditAllCommentActivities: PropTypes.bool.isRequired, + onUpdate: PropTypes.func.isRequired, + onMove: PropTypes.func.isRequired, + onTransfer: PropTypes.func.isRequired, + onDuplicate: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + onUserAdd: PropTypes.func.isRequired, + onUserRemove: PropTypes.func.isRequired, + onBoardFetch: PropTypes.func.isRequired, + onLabelAdd: PropTypes.func.isRequired, + onLabelRemove: PropTypes.func.isRequired, + onLabelCreate: PropTypes.func.isRequired, + onLabelUpdate: PropTypes.func.isRequired, + onLabelMove: PropTypes.func.isRequired, + onLabelDelete: PropTypes.func.isRequired, + onTaskCreate: PropTypes.func.isRequired, + onTaskUpdate: PropTypes.func.isRequired, + onTaskMove: PropTypes.func.isRequired, + onTaskDelete: PropTypes.func.isRequired, + onAttachmentCreate: PropTypes.func.isRequired, + onAttachmentUpdate: PropTypes.func.isRequired, + onAttachmentDelete: PropTypes.func.isRequired, + onActivitiesFetch: PropTypes.func.isRequired, + onActivitiesDetailsToggle: PropTypes.func.isRequired, + onCommentActivityCreate: PropTypes.func.isRequired, + onCommentActivityUpdate: PropTypes.func.isRequired, + onCommentActivityDelete: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired, +}; + +CardModal.defaultProps = { + description: undefined, + dueDate: undefined, + stopwatch: undefined, +}; + +export default CardModal; diff --git a/client/src/constants/ActionTypes.js b/client/src/constants/ActionTypes.js index d5724e1..55829bd 100644 --- a/client/src/constants/ActionTypes.js +++ b/client/src/constants/ActionTypes.js @@ -1,266 +1,266 @@ -export default { - /* Router */ - - LOCATION_CHANGE_HANDLE: 'LOCATION_CHANGE_HANDLE', - LOCATION_CHANGE_HANDLE__BOARD_FETCH: 'LOCATION_CHANGE_HANDLE__BOARD_FETCH', - - /* Socket */ - - SOCKET_DISCONNECT_HANDLE: 'SOCKET_DISCONNECT_HANDLE', - SOCKET_RECONNECT_HANDLE: 'SOCKET_RECONNECT_HANDLE', - SOCKET_RECONNECT_HANDLE__CORE_FETCH: 'SOCKET_RECONNECT_HANDLE__CORE_FETCH', - - /* Login */ - - LOGIN_INITIALIZE: 'LOGIN_INITIALIZE', - AUTHENTICATE: 'AUTHENTICATE', - AUTHENTICATE__SUCCESS: 'AUTHENTICATE__SUCCESS', - AUTHENTICATE__FAILURE: 'AUTHENTICATE__FAILURE', - USING_OIDC_AUTHENTICATE: 'USING_OIDC_AUTHENTICATE', - USING_OIDC_AUTHENTICATE__SUCCESS: 'USING_OIDC_AUTHENTICATE__SUCCESS', - USING_OIDC_AUTHENTICATE__FAILURE: 'USING_OIDC_AUTHENTICATE__FAILURE', - AUTHENTICATE_ERROR_CLEAR: 'AUTHENTICATE_ERROR_CLEAR', - - /* Core */ - - CORE_INITIALIZE: 'CORE_INITIALIZE', - CORE_INITIALIZE__CONFIG_FETCH: 'CORE_INITIALIZE__CONFIG_FETCH', - LOGOUT: 'LOGOUT', - LOGOUT__ACCESS_TOKEN_INVALIDATE: 'LOGOUT__ACCESS_TOKEN_INVALIDATE', - - /* Modals */ - - MODAL_OPEN: 'MODAL_OPEN', - MODAL_CLOSE: 'MODAL_CLOSE', - - /* Users */ - - USER_CREATE: 'USER_CREATE', - USER_CREATE__SUCCESS: 'USER_CREATE__SUCCESS', - USER_CREATE__FAILURE: 'USER_CREATE__FAILURE', - USER_CREATE_HANDLE: 'USER_CREATE_HANDLE', - USER_CREATE_ERROR_CLEAR: 'USER_CREATE_ERROR_CLEAR', - USER_UPDATE: 'USER_UPDATE', - USER_UPDATE__SUCCESS: 'USER_UPDATE__SUCCESS', - USER_UPDATE__FAILURE: 'USER_UPDATE__FAILURE', - USER_UPDATE_HANDLE: 'USER_UPDATE_HANDLE', - USER_EMAIL_UPDATE: 'USER_EMAIL_UPDATE', - USER_EMAIL_UPDATE__SUCCESS: 'USER_EMAIL_UPDATE__SUCCESS', - USER_EMAIL_UPDATE__FAILURE: 'USER_EMAIL_UPDATE__FAILURE', - USER_EMAIL_UPDATE_ERROR_CLEAR: 'USER_EMAIL_UPDATE_ERROR_CLEAR', - USER_PASSWORD_UPDATE: 'USER_PASSWORD_UPDATE', - USER_PASSWORD_UPDATE__SUCCESS: 'USER_PASSWORD_UPDATE__SUCCESS', - USER_PASSWORD_UPDATE__FAILURE: 'USER_PASSWORD_UPDATE__FAILURE', - USER_PASSWORD_UPDATE_ERROR_CLEAR: 'USER_PASSWORD_UPDATE_ERROR_CLEAR', - USER_USERNAME_UPDATE: 'USER_USERNAME_UPDATE', - USER_USERNAME_UPDATE__SUCCESS: 'USER_USERNAME_UPDATE__SUCCESS', - USER_USERNAME_UPDATE__FAILURE: 'USER_USERNAME_UPDATE__FAILURE', - USER_USERNAME_UPDATE_ERROR_CLEAR: 'USER_USERNAME_UPDATE_ERROR_CLEAR', - USER_AVATAR_UPDATE: 'USER_AVATAR_UPDATE', - USER_AVATAR_UPDATE__SUCCESS: 'USER_AVATAR_UPDATE__SUCCESS', - USER_AVATAR_UPDATE__FAILURE: 'USER_AVATAR_UPDATE__FAILURE', - USER_DELETE: 'USER_DELETE', - USER_DELETE__SUCCESS: 'USER_DELETE__SUCCESS', - USER_DELETE__FAILURE: 'USER_DELETE__FAILURE', - USER_DELETE_HANDLE: 'USER_DELETE_HANDLE', - USER_TO_CARD_ADD: 'USER_TO_CARD_ADD', - USER_TO_CARD_ADD__SUCCESS: 'USER_TO_CARD_ADD__SUCCESS', - USER_TO_CARD_ADD__FAILURE: 'USER_TO_CARD_ADD__FAILURE', - USER_TO_CARD_ADD_HANDLE: 'USER_TO_CARD_ADD_HANDLE', - USER_FROM_CARD_REMOVE: 'USER_FROM_CARD_REMOVE', - USER_FROM_CARD_REMOVE__SUCCESS: 'USER_FROM_CARD_REMOVE__SUCCESS', - USER_FROM_CARD_REMOVE__FAILURE: 'USER_FROM_CARD_REMOVE__FAILURE', - USER_FROM_CARD_REMOVE_HANDLE: 'USER_FROM_CARD_REMOVE_HANDLE', - USER_TO_BOARD_FILTER_ADD: 'USER_TO_BOARD_FILTER_ADD', - USER_FROM_BOARD_FILTER_REMOVE: 'USER_FROM_BOARD_FILTER_REMOVE', - - /* Projects */ - - PROJECT_CREATE: 'PROJECT_CREATE', - PROJECT_CREATE__SUCCESS: 'PROJECT_CREATE__SUCCESS', - PROJECT_CREATE__FAILURE: 'PROJECT_CREATE__FAILURE', - PROJECT_CREATE_HANDLE: 'PROJECT_CREATE_HANDLE', - PROJECT_UPDATE: 'PROJECT_UPDATE', - PROJECT_UPDATE__SUCCESS: 'PROJECT_UPDATE__SUCCESS', - PROJECT_UPDATE__FAILURE: 'PROJECT_UPDATE__FAILURE', - PROJECT_UPDATE_HANDLE: 'PROJECT_UPDATE_HANDLE', - PROJECT_BACKGROUND_IMAGE_UPDATE: 'PROJECT_BACKGROUND_IMAGE_UPDATE', - PROJECT_BACKGROUND_IMAGE_UPDATE__SUCCESS: 'PROJECT_BACKGROUND_IMAGE_UPDATE__SUCCESS', - PROJECT_BACKGROUND_IMAGE_UPDATE__FAILURE: 'PROJECT_BACKGROUND_IMAGE_UPDATE__FAILURE', - PROJECT_DELETE: 'PROJECT_DELETE', - PROJECT_DELETE__SUCCESS: 'PROJECT_DELETE__SUCCESS', - PROJECT_DELETE__FAILURE: 'PROJECT_DELETE__FAILURE', - PROJECT_DELETE_HANDLE: 'PROJECT_DELETE_HANDLE', - - /* Project managers */ - - PROJECT_MANAGER_CREATE: 'PROJECT_MANAGER_CREATE', - PROJECT_MANAGER_CREATE__SUCCESS: 'PROJECT_MANAGER_CREATE__SUCCESS', - PROJECT_MANAGER_CREATE__FAILURE: 'PROJECT_MANAGER_CREATE__FAILURE', - PROJECT_MANAGER_CREATE_HANDLE: 'PROJECT_MANAGER_CREATE_HANDLE', - PROJECT_MANAGER_CREATE_HANDLE__PROJECT_FETCH: 'PROJECT_MANAGER_CREATE_HANDLE__PROJECT_FETCH', - PROJECT_MANAGER_DELETE: 'PROJECT_MANAGER_DELETE', - PROJECT_MANAGER_DELETE__SUCCESS: 'PROJECT_MANAGER_DELETE__SUCCESS', - PROJECT_MANAGER_DELETE__FAILURE: 'PROJECT_MANAGER_DELETE__FAILURE', - PROJECT_MANAGER_DELETE_HANDLE: 'PROJECT_MANAGER_DELETE_HANDLE', - - /* Boards */ - - BOARD_CREATE: 'BOARD_CREATE', - BOARD_CREATE__SUCCESS: 'BOARD_CREATE__SUCCESS', - BOARD_CREATE__FAILURE: 'BOARD_CREATE__FAILURE', - BOARD_CREATE_HANDLE: 'BOARD_CREATE_HANDLE', - BOARD_FETCH: 'BOARD_FETCH', - BOARD_FETCH__SUCCESS: 'BOARD_FETCH__SUCCESS', - BOARD_FETCH__FAILURE: 'BOARD_FETCH__FAILURE', - BOARD_UPDATE: 'BOARD_UPDATE', - BOARD_UPDATE__SUCCESS: 'BOARD_UPDATE__SUCCESS', - BOARD_UPDATE__FAILURE: 'BOARD_UPDATE__FAILURE', - BOARD_UPDATE_HANDLE: 'BOARD_UPDATE_HANDLE', - BOARD_DELETE: 'BOARD_DELETE', - BOARD_DELETE__SUCCESS: 'BOARD_DELETE__SUCCESS', - BOARD_DELETE__FAILURE: 'BOARD_DELETE__FAILURE', - BOARD_DELETE_HANDLE: 'BOARD_DELETE_HANDLE', - - /* Board memberships */ - - BOARD_MEMBERSHIP_CREATE: 'BOARD_MEMBERSHIP_CREATE', - BOARD_MEMBERSHIP_CREATE__SUCCESS: 'BOARD_MEMBERSHIP_CREATE__SUCCESS', - BOARD_MEMBERSHIP_CREATE__FAILURE: 'BOARD_MEMBERSHIP_CREATE__FAILURE', - BOARD_MEMBERSHIP_CREATE_HANDLE: 'BOARD_MEMBERSHIP_CREATE_HANDLE', - BOARD_MEMBERSHIP_CREATE_HANDLE__PROJECT_FETCH: 'BOARD_MEMBERSHIP_CREATE_HANDLE__PROJECT_FETCH', - BOARD_MEMBERSHIP_UPDATE: 'BOARD_MEMBERSHIP_UPDATE', - BOARD_MEMBERSHIP_UPDATE__SUCCESS: 'BOARD_MEMBERSHIP_UPDATE__SUCCESS', - BOARD_MEMBERSHIP_UPDATE__FAILURE: 'BOARD_MEMBERSHIP_UPDATE__FAILURE', - BOARD_MEMBERSHIP_UPDATE_HANDLE: 'BOARD_MEMBERSHIP_UPDATE_HANDLE', - BOARD_MEMBERSHIP_DELETE: 'BOARD_MEMBERSHIP_DELETE', - BOARD_MEMBERSHIP_DELETE__SUCCESS: 'BOARD_MEMBERSHIP_DELETE__SUCCESS', - BOARD_MEMBERSHIP_DELETE__FAILURE: 'BOARD_MEMBERSHIP_DELETE__FAILURE', - BOARD_MEMBERSHIP_DELETE_HANDLE: 'BOARD_MEMBERSHIP_DELETE_HANDLE', - - /* Labels */ - - LABEL_CREATE: 'LABEL_CREATE', - LABEL_CREATE__SUCCESS: 'LABEL_CREATE__SUCCESS', - LABEL_CREATE__FAILURE: 'LABEL_CREATE__FAILURE', - LABEL_CREATE_HANDLE: 'LABEL_CREATE_HANDLE', - LABEL_UPDATE: 'LABEL_UPDATE', - LABEL_UPDATE__SUCCESS: 'LABEL_UPDATE__SUCCESS', - LABEL_UPDATE__FAILURE: 'LABEL_UPDATE__FAILURE', - LABEL_UPDATE_HANDLE: 'LABEL_UPDATE_HANDLE', - LABEL_DELETE: 'LABEL_DELETE', - LABEL_DELETE__SUCCESS: 'LABEL_DELETE__SUCCESS', - LABEL_DELETE__FAILURE: 'LABEL_DELETE__FAILURE', - LABEL_DELETE_HANDLE: 'LABEL_DELETE_HANDLE', - LABEL_TO_CARD_ADD: 'LABEL_TO_CARD_ADD', - LABEL_TO_CARD_ADD__SUCCESS: 'LABEL_TO_CARD_ADD__SUCCESS', - LABEL_TO_CARD_ADD__FAILURE: 'LABEL_TO_CARD_ADD__FAILURE', - LABEL_TO_CARD_ADD_HANDLE: 'LABEL_TO_CARD_ADD_HANDLE', - LABEL_FROM_CARD_REMOVE: 'LABEL_FROM_CARD_REMOVE', - LABEL_FROM_CARD_REMOVE__SUCCESS: 'LABEL_FROM_CARD_REMOVE__SUCCESS', - LABEL_FROM_CARD_REMOVE__FAILURE: 'LABEL_FROM_CARD_REMOVE__FAILURE', - LABEL_FROM_CARD_REMOVE_HANDLE: 'LABEL_FROM_CARD_REMOVE_HANDLE', - LABEL_TO_BOARD_FILTER_ADD: 'LABEL_TO_BOARD_FILTER_ADD', - LABEL_FROM_BOARD_FILTER_REMOVE: 'LABEL_FROM_BOARD_FILTER_REMOVE', - - /* Lists */ - - LIST_CREATE: 'LIST_CREATE', - LIST_CREATE__SUCCESS: 'LIST_CREATE__SUCCESS', - LIST_CREATE__FAILURE: 'LIST_CREATE__FAILURE', - LIST_CREATE_HANDLE: 'LIST_CREATE_HANDLE', - LIST_UPDATE: 'LIST_UPDATE', - LIST_UPDATE__SUCCESS: 'LIST_UPDATE__SUCCESS', - LIST_UPDATE__FAILURE: 'LIST_UPDATE__FAILURE', - LIST_UPDATE_HANDLE: 'LIST_UPDATE_HANDLE', - LIST_DELETE: 'LIST_DELETE', - LIST_DELETE__SUCCESS: 'LIST_DELETE__SUCCESS', - LIST_DELETE__FAILURE: 'LIST_DELETE__FAILURE', - LIST_DELETE_HANDLE: 'LIST_DELETE_HANDLE', - - /* Cards */ - - CARD_CREATE: 'CARD_CREATE', - CARD_CREATE__SUCCESS: 'CARD_CREATE__SUCCESS', - CARD_CREATE__FAILURE: 'CARD_CREATE__FAILURE', - CARD_CREATE_HANDLE: 'CARD_CREATE_HANDLE', - CARD_FETCH: 'CARD_FETCH', - CARD_FETCH__SUCCESS: 'CARD_FETCH__SUCCESS', - CARD_FETCH__FAILURE: 'CARD_FETCH__FAILURE', - CARD_UPDATE: 'CARD_UPDATE', - CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS', - CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE', - CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE', - CARD_TRANSFER: 'CARD_TRANSFER', - CARD_TRANSFER__SUCCESS: 'CARD_TRANSFER__SUCCESS', - CARD_TRANSFER__FAILURE: 'CARD_TRANSFER__FAILURE', - CARD_DUPLICATE: 'CARD_DUPLICATE', - CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS', - CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE', - CARD_DELETE: 'CARD_DELETE', - CARD_DELETE__SUCCESS: 'CARD_DELETE__SUCCESS', - CARD_DELETE__FAILURE: 'CARD_DELETE__FAILURE', - CARD_DELETE_HANDLE: 'CARD_DELETE_HANDLE', - - /* Tasks */ - - TASK_CREATE: 'TASK_CREATE', - TASK_CREATE__SUCCESS: 'TASK_CREATE__SUCCESS', - TASK_CREATE__FAILURE: 'TASK_CREATE__FAILURE', - TASK_CREATE_HANDLE: 'TASK_CREATE_HANDLE', - TASK_UPDATE: 'TASK_UPDATE', - TASK_UPDATE__SUCCESS: 'TASK_UPDATE__SUCCESS', - TASK_UPDATE__FAILURE: 'TASK_UPDATE__FAILURE', - TASK_UPDATE_HANDLE: 'TASK_UPDATE_HANDLE', - TASK_DELETE: 'TASK_DELETE', - TASK_DELETE__SUCCESS: 'TASK_DELETE__SUCCESS', - TASK_DELETE__FAILURE: 'TASK_DELETE__FAILURE', - TASK_DELETE_HANDLE: 'TASK_DELETE_HANDLE', - - /* Attachments */ - - ATTACHMENT_CREATE: 'ATTACHMENT_CREATE', - ATTACHMENT_CREATE__SUCCESS: 'ATTACHMENT_CREATE__SUCCESS', - ATTACHMENT_CREATE__FAILURE: 'ATTACHMENT_CREATE__FAILURE', - ATTACHMENT_CREATE_HANDLE: 'ATTACHMENT_CREATE_HANDLE', - ATTACHMENT_UPDATE: 'ATTACHMENT_UPDATE', - ATTACHMENT_UPDATE__SUCCESS: 'ATTACHMENT_UPDATE__SUCCESS', - ATTACHMENT_UPDATE__FAILURE: 'ATTACHMENT_UPDATE__FAILURE', - ATTACHMENT_UPDATE_HANDLE: 'ATTACHMENT_UPDATE_HANDLE', - ATTACHMENT_DELETE: 'ATTACHMENT_DELETE', - ATTACHMENT_DELETE__SUCCESS: 'ATTACHMENT_DELETE__SUCCESS', - ATTACHMENT_DELETE__FAILURE: 'ATTACHMENT_DELETE__FAILURE', - ATTACHMENT_DELETE_HANDLE: 'ATTACHMENT_DELETE_HANDLE', - - /* Activities */ - - ACTIVITIES_FETCH: 'ACTIVITIES_FETCH', - ACTIVITIES_FETCH__SUCCESS: 'ACTIVITIES_FETCH__SUCCESS', - ACTIVITIES_FETCH__FAILURE: 'ACTIVITIES_FETCH__FAILURE', - ACTIVITIES_DETAILS_TOGGLE: 'ACTIVITIES_DETAILS_TOGGLE', - ACTIVITIES_DETAILS_TOGGLE__SUCCESS: 'ACTIVITIES_DETAILS_TOGGLE__SUCCESS', - ACTIVITIES_DETAILS_TOGGLE__FAILURE: 'ACTIVITIES_DETAILS_TOGGLE__FAILURE', - ACTIVITY_CREATE_HANDLE: 'ACTIVITY_CREATE_HANDLE', - ACTIVITY_UPDATE_HANDLE: 'ACTIVITY_UPDATE_HANDLE', - ACTIVITY_DELETE_HANDLE: 'ACTIVITY_DELETE_HANDLE', - - /* Comment activities */ - - COMMENT_ACTIVITY_CREATE: 'COMMENT_ACTIVITY_CREATE', - COMMENT_ACTIVITY_CREATE__SUCCESS: 'COMMENT_ACTIVITY_CREATE__SUCCESS', - COMMENT_ACTIVITY_CREATE__FAILURE: 'COMMENT_ACTIVITY_CREATE__FAILURE', - COMMENT_ACTIVITY_UPDATE: 'COMMENT_ACTIVITY_UPDATE', - COMMENT_ACTIVITY_UPDATE__SUCCESS: 'COMMENT_ACTIVITY_UPDATE__SUCCESS', - COMMENT_ACTIVITY_UPDATE__FAILURE: 'COMMENT_ACTIVITY_UPDATE__FAILURE', - COMMENT_ACTIVITY_DELETE: 'COMMENT_ACTIVITY_DELETE', - COMMENT_ACTIVITY_DELETE__SUCCESS: 'COMMENT_ACTIVITY_DELETE__SUCCESS', - COMMENT_ACTIVITY_DELETE__FAILURE: 'COMMENT_ACTIVITY_DELETE__FAILURE', - - /* Notifications */ - - NOTIFICATION_CREATE_HANDLE: 'NOTIFICATION_CREATE_HANDLE', - NOTIFICATION_DELETE: 'NOTIFICATION_DELETE', - NOTIFICATION_DELETE__SUCCESS: 'NOTIFICATION_DELETE__SUCCESS', - NOTIFICATION_DELETE__FAILURE: 'NOTIFICATION_DELETE__FAILURE', - NOTIFICATION_DELETE_HANDLE: 'NOTIFICATION_DELETE_HANDLE', -}; +export default { + /* Router */ + + LOCATION_CHANGE_HANDLE: 'LOCATION_CHANGE_HANDLE', + LOCATION_CHANGE_HANDLE__BOARD_FETCH: 'LOCATION_CHANGE_HANDLE__BOARD_FETCH', + + /* Socket */ + + SOCKET_DISCONNECT_HANDLE: 'SOCKET_DISCONNECT_HANDLE', + SOCKET_RECONNECT_HANDLE: 'SOCKET_RECONNECT_HANDLE', + SOCKET_RECONNECT_HANDLE__CORE_FETCH: 'SOCKET_RECONNECT_HANDLE__CORE_FETCH', + + /* Login */ + + LOGIN_INITIALIZE: 'LOGIN_INITIALIZE', + AUTHENTICATE: 'AUTHENTICATE', + AUTHENTICATE__SUCCESS: 'AUTHENTICATE__SUCCESS', + AUTHENTICATE__FAILURE: 'AUTHENTICATE__FAILURE', + USING_OIDC_AUTHENTICATE: 'USING_OIDC_AUTHENTICATE', + USING_OIDC_AUTHENTICATE__SUCCESS: 'USING_OIDC_AUTHENTICATE__SUCCESS', + USING_OIDC_AUTHENTICATE__FAILURE: 'USING_OIDC_AUTHENTICATE__FAILURE', + AUTHENTICATE_ERROR_CLEAR: 'AUTHENTICATE_ERROR_CLEAR', + + /* Core */ + + CORE_INITIALIZE: 'CORE_INITIALIZE', + CORE_INITIALIZE__CONFIG_FETCH: 'CORE_INITIALIZE__CONFIG_FETCH', + LOGOUT: 'LOGOUT', + LOGOUT__ACCESS_TOKEN_INVALIDATE: 'LOGOUT__ACCESS_TOKEN_INVALIDATE', + + /* Modals */ + + MODAL_OPEN: 'MODAL_OPEN', + MODAL_CLOSE: 'MODAL_CLOSE', + + /* Users */ + + USER_CREATE: 'USER_CREATE', + USER_CREATE__SUCCESS: 'USER_CREATE__SUCCESS', + USER_CREATE__FAILURE: 'USER_CREATE__FAILURE', + USER_CREATE_HANDLE: 'USER_CREATE_HANDLE', + USER_CREATE_ERROR_CLEAR: 'USER_CREATE_ERROR_CLEAR', + USER_UPDATE: 'USER_UPDATE', + USER_UPDATE__SUCCESS: 'USER_UPDATE__SUCCESS', + USER_UPDATE__FAILURE: 'USER_UPDATE__FAILURE', + USER_UPDATE_HANDLE: 'USER_UPDATE_HANDLE', + USER_EMAIL_UPDATE: 'USER_EMAIL_UPDATE', + USER_EMAIL_UPDATE__SUCCESS: 'USER_EMAIL_UPDATE__SUCCESS', + USER_EMAIL_UPDATE__FAILURE: 'USER_EMAIL_UPDATE__FAILURE', + USER_EMAIL_UPDATE_ERROR_CLEAR: 'USER_EMAIL_UPDATE_ERROR_CLEAR', + USER_PASSWORD_UPDATE: 'USER_PASSWORD_UPDATE', + USER_PASSWORD_UPDATE__SUCCESS: 'USER_PASSWORD_UPDATE__SUCCESS', + USER_PASSWORD_UPDATE__FAILURE: 'USER_PASSWORD_UPDATE__FAILURE', + USER_PASSWORD_UPDATE_ERROR_CLEAR: 'USER_PASSWORD_UPDATE_ERROR_CLEAR', + USER_USERNAME_UPDATE: 'USER_USERNAME_UPDATE', + USER_USERNAME_UPDATE__SUCCESS: 'USER_USERNAME_UPDATE__SUCCESS', + USER_USERNAME_UPDATE__FAILURE: 'USER_USERNAME_UPDATE__FAILURE', + USER_USERNAME_UPDATE_ERROR_CLEAR: 'USER_USERNAME_UPDATE_ERROR_CLEAR', + USER_AVATAR_UPDATE: 'USER_AVATAR_UPDATE', + USER_AVATAR_UPDATE__SUCCESS: 'USER_AVATAR_UPDATE__SUCCESS', + USER_AVATAR_UPDATE__FAILURE: 'USER_AVATAR_UPDATE__FAILURE', + USER_DELETE: 'USER_DELETE', + USER_DELETE__SUCCESS: 'USER_DELETE__SUCCESS', + USER_DELETE__FAILURE: 'USER_DELETE__FAILURE', + USER_DELETE_HANDLE: 'USER_DELETE_HANDLE', + USER_TO_CARD_ADD: 'USER_TO_CARD_ADD', + USER_TO_CARD_ADD__SUCCESS: 'USER_TO_CARD_ADD__SUCCESS', + USER_TO_CARD_ADD__FAILURE: 'USER_TO_CARD_ADD__FAILURE', + USER_TO_CARD_ADD_HANDLE: 'USER_TO_CARD_ADD_HANDLE', + USER_FROM_CARD_REMOVE: 'USER_FROM_CARD_REMOVE', + USER_FROM_CARD_REMOVE__SUCCESS: 'USER_FROM_CARD_REMOVE__SUCCESS', + USER_FROM_CARD_REMOVE__FAILURE: 'USER_FROM_CARD_REMOVE__FAILURE', + USER_FROM_CARD_REMOVE_HANDLE: 'USER_FROM_CARD_REMOVE_HANDLE', + USER_TO_BOARD_FILTER_ADD: 'USER_TO_BOARD_FILTER_ADD', + USER_FROM_BOARD_FILTER_REMOVE: 'USER_FROM_BOARD_FILTER_REMOVE', + + /* Projects */ + + PROJECT_CREATE: 'PROJECT_CREATE', + PROJECT_CREATE__SUCCESS: 'PROJECT_CREATE__SUCCESS', + PROJECT_CREATE__FAILURE: 'PROJECT_CREATE__FAILURE', + PROJECT_CREATE_HANDLE: 'PROJECT_CREATE_HANDLE', + PROJECT_UPDATE: 'PROJECT_UPDATE', + PROJECT_UPDATE__SUCCESS: 'PROJECT_UPDATE__SUCCESS', + PROJECT_UPDATE__FAILURE: 'PROJECT_UPDATE__FAILURE', + PROJECT_UPDATE_HANDLE: 'PROJECT_UPDATE_HANDLE', + PROJECT_BACKGROUND_IMAGE_UPDATE: 'PROJECT_BACKGROUND_IMAGE_UPDATE', + PROJECT_BACKGROUND_IMAGE_UPDATE__SUCCESS: 'PROJECT_BACKGROUND_IMAGE_UPDATE__SUCCESS', + PROJECT_BACKGROUND_IMAGE_UPDATE__FAILURE: 'PROJECT_BACKGROUND_IMAGE_UPDATE__FAILURE', + PROJECT_DELETE: 'PROJECT_DELETE', + PROJECT_DELETE__SUCCESS: 'PROJECT_DELETE__SUCCESS', + PROJECT_DELETE__FAILURE: 'PROJECT_DELETE__FAILURE', + PROJECT_DELETE_HANDLE: 'PROJECT_DELETE_HANDLE', + + /* Project managers */ + + PROJECT_MANAGER_CREATE: 'PROJECT_MANAGER_CREATE', + PROJECT_MANAGER_CREATE__SUCCESS: 'PROJECT_MANAGER_CREATE__SUCCESS', + PROJECT_MANAGER_CREATE__FAILURE: 'PROJECT_MANAGER_CREATE__FAILURE', + PROJECT_MANAGER_CREATE_HANDLE: 'PROJECT_MANAGER_CREATE_HANDLE', + PROJECT_MANAGER_CREATE_HANDLE__PROJECT_FETCH: 'PROJECT_MANAGER_CREATE_HANDLE__PROJECT_FETCH', + PROJECT_MANAGER_DELETE: 'PROJECT_MANAGER_DELETE', + PROJECT_MANAGER_DELETE__SUCCESS: 'PROJECT_MANAGER_DELETE__SUCCESS', + PROJECT_MANAGER_DELETE__FAILURE: 'PROJECT_MANAGER_DELETE__FAILURE', + PROJECT_MANAGER_DELETE_HANDLE: 'PROJECT_MANAGER_DELETE_HANDLE', + + /* Boards */ + + BOARD_CREATE: 'BOARD_CREATE', + BOARD_CREATE__SUCCESS: 'BOARD_CREATE__SUCCESS', + BOARD_CREATE__FAILURE: 'BOARD_CREATE__FAILURE', + BOARD_CREATE_HANDLE: 'BOARD_CREATE_HANDLE', + BOARD_FETCH: 'BOARD_FETCH', + BOARD_FETCH__SUCCESS: 'BOARD_FETCH__SUCCESS', + BOARD_FETCH__FAILURE: 'BOARD_FETCH__FAILURE', + BOARD_UPDATE: 'BOARD_UPDATE', + BOARD_UPDATE__SUCCESS: 'BOARD_UPDATE__SUCCESS', + BOARD_UPDATE__FAILURE: 'BOARD_UPDATE__FAILURE', + BOARD_UPDATE_HANDLE: 'BOARD_UPDATE_HANDLE', + BOARD_DELETE: 'BOARD_DELETE', + BOARD_DELETE__SUCCESS: 'BOARD_DELETE__SUCCESS', + BOARD_DELETE__FAILURE: 'BOARD_DELETE__FAILURE', + BOARD_DELETE_HANDLE: 'BOARD_DELETE_HANDLE', + + /* Board memberships */ + + BOARD_MEMBERSHIP_CREATE: 'BOARD_MEMBERSHIP_CREATE', + BOARD_MEMBERSHIP_CREATE__SUCCESS: 'BOARD_MEMBERSHIP_CREATE__SUCCESS', + BOARD_MEMBERSHIP_CREATE__FAILURE: 'BOARD_MEMBERSHIP_CREATE__FAILURE', + BOARD_MEMBERSHIP_CREATE_HANDLE: 'BOARD_MEMBERSHIP_CREATE_HANDLE', + BOARD_MEMBERSHIP_CREATE_HANDLE__PROJECT_FETCH: 'BOARD_MEMBERSHIP_CREATE_HANDLE__PROJECT_FETCH', + BOARD_MEMBERSHIP_UPDATE: 'BOARD_MEMBERSHIP_UPDATE', + BOARD_MEMBERSHIP_UPDATE__SUCCESS: 'BOARD_MEMBERSHIP_UPDATE__SUCCESS', + BOARD_MEMBERSHIP_UPDATE__FAILURE: 'BOARD_MEMBERSHIP_UPDATE__FAILURE', + BOARD_MEMBERSHIP_UPDATE_HANDLE: 'BOARD_MEMBERSHIP_UPDATE_HANDLE', + BOARD_MEMBERSHIP_DELETE: 'BOARD_MEMBERSHIP_DELETE', + BOARD_MEMBERSHIP_DELETE__SUCCESS: 'BOARD_MEMBERSHIP_DELETE__SUCCESS', + BOARD_MEMBERSHIP_DELETE__FAILURE: 'BOARD_MEMBERSHIP_DELETE__FAILURE', + BOARD_MEMBERSHIP_DELETE_HANDLE: 'BOARD_MEMBERSHIP_DELETE_HANDLE', + + /* Labels */ + + LABEL_CREATE: 'LABEL_CREATE', + LABEL_CREATE__SUCCESS: 'LABEL_CREATE__SUCCESS', + LABEL_CREATE__FAILURE: 'LABEL_CREATE__FAILURE', + LABEL_CREATE_HANDLE: 'LABEL_CREATE_HANDLE', + LABEL_UPDATE: 'LABEL_UPDATE', + LABEL_UPDATE__SUCCESS: 'LABEL_UPDATE__SUCCESS', + LABEL_UPDATE__FAILURE: 'LABEL_UPDATE__FAILURE', + LABEL_UPDATE_HANDLE: 'LABEL_UPDATE_HANDLE', + LABEL_DELETE: 'LABEL_DELETE', + LABEL_DELETE__SUCCESS: 'LABEL_DELETE__SUCCESS', + LABEL_DELETE__FAILURE: 'LABEL_DELETE__FAILURE', + LABEL_DELETE_HANDLE: 'LABEL_DELETE_HANDLE', + LABEL_TO_CARD_ADD: 'LABEL_TO_CARD_ADD', + LABEL_TO_CARD_ADD__SUCCESS: 'LABEL_TO_CARD_ADD__SUCCESS', + LABEL_TO_CARD_ADD__FAILURE: 'LABEL_TO_CARD_ADD__FAILURE', + LABEL_TO_CARD_ADD_HANDLE: 'LABEL_TO_CARD_ADD_HANDLE', + LABEL_FROM_CARD_REMOVE: 'LABEL_FROM_CARD_REMOVE', + LABEL_FROM_CARD_REMOVE__SUCCESS: 'LABEL_FROM_CARD_REMOVE__SUCCESS', + LABEL_FROM_CARD_REMOVE__FAILURE: 'LABEL_FROM_CARD_REMOVE__FAILURE', + LABEL_FROM_CARD_REMOVE_HANDLE: 'LABEL_FROM_CARD_REMOVE_HANDLE', + LABEL_TO_BOARD_FILTER_ADD: 'LABEL_TO_BOARD_FILTER_ADD', + LABEL_FROM_BOARD_FILTER_REMOVE: 'LABEL_FROM_BOARD_FILTER_REMOVE', + + /* Lists */ + + LIST_CREATE: 'LIST_CREATE', + LIST_CREATE__SUCCESS: 'LIST_CREATE__SUCCESS', + LIST_CREATE__FAILURE: 'LIST_CREATE__FAILURE', + LIST_CREATE_HANDLE: 'LIST_CREATE_HANDLE', + LIST_UPDATE: 'LIST_UPDATE', + LIST_UPDATE__SUCCESS: 'LIST_UPDATE__SUCCESS', + LIST_UPDATE__FAILURE: 'LIST_UPDATE__FAILURE', + LIST_UPDATE_HANDLE: 'LIST_UPDATE_HANDLE', + LIST_DELETE: 'LIST_DELETE', + LIST_DELETE__SUCCESS: 'LIST_DELETE__SUCCESS', + LIST_DELETE__FAILURE: 'LIST_DELETE__FAILURE', + LIST_DELETE_HANDLE: 'LIST_DELETE_HANDLE', + + /* Cards */ + + CARD_CREATE: 'CARD_CREATE', + CARD_CREATE__SUCCESS: 'CARD_CREATE__SUCCESS', + CARD_CREATE__FAILURE: 'CARD_CREATE__FAILURE', + CARD_CREATE_HANDLE: 'CARD_CREATE_HANDLE', + CARD_FETCH: 'CARD_FETCH', + CARD_FETCH__SUCCESS: 'CARD_FETCH__SUCCESS', + CARD_FETCH__FAILURE: 'CARD_FETCH__FAILURE', + CARD_UPDATE: 'CARD_UPDATE', + CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS', + CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE', + CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE', + CARD_TRANSFER: 'CARD_TRANSFER', + CARD_TRANSFER__SUCCESS: 'CARD_TRANSFER__SUCCESS', + CARD_TRANSFER__FAILURE: 'CARD_TRANSFER__FAILURE', + CARD_DUPLICATE: 'CARD_DUPLICATE', + CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS', + CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE', + CARD_DELETE: 'CARD_DELETE', + CARD_DELETE__SUCCESS: 'CARD_DELETE__SUCCESS', + CARD_DELETE__FAILURE: 'CARD_DELETE__FAILURE', + CARD_DELETE_HANDLE: 'CARD_DELETE_HANDLE', + + /* Tasks */ + + TASK_CREATE: 'TASK_CREATE', + TASK_CREATE__SUCCESS: 'TASK_CREATE__SUCCESS', + TASK_CREATE__FAILURE: 'TASK_CREATE__FAILURE', + TASK_CREATE_HANDLE: 'TASK_CREATE_HANDLE', + TASK_UPDATE: 'TASK_UPDATE', + TASK_UPDATE__SUCCESS: 'TASK_UPDATE__SUCCESS', + TASK_UPDATE__FAILURE: 'TASK_UPDATE__FAILURE', + TASK_UPDATE_HANDLE: 'TASK_UPDATE_HANDLE', + TASK_DELETE: 'TASK_DELETE', + TASK_DELETE__SUCCESS: 'TASK_DELETE__SUCCESS', + TASK_DELETE__FAILURE: 'TASK_DELETE__FAILURE', + TASK_DELETE_HANDLE: 'TASK_DELETE_HANDLE', + + /* Attachments */ + + ATTACHMENT_CREATE: 'ATTACHMENT_CREATE', + ATTACHMENT_CREATE__SUCCESS: 'ATTACHMENT_CREATE__SUCCESS', + ATTACHMENT_CREATE__FAILURE: 'ATTACHMENT_CREATE__FAILURE', + ATTACHMENT_CREATE_HANDLE: 'ATTACHMENT_CREATE_HANDLE', + ATTACHMENT_UPDATE: 'ATTACHMENT_UPDATE', + ATTACHMENT_UPDATE__SUCCESS: 'ATTACHMENT_UPDATE__SUCCESS', + ATTACHMENT_UPDATE__FAILURE: 'ATTACHMENT_UPDATE__FAILURE', + ATTACHMENT_UPDATE_HANDLE: 'ATTACHMENT_UPDATE_HANDLE', + ATTACHMENT_DELETE: 'ATTACHMENT_DELETE', + ATTACHMENT_DELETE__SUCCESS: 'ATTACHMENT_DELETE__SUCCESS', + ATTACHMENT_DELETE__FAILURE: 'ATTACHMENT_DELETE__FAILURE', + ATTACHMENT_DELETE_HANDLE: 'ATTACHMENT_DELETE_HANDLE', + + /* Activities */ + + ACTIVITIES_FETCH: 'ACTIVITIES_FETCH', + ACTIVITIES_FETCH__SUCCESS: 'ACTIVITIES_FETCH__SUCCESS', + ACTIVITIES_FETCH__FAILURE: 'ACTIVITIES_FETCH__FAILURE', + ACTIVITIES_DETAILS_TOGGLE: 'ACTIVITIES_DETAILS_TOGGLE', + ACTIVITIES_DETAILS_TOGGLE__SUCCESS: 'ACTIVITIES_DETAILS_TOGGLE__SUCCESS', + ACTIVITIES_DETAILS_TOGGLE__FAILURE: 'ACTIVITIES_DETAILS_TOGGLE__FAILURE', + ACTIVITY_CREATE_HANDLE: 'ACTIVITY_CREATE_HANDLE', + ACTIVITY_UPDATE_HANDLE: 'ACTIVITY_UPDATE_HANDLE', + ACTIVITY_DELETE_HANDLE: 'ACTIVITY_DELETE_HANDLE', + + /* Comment activities */ + + COMMENT_ACTIVITY_CREATE: 'COMMENT_ACTIVITY_CREATE', + COMMENT_ACTIVITY_CREATE__SUCCESS: 'COMMENT_ACTIVITY_CREATE__SUCCESS', + COMMENT_ACTIVITY_CREATE__FAILURE: 'COMMENT_ACTIVITY_CREATE__FAILURE', + COMMENT_ACTIVITY_UPDATE: 'COMMENT_ACTIVITY_UPDATE', + COMMENT_ACTIVITY_UPDATE__SUCCESS: 'COMMENT_ACTIVITY_UPDATE__SUCCESS', + COMMENT_ACTIVITY_UPDATE__FAILURE: 'COMMENT_ACTIVITY_UPDATE__FAILURE', + COMMENT_ACTIVITY_DELETE: 'COMMENT_ACTIVITY_DELETE', + COMMENT_ACTIVITY_DELETE__SUCCESS: 'COMMENT_ACTIVITY_DELETE__SUCCESS', + COMMENT_ACTIVITY_DELETE__FAILURE: 'COMMENT_ACTIVITY_DELETE__FAILURE', + + /* Notifications */ + + NOTIFICATION_CREATE_HANDLE: 'NOTIFICATION_CREATE_HANDLE', + NOTIFICATION_DELETE: 'NOTIFICATION_DELETE', + NOTIFICATION_DELETE__SUCCESS: 'NOTIFICATION_DELETE__SUCCESS', + NOTIFICATION_DELETE__FAILURE: 'NOTIFICATION_DELETE__FAILURE', + NOTIFICATION_DELETE_HANDLE: 'NOTIFICATION_DELETE_HANDLE', +}; diff --git a/client/src/constants/EntryActionTypes.js b/client/src/constants/EntryActionTypes.js index 9cd0694..ed1425e 100755 --- a/client/src/constants/EntryActionTypes.js +++ b/client/src/constants/EntryActionTypes.js @@ -1,179 +1,179 @@ -const PREFIX = '@entry'; - -export default { - PREFIX, - - /* Socket */ - - SOCKET_DISCONNECT_HANDLE: `${PREFIX}/SOCKET_DISCONNECT_HANDLE`, - SOCKET_RECONNECT_HANDLE: `${PREFIX}/SOCKET_RECONNECT_HANDLE`, - - /* Login */ - - AUTHENTICATE: `${PREFIX}/AUTHENTICATE`, - USING_OIDC_AUTHENTICATE: `${PREFIX}/USING_OIDC_AUTHENTICATE`, - AUTHENTICATE_ERROR_CLEAR: `${PREFIX}/AUTHENTICATE_ERROR_CLEAR`, - - /* Core */ - - LOGOUT: `${PREFIX}/LOGOUT`, - - /* Modals */ - - MODAL_OPEN: `${PREFIX}/MODAL_OPEN`, - MODAL_CLOSE: `${PREFIX}/MODAL_CLOSE`, - - /* Users */ - - USER_CREATE: `${PREFIX}/USER_CREATE`, - USER_CREATE_HANDLE: `${PREFIX}/USER_CREATE_HANDLE`, - USER_CREATE_ERROR_CLEAR: `${PREFIX}/USER_CREATE_ERROR_CLEAR`, - USER_UPDATE: `${PREFIX}/USER_UPDATE`, - CURRENT_USER_UPDATE: `${PREFIX}/CURRENT_USER_UPDATE`, - USER_UPDATE_HANDLE: `${PREFIX}/USER_UPDATE_HANDLE`, - CURRENT_USER_LANGUAGE_UPDATE: `${PREFIX}/CURRENT_USER_LANGUAGE_UPDATE`, - USER_EMAIL_UPDATE: `${PREFIX}/USER_EMAIL_UPDATE`, - CURRENT_USER_EMAIL_UPDATE: `${PREFIX}/CURRENT_USER_EMAIL_UPDATE`, - USER_EMAIL_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_EMAIL_UPDATE_ERROR_CLEAR`, - CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR`, - USER_PASSWORD_UPDATE: `${PREFIX}/USER_PASSWORD_UPDATE`, - CURRENT_USER_PASSWORD_UPDATE: `${PREFIX}/CURRENT_USER_PASSWORD_UPDATE`, - USER_PASSWORD_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_PASSWORD_UPDATE_ERROR_CLEAR`, - CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR`, - USER_USERNAME_UPDATE: `${PREFIX}/USER_USERNAME_UPDATE`, - CURRENT_USER_USERNAME_UPDATE: `${PREFIX}/CURRENT_USER_USERNAME_UPDATE`, - USER_USERNAME_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_USERNAME_UPDATE_ERROR_CLEAR`, - CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR`, - CURRENT_USER_AVATAR_UPDATE: `${PREFIX}/CURRENT_USER_AVATAR_UPDATE`, - USER_DELETE: `${PREFIX}/USER_DELETE`, - USER_DELETE_HANDLE: `${PREFIX}/USER_DELETE_HANDLE`, - USER_TO_CARD_ADD: `${PREFIX}/USER_TO_CARD_ADD`, - USER_TO_CURRENT_CARD_ADD: `${PREFIX}/USER_TO_CURRENT_CARD_ADD`, - USER_TO_CARD_ADD_HANDLE: `${PREFIX}/USER_TO_CARD_ADD_HANDLE`, - USER_FROM_CARD_REMOVE: `${PREFIX}/USER_FROM_CARD_REMOVE`, - USER_FROM_CURRENT_CARD_REMOVE: `${PREFIX}/USER_FROM_CURRENT_CARD_REMOVE`, - USER_FROM_CARD_REMOVE_HANDLE: `${PREFIX}/USER_FROM_CARD_REMOVE_HANDLE`, - USER_TO_FILTER_IN_CURRENT_BOARD_ADD: `${PREFIX}/USER_TO_FILTER_IN_CURRENT_BOARD_ADD`, - USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE: `${PREFIX}/USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE`, - - /* Projects */ - - PROJECT_CREATE: `${PREFIX}/PROJECT_CREATE`, - PROJECT_CREATE_HANDLE: `${PREFIX}/PROJECT_CREATE_HANDLE`, - CURRENT_PROJECT_UPDATE: `${PREFIX}/CURRENT_PROJECT_UPDATE`, - PROJECT_UPDATE_HANDLE: `${PREFIX}/PROJECT_UPDATE_HANDLE`, - CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE: `${PREFIX}/CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE`, - CURRENT_PROJECT_DELETE: `${PREFIX}/CURRENT_PROJECT_DELETE`, - PROJECT_DELETE_HANDLE: `${PREFIX}/PROJECT_DELETE_HANDLE`, - - /* Project managers */ - - MANAGER_IN_CURRENT_PROJECT_CREATE: `${PREFIX}/MANAGER_IN_CURRENT_PROJECT_CREATE`, - PROJECT_MANAGER_CREATE_HANDLE: `${PREFIX}/PROJECT_MANAGER_CREATE_HANDLE`, - PROJECT_MANAGER_DELETE: `${PREFIX}/PROJECT_MANAGER_DELETE`, - PROJECT_MANAGER_DELETE_HANDLE: `${PREFIX}/PROJECT_MANAGER_DELETE_HANDLE`, - - /* Boards */ - - BOARD_IN_CURRENT_PROJECT_CREATE: `${PREFIX}/BOARD_IN_CURRENT_PROJECT_CREATE`, - BOARD_CREATE_HANDLE: `${PREFIX}/BOARD_CREATE_HANDLE`, - BOARD_FETCH: `${PREFIX}/BOARD_FETCH`, - BOARD_UPDATE: `${PREFIX}/BOARD_UPDATE`, - BOARD_UPDATE_HANDLE: `${PREFIX}/BOARD_UPDATE_HANDLE`, - BOARD_MOVE: `${PREFIX}/BOARD_MOVE`, - BOARD_DELETE: `${PREFIX}/BOARD_DELETE`, - BOARD_DELETE_HANDLE: `${PREFIX}/BOARD_DELETE_HANDLE`, - - /* Board memberships */ - - MEMBERSHIP_IN_CURRENT_BOARD_CREATE: `${PREFIX}/MEMBERSHIP_IN_CURRENT_BOARD_CREATE`, - BOARD_MEMBERSHIP_CREATE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_CREATE_HANDLE`, - BOARD_MEMBERSHIP_UPDATE: `${PREFIX}/BOARD_MEMBERSHIP_UPDATE`, - BOARD_MEMBERSHIP_UPDATE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_UPDATE_HANDLE`, - BOARD_MEMBERSHIP_DELETE: `${PREFIX}/BOARD_MEMBERSHIP_DELETE`, - BOARD_MEMBERSHIP_DELETE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_DELETE_HANDLE`, - - /* Labels */ - - LABEL_IN_CURRENT_BOARD_CREATE: `${PREFIX}/LABEL_IN_CURRENT_BOARD_CREATE`, - LABEL_CREATE_HANDLE: `${PREFIX}/LABEL_CREATE_HANDLE`, - LABEL_UPDATE: `${PREFIX}/LABEL_UPDATE`, - LABEL_UPDATE_HANDLE: `${PREFIX}/LABEL_UPDATE_HANDLE`, - LABEL_MOVE: `${PREFIX}/LABEL_MOVE`, - LABEL_DELETE: `${PREFIX}/LABEL_DELETE`, - LABEL_DELETE_HANDLE: `${PREFIX}/LABEL_DELETE_HANDLE`, - LABEL_TO_CARD_ADD: `${PREFIX}/LABEL_TO_CARD_ADD`, - LABEL_TO_CURRENT_CARD_ADD: `${PREFIX}/LABEL_TO_CURRENT_CARD_ADD`, - LABEL_TO_CARD_ADD_HANDLE: `${PREFIX}/LABEL_TO_CARD_ADD_HANDLE`, - LABEL_FROM_CARD_REMOVE: `${PREFIX}/LABEL_FROM_CARD_REMOVE`, - LABEL_FROM_CURRENT_CARD_REMOVE: `${PREFIX}/LABEL_FROM_CURRENT_CARD_REMOVE`, - LABEL_FROM_CARD_REMOVE_HANDLE: `${PREFIX}/LABEL_FROM_CARD_REMOVE_HANDLE`, - LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD: `${PREFIX}/LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD`, - LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE: `${PREFIX}/LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE`, - - /* Lists */ - - LIST_IN_CURRENT_BOARD_CREATE: `${PREFIX}/LIST_IN_CURRENT_BOARD_CREATE`, - LIST_CREATE_HANDLE: `${PREFIX}/LIST_CREATE_HANDLE`, - LIST_UPDATE: `${PREFIX}/LIST_UPDATE`, - LIST_UPDATE_HANDLE: `${PREFIX}/LIST_UPDATE_HANDLE`, - LIST_MOVE: `${PREFIX}/LIST_MOVE`, - LIST_DELETE: `${PREFIX}/LIST_DELETE`, - LIST_DELETE_HANDLE: `${PREFIX}/LIST_DELETE_HANDLE`, - - /* Cards */ - - CARD_CREATE: `${PREFIX}/CARD_CREATE`, - CARD_CREATE_HANDLE: `${PREFIX}/CARD_CREATE_HANDLE`, - CARD_UPDATE: `${PREFIX}/CARD_UPDATE`, - CURRENT_CARD_UPDATE: `${PREFIX}/CURRENT_CARD_UPDATE`, - CARD_UPDATE_HANDLE: `${PREFIX}/CARD_UPDATE_HANDLE`, - CARD_MOVE: `${PREFIX}/CARD_MOVE`, - CURRENT_CARD_MOVE: `${PREFIX}/CURRENT_CARD_MOVE`, - CARD_TRANSFER: `${PREFIX}/CARD_TRANSFER`, - CURRENT_CARD_TRANSFER: `${PREFIX}/CURRENT_CARD_TRANSFER`, - CARD_DUPLICATE: `${PREFIX}/CARD_DUPLICATE`, - CURRENT_CARD_DUPLICATE: `${PREFIX}/CURRENT_CARD_DUPLICATE`, - CARD_DELETE: `${PREFIX}/CARD_DELETE`, - CURRENT_CARD_DELETE: `${PREFIX}/CURRENT_CARD_DELETE`, - CARD_DELETE_HANDLE: `${PREFIX}/CARD_DELETE_HANDLE`, - - /* Tasks */ - - TASK_IN_CURRENT_CARD_CREATE: `${PREFIX}/TASK_IN_CURRENT_CARD_CREATE`, - TASK_CREATE_HANDLE: `${PREFIX}/TASK_CREATE_HANDLE`, - TASK_UPDATE: `${PREFIX}/TASK_UPDATE`, - TASK_UPDATE_HANDLE: `${PREFIX}/TASK_UPDATE_HANDLE`, - TASK_MOVE: `${PREFIX}/TASK_MOVE`, - TASK_DELETE: `${PREFIX}/TASK_DELETE`, - TASK_DELETE_HANDLE: `${PREFIX}/TASK_DELETE_HANDLE`, - - /* Attachments */ - - ATTACHMENT_IN_CURRENT_CARD_CREATE: `${PREFIX}/ATTACHMENT_IN_CURRENT_CARD_CREATE`, - ATTACHMENT_CREATE_HANDLE: `${PREFIX}/ATTACHMENT_CREATE_HANDLE`, - ATTACHMENT_UPDATE: `${PREFIX}/ATTACHMENT_UPDATE`, - ATTACHMENT_UPDATE_HANDLE: `${PREFIX}/ATTACHMENT_UPDATE_HANDLE`, - ATTACHMENT_DELETE: `${PREFIX}/ATTACHMENT_DELETE`, - ATTACHMENT_DELETE_HANDLE: `${PREFIX}/ATTACHMENT_DELETE_HANDLE`, - - /* Activities */ - - ACTIVITIES_IN_CURRENT_CARD_FETCH: `${PREFIX}/ACTIVITIES_IN_CURRENT_CARD_FETCH`, - ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE: `${PREFIX}/ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE`, - ACTIVITY_CREATE_HANDLE: `${PREFIX}/ACTIVITY_CREATE_HANDLE`, - ACTIVITY_UPDATE_HANDLE: `${PREFIX}/ACTIVITY_UPDATE_HANDLE`, - ACTIVITY_DELETE_HANDLE: `${PREFIX}/ACTIVITY_DELETE_HANDLE`, - - /* Comment activities */ - - COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE: `${PREFIX}/COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE`, - COMMENT_ACTIVITY_UPDATE: `${PREFIX}/COMMENT_ACTIVITY_UPDATE`, - COMMENT_ACTIVITY_DELETE: `${PREFIX}/COMMENT_ACTIVITY_DELETE`, - - /* Notifications */ - - NOTIFICATION_CREATE_HANDLE: `${PREFIX}/NOTIFICATION_CREATE_HANDLE`, - NOTIFICATION_DELETE: `${PREFIX}/NOTIFICATION_DELETE`, - NOTIFICATION_DELETE_HANDLE: `${PREFIX}/NOTIFICATION_DELETE_HANDLE`, -}; +const PREFIX = '@entry'; + +export default { + PREFIX, + + /* Socket */ + + SOCKET_DISCONNECT_HANDLE: `${PREFIX}/SOCKET_DISCONNECT_HANDLE`, + SOCKET_RECONNECT_HANDLE: `${PREFIX}/SOCKET_RECONNECT_HANDLE`, + + /* Login */ + + AUTHENTICATE: `${PREFIX}/AUTHENTICATE`, + USING_OIDC_AUTHENTICATE: `${PREFIX}/USING_OIDC_AUTHENTICATE`, + AUTHENTICATE_ERROR_CLEAR: `${PREFIX}/AUTHENTICATE_ERROR_CLEAR`, + + /* Core */ + + LOGOUT: `${PREFIX}/LOGOUT`, + + /* Modals */ + + MODAL_OPEN: `${PREFIX}/MODAL_OPEN`, + MODAL_CLOSE: `${PREFIX}/MODAL_CLOSE`, + + /* Users */ + + USER_CREATE: `${PREFIX}/USER_CREATE`, + USER_CREATE_HANDLE: `${PREFIX}/USER_CREATE_HANDLE`, + USER_CREATE_ERROR_CLEAR: `${PREFIX}/USER_CREATE_ERROR_CLEAR`, + USER_UPDATE: `${PREFIX}/USER_UPDATE`, + CURRENT_USER_UPDATE: `${PREFIX}/CURRENT_USER_UPDATE`, + USER_UPDATE_HANDLE: `${PREFIX}/USER_UPDATE_HANDLE`, + CURRENT_USER_LANGUAGE_UPDATE: `${PREFIX}/CURRENT_USER_LANGUAGE_UPDATE`, + USER_EMAIL_UPDATE: `${PREFIX}/USER_EMAIL_UPDATE`, + CURRENT_USER_EMAIL_UPDATE: `${PREFIX}/CURRENT_USER_EMAIL_UPDATE`, + USER_EMAIL_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_EMAIL_UPDATE_ERROR_CLEAR`, + CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_EMAIL_UPDATE_ERROR_CLEAR`, + USER_PASSWORD_UPDATE: `${PREFIX}/USER_PASSWORD_UPDATE`, + CURRENT_USER_PASSWORD_UPDATE: `${PREFIX}/CURRENT_USER_PASSWORD_UPDATE`, + USER_PASSWORD_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_PASSWORD_UPDATE_ERROR_CLEAR`, + CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_PASSWORD_UPDATE_ERROR_CLEAR`, + USER_USERNAME_UPDATE: `${PREFIX}/USER_USERNAME_UPDATE`, + CURRENT_USER_USERNAME_UPDATE: `${PREFIX}/CURRENT_USER_USERNAME_UPDATE`, + USER_USERNAME_UPDATE_ERROR_CLEAR: `${PREFIX}/USER_USERNAME_UPDATE_ERROR_CLEAR`, + CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR: `${PREFIX}/CURRENT_USER_USERNAME_UPDATE_ERROR_CLEAR`, + CURRENT_USER_AVATAR_UPDATE: `${PREFIX}/CURRENT_USER_AVATAR_UPDATE`, + USER_DELETE: `${PREFIX}/USER_DELETE`, + USER_DELETE_HANDLE: `${PREFIX}/USER_DELETE_HANDLE`, + USER_TO_CARD_ADD: `${PREFIX}/USER_TO_CARD_ADD`, + USER_TO_CURRENT_CARD_ADD: `${PREFIX}/USER_TO_CURRENT_CARD_ADD`, + USER_TO_CARD_ADD_HANDLE: `${PREFIX}/USER_TO_CARD_ADD_HANDLE`, + USER_FROM_CARD_REMOVE: `${PREFIX}/USER_FROM_CARD_REMOVE`, + USER_FROM_CURRENT_CARD_REMOVE: `${PREFIX}/USER_FROM_CURRENT_CARD_REMOVE`, + USER_FROM_CARD_REMOVE_HANDLE: `${PREFIX}/USER_FROM_CARD_REMOVE_HANDLE`, + USER_TO_FILTER_IN_CURRENT_BOARD_ADD: `${PREFIX}/USER_TO_FILTER_IN_CURRENT_BOARD_ADD`, + USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE: `${PREFIX}/USER_FROM_FILTER_IN_CURRENT_BOARD_REMOVE`, + + /* Projects */ + + PROJECT_CREATE: `${PREFIX}/PROJECT_CREATE`, + PROJECT_CREATE_HANDLE: `${PREFIX}/PROJECT_CREATE_HANDLE`, + CURRENT_PROJECT_UPDATE: `${PREFIX}/CURRENT_PROJECT_UPDATE`, + PROJECT_UPDATE_HANDLE: `${PREFIX}/PROJECT_UPDATE_HANDLE`, + CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE: `${PREFIX}/CURRENT_PROJECT_BACKGROUND_IMAGE_UPDATE`, + CURRENT_PROJECT_DELETE: `${PREFIX}/CURRENT_PROJECT_DELETE`, + PROJECT_DELETE_HANDLE: `${PREFIX}/PROJECT_DELETE_HANDLE`, + + /* Project managers */ + + MANAGER_IN_CURRENT_PROJECT_CREATE: `${PREFIX}/MANAGER_IN_CURRENT_PROJECT_CREATE`, + PROJECT_MANAGER_CREATE_HANDLE: `${PREFIX}/PROJECT_MANAGER_CREATE_HANDLE`, + PROJECT_MANAGER_DELETE: `${PREFIX}/PROJECT_MANAGER_DELETE`, + PROJECT_MANAGER_DELETE_HANDLE: `${PREFIX}/PROJECT_MANAGER_DELETE_HANDLE`, + + /* Boards */ + + BOARD_IN_CURRENT_PROJECT_CREATE: `${PREFIX}/BOARD_IN_CURRENT_PROJECT_CREATE`, + BOARD_CREATE_HANDLE: `${PREFIX}/BOARD_CREATE_HANDLE`, + BOARD_FETCH: `${PREFIX}/BOARD_FETCH`, + BOARD_UPDATE: `${PREFIX}/BOARD_UPDATE`, + BOARD_UPDATE_HANDLE: `${PREFIX}/BOARD_UPDATE_HANDLE`, + BOARD_MOVE: `${PREFIX}/BOARD_MOVE`, + BOARD_DELETE: `${PREFIX}/BOARD_DELETE`, + BOARD_DELETE_HANDLE: `${PREFIX}/BOARD_DELETE_HANDLE`, + + /* Board memberships */ + + MEMBERSHIP_IN_CURRENT_BOARD_CREATE: `${PREFIX}/MEMBERSHIP_IN_CURRENT_BOARD_CREATE`, + BOARD_MEMBERSHIP_CREATE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_CREATE_HANDLE`, + BOARD_MEMBERSHIP_UPDATE: `${PREFIX}/BOARD_MEMBERSHIP_UPDATE`, + BOARD_MEMBERSHIP_UPDATE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_UPDATE_HANDLE`, + BOARD_MEMBERSHIP_DELETE: `${PREFIX}/BOARD_MEMBERSHIP_DELETE`, + BOARD_MEMBERSHIP_DELETE_HANDLE: `${PREFIX}/BOARD_MEMBERSHIP_DELETE_HANDLE`, + + /* Labels */ + + LABEL_IN_CURRENT_BOARD_CREATE: `${PREFIX}/LABEL_IN_CURRENT_BOARD_CREATE`, + LABEL_CREATE_HANDLE: `${PREFIX}/LABEL_CREATE_HANDLE`, + LABEL_UPDATE: `${PREFIX}/LABEL_UPDATE`, + LABEL_UPDATE_HANDLE: `${PREFIX}/LABEL_UPDATE_HANDLE`, + LABEL_MOVE: `${PREFIX}/LABEL_MOVE`, + LABEL_DELETE: `${PREFIX}/LABEL_DELETE`, + LABEL_DELETE_HANDLE: `${PREFIX}/LABEL_DELETE_HANDLE`, + LABEL_TO_CARD_ADD: `${PREFIX}/LABEL_TO_CARD_ADD`, + LABEL_TO_CURRENT_CARD_ADD: `${PREFIX}/LABEL_TO_CURRENT_CARD_ADD`, + LABEL_TO_CARD_ADD_HANDLE: `${PREFIX}/LABEL_TO_CARD_ADD_HANDLE`, + LABEL_FROM_CARD_REMOVE: `${PREFIX}/LABEL_FROM_CARD_REMOVE`, + LABEL_FROM_CURRENT_CARD_REMOVE: `${PREFIX}/LABEL_FROM_CURRENT_CARD_REMOVE`, + LABEL_FROM_CARD_REMOVE_HANDLE: `${PREFIX}/LABEL_FROM_CARD_REMOVE_HANDLE`, + LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD: `${PREFIX}/LABEL_TO_FILTER_IN_CURRENT_BOARD_ADD`, + LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE: `${PREFIX}/LABEL_FROM_FILTER_IN_CURRENT_BOARD_REMOVE`, + + /* Lists */ + + LIST_IN_CURRENT_BOARD_CREATE: `${PREFIX}/LIST_IN_CURRENT_BOARD_CREATE`, + LIST_CREATE_HANDLE: `${PREFIX}/LIST_CREATE_HANDLE`, + LIST_UPDATE: `${PREFIX}/LIST_UPDATE`, + LIST_UPDATE_HANDLE: `${PREFIX}/LIST_UPDATE_HANDLE`, + LIST_MOVE: `${PREFIX}/LIST_MOVE`, + LIST_DELETE: `${PREFIX}/LIST_DELETE`, + LIST_DELETE_HANDLE: `${PREFIX}/LIST_DELETE_HANDLE`, + + /* Cards */ + + CARD_CREATE: `${PREFIX}/CARD_CREATE`, + CARD_CREATE_HANDLE: `${PREFIX}/CARD_CREATE_HANDLE`, + CARD_UPDATE: `${PREFIX}/CARD_UPDATE`, + CURRENT_CARD_UPDATE: `${PREFIX}/CURRENT_CARD_UPDATE`, + CARD_UPDATE_HANDLE: `${PREFIX}/CARD_UPDATE_HANDLE`, + CARD_MOVE: `${PREFIX}/CARD_MOVE`, + CURRENT_CARD_MOVE: `${PREFIX}/CURRENT_CARD_MOVE`, + CARD_TRANSFER: `${PREFIX}/CARD_TRANSFER`, + CURRENT_CARD_TRANSFER: `${PREFIX}/CURRENT_CARD_TRANSFER`, + CARD_DUPLICATE: `${PREFIX}/CARD_DUPLICATE`, + CURRENT_CARD_DUPLICATE: `${PREFIX}/CURRENT_CARD_DUPLICATE`, + CARD_DELETE: `${PREFIX}/CARD_DELETE`, + CURRENT_CARD_DELETE: `${PREFIX}/CURRENT_CARD_DELETE`, + CARD_DELETE_HANDLE: `${PREFIX}/CARD_DELETE_HANDLE`, + + /* Tasks */ + + TASK_IN_CURRENT_CARD_CREATE: `${PREFIX}/TASK_IN_CURRENT_CARD_CREATE`, + TASK_CREATE_HANDLE: `${PREFIX}/TASK_CREATE_HANDLE`, + TASK_UPDATE: `${PREFIX}/TASK_UPDATE`, + TASK_UPDATE_HANDLE: `${PREFIX}/TASK_UPDATE_HANDLE`, + TASK_MOVE: `${PREFIX}/TASK_MOVE`, + TASK_DELETE: `${PREFIX}/TASK_DELETE`, + TASK_DELETE_HANDLE: `${PREFIX}/TASK_DELETE_HANDLE`, + + /* Attachments */ + + ATTACHMENT_IN_CURRENT_CARD_CREATE: `${PREFIX}/ATTACHMENT_IN_CURRENT_CARD_CREATE`, + ATTACHMENT_CREATE_HANDLE: `${PREFIX}/ATTACHMENT_CREATE_HANDLE`, + ATTACHMENT_UPDATE: `${PREFIX}/ATTACHMENT_UPDATE`, + ATTACHMENT_UPDATE_HANDLE: `${PREFIX}/ATTACHMENT_UPDATE_HANDLE`, + ATTACHMENT_DELETE: `${PREFIX}/ATTACHMENT_DELETE`, + ATTACHMENT_DELETE_HANDLE: `${PREFIX}/ATTACHMENT_DELETE_HANDLE`, + + /* Activities */ + + ACTIVITIES_IN_CURRENT_CARD_FETCH: `${PREFIX}/ACTIVITIES_IN_CURRENT_CARD_FETCH`, + ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE: `${PREFIX}/ACTIVITIES_DETAILS_IN_CURRENT_CARD_TOGGLE`, + ACTIVITY_CREATE_HANDLE: `${PREFIX}/ACTIVITY_CREATE_HANDLE`, + ACTIVITY_UPDATE_HANDLE: `${PREFIX}/ACTIVITY_UPDATE_HANDLE`, + ACTIVITY_DELETE_HANDLE: `${PREFIX}/ACTIVITY_DELETE_HANDLE`, + + /* Comment activities */ + + COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE: `${PREFIX}/COMMENT_ACTIVITY_IN_CURRENT_CARD_CREATE`, + COMMENT_ACTIVITY_UPDATE: `${PREFIX}/COMMENT_ACTIVITY_UPDATE`, + COMMENT_ACTIVITY_DELETE: `${PREFIX}/COMMENT_ACTIVITY_DELETE`, + + /* Notifications */ + + NOTIFICATION_CREATE_HANDLE: `${PREFIX}/NOTIFICATION_CREATE_HANDLE`, + NOTIFICATION_DELETE: `${PREFIX}/NOTIFICATION_DELETE`, + NOTIFICATION_DELETE_HANDLE: `${PREFIX}/NOTIFICATION_DELETE_HANDLE`, +}; diff --git a/client/src/containers/CardContainer.js b/client/src/containers/CardContainer.js index e174564..8a5ec30 100755 --- a/client/src/containers/CardContainer.js +++ b/client/src/containers/CardContainer.js @@ -1,80 +1,80 @@ -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; - -import selectors from '../selectors'; -import entryActions from '../entry-actions'; -import { BoardMembershipRoles } from '../constants/Enums'; -import Card from '../components/Card'; - -const makeMapStateToProps = () => { - const selectCardById = selectors.makeSelectCardById(); - const selectUsersByCardId = selectors.makeSelectUsersByCardId(); - const selectLabelsByCardId = selectors.makeSelectLabelsByCardId(); - const selectTasksByCardId = selectors.makeSelectTasksByCardId(); - const selectNotificationsTotalByCardId = selectors.makeSelectNotificationsTotalByCardId(); - - return (state, { id, index }) => { - const { projectId } = selectors.selectPath(state); - const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); - const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); - const allLabels = selectors.selectLabelsForCurrentBoard(state); - const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); - - const { name, dueDate, stopwatch, coverUrl, boardId, listId, isPersisted } = selectCardById( - state, - id, - ); - - const users = selectUsersByCardId(state, id); - const labels = selectLabelsByCardId(state, id); - const tasks = selectTasksByCardId(state, id); - const notificationsTotal = selectNotificationsTotalByCardId(state, id); - - const isCurrentUserEditor = - !!currentUserMembership && currentUserMembership.role === BoardMembershipRoles.EDITOR; - - return { - id, - index, - name, - dueDate, - stopwatch, - coverUrl, - boardId, - listId, - projectId, - isPersisted, - notificationsTotal, - users, - labels, - tasks, - allProjectsToLists, - allBoardMemberships, - allLabels, - canEdit: isCurrentUserEditor, - }; - }; -}; - -const mapDispatchToProps = (dispatch, { id }) => - bindActionCreators( - { - onUpdate: (data) => entryActions.updateCard(id, data), - onMove: (listId, index) => entryActions.moveCard(id, listId, index), - onTransfer: (boardId, listId) => entryActions.transferCard(id, boardId, listId), - onDuplicate: () => entryActions.duplicateCard(id), - onDelete: () => entryActions.deleteCard(id), - onUserAdd: (userId) => entryActions.addUserToCard(userId, id), - onUserRemove: (userId) => entryActions.removeUserFromCard(userId, id), - onBoardFetch: entryActions.fetchBoard, - onLabelAdd: (labelId) => entryActions.addLabelToCard(labelId, id), - onLabelRemove: (labelId) => entryActions.removeLabelFromCard(labelId, id), - onLabelCreate: (data) => entryActions.createLabelInCurrentBoard(data), - onLabelUpdate: (labelId, data) => entryActions.updateLabel(labelId, data), - onLabelMove: (labelId, index) => entryActions.moveLabel(labelId, index), - onLabelDelete: (labelId) => entryActions.deleteLabel(labelId), - }, - dispatch, - ); - -export default connect(makeMapStateToProps, mapDispatchToProps)(Card); +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; + +import selectors from '../selectors'; +import entryActions from '../entry-actions'; +import { BoardMembershipRoles } from '../constants/Enums'; +import Card from '../components/Card'; + +const makeMapStateToProps = () => { + const selectCardById = selectors.makeSelectCardById(); + const selectUsersByCardId = selectors.makeSelectUsersByCardId(); + const selectLabelsByCardId = selectors.makeSelectLabelsByCardId(); + const selectTasksByCardId = selectors.makeSelectTasksByCardId(); + const selectNotificationsTotalByCardId = selectors.makeSelectNotificationsTotalByCardId(); + + return (state, { id, index }) => { + const { projectId } = selectors.selectPath(state); + const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); + const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); + const allLabels = selectors.selectLabelsForCurrentBoard(state); + const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); + + const { name, dueDate, stopwatch, coverUrl, boardId, listId, isPersisted } = selectCardById( + state, + id, + ); + + const users = selectUsersByCardId(state, id); + const labels = selectLabelsByCardId(state, id); + const tasks = selectTasksByCardId(state, id); + const notificationsTotal = selectNotificationsTotalByCardId(state, id); + + const isCurrentUserEditor = + !!currentUserMembership && currentUserMembership.role === BoardMembershipRoles.EDITOR; + + return { + id, + index, + name, + dueDate, + stopwatch, + coverUrl, + boardId, + listId, + projectId, + isPersisted, + notificationsTotal, + users, + labels, + tasks, + allProjectsToLists, + allBoardMemberships, + allLabels, + canEdit: isCurrentUserEditor, + }; + }; +}; + +const mapDispatchToProps = (dispatch, { id }) => + bindActionCreators( + { + onUpdate: (data) => entryActions.updateCard(id, data), + onMove: (listId, index) => entryActions.moveCard(id, listId, index), + onTransfer: (boardId, listId) => entryActions.transferCard(id, boardId, listId), + onDuplicate: () => entryActions.duplicateCard(id), + onDelete: () => entryActions.deleteCard(id), + onUserAdd: (userId) => entryActions.addUserToCard(userId, id), + onUserRemove: (userId) => entryActions.removeUserFromCard(userId, id), + onBoardFetch: entryActions.fetchBoard, + onLabelAdd: (labelId) => entryActions.addLabelToCard(labelId, id), + onLabelRemove: (labelId) => entryActions.removeLabelFromCard(labelId, id), + onLabelCreate: (data) => entryActions.createLabelInCurrentBoard(data), + onLabelUpdate: (labelId, data) => entryActions.updateLabel(labelId, data), + onLabelMove: (labelId, index) => entryActions.moveLabel(labelId, index), + onLabelDelete: (labelId) => entryActions.deleteLabel(labelId), + }, + dispatch, + ); + +export default connect(makeMapStateToProps, mapDispatchToProps)(Card); diff --git a/client/src/containers/CardModalContainer.js b/client/src/containers/CardModalContainer.js index a8df6ea..907d36f 100755 --- a/client/src/containers/CardModalContainer.js +++ b/client/src/containers/CardModalContainer.js @@ -1,115 +1,115 @@ -import { bindActionCreators } from 'redux'; -import { connect } from 'react-redux'; -import omit from 'lodash/omit'; -import { push } from '../lib/redux-router'; - -import selectors from '../selectors'; -import entryActions from '../entry-actions'; -import Paths from '../constants/Paths'; -import { BoardMembershipRoles } from '../constants/Enums'; -import CardModal from '../components/CardModal'; - -const mapStateToProps = (state) => { - const { projectId } = selectors.selectPath(state); - const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); - const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); - const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); - const allLabels = selectors.selectLabelsForCurrentBoard(state); - const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); - - const { - name, - description, - dueDate, - stopwatch, - isSubscribed, - isActivitiesFetching, - isAllActivitiesFetched, - isActivitiesDetailsVisible, - isActivitiesDetailsFetching, - boardId, - listId, - } = selectors.selectCurrentCard(state); - - const users = selectors.selectUsersForCurrentCard(state); - const labels = selectors.selectLabelsForCurrentCard(state); - const tasks = selectors.selectTasksForCurrentCard(state); - const attachments = selectors.selectAttachmentsForCurrentCard(state); - const activities = selectors.selectActivitiesForCurrentCard(state); - - let isCurrentUserEditor = false; - let isCurrentUserEditorOrCanComment = false; - - if (currentUserMembership) { - isCurrentUserEditor = currentUserMembership.role === BoardMembershipRoles.EDITOR; - isCurrentUserEditorOrCanComment = isCurrentUserEditor || currentUserMembership.canComment; - } - - return { - name, - description, - dueDate, - stopwatch, - isSubscribed, - isActivitiesFetching, - isAllActivitiesFetched, - isActivitiesDetailsVisible, - isActivitiesDetailsFetching, - listId, - boardId, - projectId, - users, - labels, - tasks, - attachments, - activities, - allProjectsToLists, - allBoardMemberships, - allLabels, - canEdit: isCurrentUserEditor, - canEditCommentActivities: isCurrentUserEditorOrCanComment, - canEditAllCommentActivities: isCurrentUserManager, - }; -}; - -const mapDispatchToProps = (dispatch) => - bindActionCreators( - { - onUpdate: entryActions.updateCurrentCard, - onMove: entryActions.moveCurrentCard, - onTransfer: entryActions.transferCurrentCard, - onDuplicate: entryActions.duplicateCurrentCard, - onDelete: entryActions.deleteCurrentCard, - onUserAdd: entryActions.addUserToCurrentCard, - onUserRemove: entryActions.removeUserFromCurrentCard, - onBoardFetch: entryActions.fetchBoard, - onLabelAdd: entryActions.addLabelToCurrentCard, - onLabelRemove: entryActions.removeLabelFromCurrentCard, - onLabelCreate: entryActions.createLabelInCurrentBoard, - onLabelUpdate: entryActions.updateLabel, - onLabelMove: entryActions.moveLabel, - onLabelDelete: entryActions.deleteLabel, - onTaskCreate: entryActions.createTaskInCurrentCard, - onTaskUpdate: entryActions.updateTask, - onTaskMove: entryActions.moveTask, - onTaskDelete: entryActions.deleteTask, - onAttachmentCreate: entryActions.createAttachmentInCurrentCard, - onAttachmentUpdate: entryActions.updateAttachment, - onAttachmentDelete: entryActions.deleteAttachment, - onActivitiesFetch: entryActions.fetchActivitiesInCurrentCard, - onActivitiesDetailsToggle: entryActions.toggleActivitiesDetailsInCurrentCard, - onCommentActivityCreate: entryActions.createCommentActivityInCurrentCard, - onCommentActivityUpdate: entryActions.updateCommentActivity, - onCommentActivityDelete: entryActions.deleteCommentActivity, - push, - }, - dispatch, - ); - -const mergeProps = (stateProps, dispatchProps) => ({ - ...stateProps, - ...omit(dispatchProps, 'push'), - onClose: () => dispatchProps.push(Paths.BOARDS.replace(':id', stateProps.boardId)), -}); - -export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(CardModal); +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import omit from 'lodash/omit'; +import { push } from '../lib/redux-router'; + +import selectors from '../selectors'; +import entryActions from '../entry-actions'; +import Paths from '../constants/Paths'; +import { BoardMembershipRoles } from '../constants/Enums'; +import CardModal from '../components/CardModal'; + +const mapStateToProps = (state) => { + const { projectId } = selectors.selectPath(state); + const allProjectsToLists = selectors.selectProjectsToListsForCurrentUser(state); + const isCurrentUserManager = selectors.selectIsCurrentUserManagerForCurrentProject(state); + const allBoardMemberships = selectors.selectMembershipsForCurrentBoard(state); + const allLabels = selectors.selectLabelsForCurrentBoard(state); + const currentUserMembership = selectors.selectCurrentUserMembershipForCurrentBoard(state); + + const { + name, + description, + dueDate, + stopwatch, + isSubscribed, + isActivitiesFetching, + isAllActivitiesFetched, + isActivitiesDetailsVisible, + isActivitiesDetailsFetching, + boardId, + listId, + } = selectors.selectCurrentCard(state); + + const users = selectors.selectUsersForCurrentCard(state); + const labels = selectors.selectLabelsForCurrentCard(state); + const tasks = selectors.selectTasksForCurrentCard(state); + const attachments = selectors.selectAttachmentsForCurrentCard(state); + const activities = selectors.selectActivitiesForCurrentCard(state); + + let isCurrentUserEditor = false; + let isCurrentUserEditorOrCanComment = false; + + if (currentUserMembership) { + isCurrentUserEditor = currentUserMembership.role === BoardMembershipRoles.EDITOR; + isCurrentUserEditorOrCanComment = isCurrentUserEditor || currentUserMembership.canComment; + } + + return { + name, + description, + dueDate, + stopwatch, + isSubscribed, + isActivitiesFetching, + isAllActivitiesFetched, + isActivitiesDetailsVisible, + isActivitiesDetailsFetching, + listId, + boardId, + projectId, + users, + labels, + tasks, + attachments, + activities, + allProjectsToLists, + allBoardMemberships, + allLabels, + canEdit: isCurrentUserEditor, + canEditCommentActivities: isCurrentUserEditorOrCanComment, + canEditAllCommentActivities: isCurrentUserManager, + }; +}; + +const mapDispatchToProps = (dispatch) => + bindActionCreators( + { + onUpdate: entryActions.updateCurrentCard, + onMove: entryActions.moveCurrentCard, + onTransfer: entryActions.transferCurrentCard, + onDuplicate: entryActions.duplicateCurrentCard, + onDelete: entryActions.deleteCurrentCard, + onUserAdd: entryActions.addUserToCurrentCard, + onUserRemove: entryActions.removeUserFromCurrentCard, + onBoardFetch: entryActions.fetchBoard, + onLabelAdd: entryActions.addLabelToCurrentCard, + onLabelRemove: entryActions.removeLabelFromCurrentCard, + onLabelCreate: entryActions.createLabelInCurrentBoard, + onLabelUpdate: entryActions.updateLabel, + onLabelMove: entryActions.moveLabel, + onLabelDelete: entryActions.deleteLabel, + onTaskCreate: entryActions.createTaskInCurrentCard, + onTaskUpdate: entryActions.updateTask, + onTaskMove: entryActions.moveTask, + onTaskDelete: entryActions.deleteTask, + onAttachmentCreate: entryActions.createAttachmentInCurrentCard, + onAttachmentUpdate: entryActions.updateAttachment, + onAttachmentDelete: entryActions.deleteAttachment, + onActivitiesFetch: entryActions.fetchActivitiesInCurrentCard, + onActivitiesDetailsToggle: entryActions.toggleActivitiesDetailsInCurrentCard, + onCommentActivityCreate: entryActions.createCommentActivityInCurrentCard, + onCommentActivityUpdate: entryActions.updateCommentActivity, + onCommentActivityDelete: entryActions.deleteCommentActivity, + push, + }, + dispatch, + ); + +const mergeProps = (stateProps, dispatchProps) => ({ + ...stateProps, + ...omit(dispatchProps, 'push'), + onClose: () => dispatchProps.push(Paths.BOARDS.replace(':id', stateProps.boardId)), +}); + +export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(CardModal); diff --git a/client/src/entry-actions/cards.js b/client/src/entry-actions/cards.js index 346fc8d..c9b4281 100755 --- a/client/src/entry-actions/cards.js +++ b/client/src/entry-actions/cards.js @@ -1,123 +1,123 @@ -import EntryActionTypes from '../constants/EntryActionTypes'; - -const createCard = (listId, data, autoOpen) => ({ - type: EntryActionTypes.CARD_CREATE, - payload: { - listId, - data, - autoOpen, - }, -}); - -const handleCardCreate = (card) => ({ - type: EntryActionTypes.CARD_CREATE_HANDLE, - payload: { - card, - }, -}); - -const updateCard = (id, data) => ({ - type: EntryActionTypes.CARD_UPDATE, - payload: { - id, - data, - }, -}); - -const updateCurrentCard = (data) => ({ - type: EntryActionTypes.CURRENT_CARD_UPDATE, - payload: { - data, - }, -}); - -const handleCardUpdate = (card) => ({ - type: EntryActionTypes.CARD_UPDATE_HANDLE, - payload: { - card, - }, -}); - -const moveCard = (id, listId, index = 0) => ({ - type: EntryActionTypes.CARD_MOVE, - payload: { - id, - listId, - index, - }, -}); - -const moveCurrentCard = (listId, index = 0) => ({ - type: EntryActionTypes.CURRENT_CARD_MOVE, - payload: { - listId, - index, - }, -}); - -const transferCard = (id, boardId, listId, index = 0) => ({ - type: EntryActionTypes.CARD_TRANSFER, - payload: { - id, - boardId, - listId, - index, - }, -}); - -const transferCurrentCard = (boardId, listId, index = 0) => ({ - type: EntryActionTypes.CURRENT_CARD_TRANSFER, - payload: { - boardId, - listId, - index, - }, -}); - -const duplicateCard = (id) => ({ - type: EntryActionTypes.CARD_DUPLICATE, - payload: { - id, - }, -}); - -const duplicateCurrentCard = () => ({ - type: EntryActionTypes.CURRENT_CARD_DUPLICATE, - payload: {}, -}); - -const deleteCard = (id) => ({ - type: EntryActionTypes.CARD_DELETE, - payload: { - id, - }, -}); - -const deleteCurrentCard = () => ({ - type: EntryActionTypes.CURRENT_CARD_DELETE, - payload: {}, -}); - -const handleCardDelete = (card) => ({ - type: EntryActionTypes.CARD_DELETE_HANDLE, - payload: { - card, - }, -}); - -export default { - createCard, - handleCardCreate, - updateCard, - updateCurrentCard, - handleCardUpdate, - moveCard, - moveCurrentCard, - transferCard, - transferCurrentCard, - duplicateCard, - duplicateCurrentCard, - deleteCard, - deleteCurrentCard, - handleCardDelete, -}; +import EntryActionTypes from '../constants/EntryActionTypes'; + +const createCard = (listId, data, autoOpen) => ({ + type: EntryActionTypes.CARD_CREATE, + payload: { + listId, + data, + autoOpen, + }, +}); + +const handleCardCreate = (card) => ({ + type: EntryActionTypes.CARD_CREATE_HANDLE, + payload: { + card, + }, +}); + +const updateCard = (id, data) => ({ + type: EntryActionTypes.CARD_UPDATE, + payload: { + id, + data, + }, +}); + +const updateCurrentCard = (data) => ({ + type: EntryActionTypes.CURRENT_CARD_UPDATE, + payload: { + data, + }, +}); + +const handleCardUpdate = (card) => ({ + type: EntryActionTypes.CARD_UPDATE_HANDLE, + payload: { + card, + }, +}); + +const moveCard = (id, listId, index = 0) => ({ + type: EntryActionTypes.CARD_MOVE, + payload: { + id, + listId, + index, + }, +}); + +const moveCurrentCard = (listId, index = 0) => ({ + type: EntryActionTypes.CURRENT_CARD_MOVE, + payload: { + listId, + index, + }, +}); + +const transferCard = (id, boardId, listId, index = 0) => ({ + type: EntryActionTypes.CARD_TRANSFER, + payload: { + id, + boardId, + listId, + index, + }, +}); + +const transferCurrentCard = (boardId, listId, index = 0) => ({ + type: EntryActionTypes.CURRENT_CARD_TRANSFER, + payload: { + boardId, + listId, + index, + }, +}); + +const duplicateCard = (id) => ({ + type: EntryActionTypes.CARD_DUPLICATE, + payload: { + id, + }, +}); + +const duplicateCurrentCard = () => ({ + type: EntryActionTypes.CURRENT_CARD_DUPLICATE, + payload: {}, +}); + +const deleteCard = (id) => ({ + type: EntryActionTypes.CARD_DELETE, + payload: { + id, + }, +}); + +const deleteCurrentCard = () => ({ + type: EntryActionTypes.CURRENT_CARD_DELETE, + payload: {}, +}); + +const handleCardDelete = (card) => ({ + type: EntryActionTypes.CARD_DELETE_HANDLE, + payload: { + card, + }, +}); + +export default { + createCard, + handleCardCreate, + updateCard, + updateCurrentCard, + handleCardUpdate, + moveCard, + moveCurrentCard, + transferCard, + transferCurrentCard, + duplicateCard, + duplicateCurrentCard, + deleteCard, + deleteCurrentCard, + handleCardDelete, +}; diff --git a/client/src/locales/en/core.js b/client/src/locales/en/core.js index 41e4494..4a85b26 100644 --- a/client/src/locales/en/core.js +++ b/client/src/locales/en/core.js @@ -1,239 +1,239 @@ -export default { - format: { - date: 'M/d/yyyy', - time: 'p', - dateTime: '$t(format:date) $t(format:time)', - longDate: 'MMM d', - longDateTime: "MMMM d 'at' p", - fullDate: 'MMM d, y', - fullDateTime: "MMMM d, y 'at' p", - }, - - translation: { - common: { - aboutPlanka: 'About Planka', - account: 'Account', - actions: 'Actions', - addAttachment_title: 'Add Attachment', - addComment: 'Add comment', - addManager_title: 'Add Manager', - addMember_title: 'Add Member', - addUser_title: 'Add User', - administrator: 'Administrator', - all: 'All', - allChangesWillBeAutomaticallySavedAfterConnectionRestored: - 'All changes will be automatically saved
after connection restored.', - areYouSureYouWantToDeleteThisAttachment: 'Are you sure you want to delete this attachment?', - areYouSureYouWantToDeleteThisBoard: 'Are you sure you want to delete this board?', - areYouSureYouWantToDeleteThisCard: 'Are you sure you want to delete this card?', - areYouSureYouWantToDeleteThisComment: 'Are you sure you want to delete this comment?', - areYouSureYouWantToDeleteThisLabel: 'Are you sure you want to delete this label?', - areYouSureYouWantToDeleteThisList: 'Are you sure you want to delete this list?', - areYouSureYouWantToDeleteThisProject: 'Are you sure you want to delete this project?', - areYouSureYouWantToDeleteThisTask: 'Are you sure you want to delete this task?', - areYouSureYouWantToDeleteThisUser: 'Are you sure you want to delete this user?', - areYouSureYouWantToLeaveBoard: 'Are you sure you want to leave the board?', - areYouSureYouWantToLeaveProject: 'Are you sure you want to leave the project?', - areYouSureYouWantToRemoveThisManagerFromProject: - 'Are you sure you want to remove this manager from the project?', - areYouSureYouWantToRemoveThisMemberFromBoard: - 'Are you sure you want to remove this member from the board?', - attachment: 'Attachment', - attachments: 'Attachments', - authentication: 'Authentication', - background: 'Background', - board: 'Board', - boardNotFound_title: 'Board Not Found', - canComment: 'Can comment', - canEditContentOfBoard: 'Can edit the content of the board.', - canOnlyViewBoard: 'Can only view the board.', - cardActions_title: 'Card Actions', - cardNotFound_title: 'Card Not Found', - cardOrActionAreDeleted: 'Card or action are deleted.', - color: 'Color', - copy_inline: 'copy', - createBoard_title: 'Create Board', - createLabel_title: 'Create Label', - createNewOneOrSelectExistingOne: 'Create a new one or select
an existing one.', - createProject_title: 'Create Project', - createTextFile_title: 'Create Text File', - currentPassword: 'Current password', - dangerZone_title: 'Danger Zone', - date: 'Date', - dueDate_title: 'Due Date', - deleteAttachment_title: 'Delete Attachment', - deleteBoard_title: 'Delete Board', - deleteCard_title: 'Delete Card', - deleteComment_title: 'Delete Comment', - deleteLabel_title: 'Delete Label', - deleteList_title: 'Delete List', - deleteProject_title: 'Delete Project', - deleteTask_title: 'Delete Task', - deleteUser_title: 'Delete User', - description: 'Description', - detectAutomatically: 'Detect automatically', - dropFileToUpload: 'Drop file to upload', - editor: 'Editor', - editAttachment_title: 'Edit Attachment', - editAvatar_title: 'Edit Avatar', - editBoard_title: 'Edit Board', - editDueDate_title: 'Edit Due Date', - editEmail_title: 'Edit E-mail', - editInformation_title: 'Edit Information', - editLabel_title: 'Edit Label', - editPassword_title: 'Edit Password', - editPermissions_title: 'Edit Permissions', - editStopwatch_title: 'Edit Stopwatch', - editUsername_title: 'Edit Username', - email: 'E-mail', - emailAlreadyInUse: 'E-mail already in use', - enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open.', - enterDescription: 'Enter description...', - enterFilename: 'Enter filename', - enterListTitle: 'Enter list title...', - enterProjectTitle: 'Enter project title', - enterTaskDescription: 'Enter task description...', - filterByLabels_title: 'Filter By Labels', - filterByMembers_title: 'Filter By Members', - fromComputer_title: 'From Computer', - fromTrello: 'From Trello', - general: 'General', - hours: 'Hours', - importBoard_title: 'Import Board', - invalidCurrentPassword: 'Invalid current password', - labels: 'Labels', - language: 'Language', - leaveBoard_title: 'Leave Board', - leaveProject_title: 'Leave Project', - list: 'List', - listActions_title: 'List Actions', - managers: 'Managers', - members: 'Members', - minutes: 'Minutes', - moveCard_title: 'Move Card', - name: 'Name', - newEmail: 'New e-mail', - newPassword: 'New password', - newUsername: 'New username', - noConnectionToServer: 'No connection to server', - noBoards: 'No boards', - noLists: 'No lists', - noProjects: 'No projects', - notifications: 'Notifications', - noUnreadNotifications: 'No unread notifications.', - openBoard_title: 'Open Board', - optional_inline: 'optional', - organization: 'Organization', - phone: 'Phone', - preferences: 'Preferences', - pressPasteShortcutToAddAttachmentFromClipboard: - 'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard.', - project: 'Project', - projectNotFound_title: 'Project Not Found', - removeManager_title: 'Remove Manager', - removeMember_title: 'Remove Member', - searchLabels: 'Search labels...', - searchMembers: 'Search members...', - searchUsers: 'Search users...', - seconds: 'Seconds', - selectBoard: 'Select board', - selectList: 'Select list', - selectPermissions_title: 'Select Permissions', - selectProject: 'Select project', - settings: 'Settings', - stopwatch: 'Stopwatch', - subscribeToMyOwnCardsByDefault: 'Subscribe to my own cards by default', - taskActions_title: 'Task Actions', - tasks: 'Tasks', - thereIsNoPreviewAvailableForThisAttachment: - 'There is no preview available for this attachment.', - time: 'Time', - title: 'Title', - userActions_title: 'User Actions', - userAddedThisCardToList: '<0>{{user}}<1> added this card to {{list}}', - userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}', - userMovedCardFromListToList: '{{user}} moved <2>{{card}} from {{fromList}} to {{toList}}', - userMovedThisCardFromListToList: - '<0>{{user}}<1> moved this card from {{fromList}} to {{toList}}', - username: 'Username', - usernameAlreadyInUse: 'Username already in use', - users: 'Users', - version: 'Version', - viewer: 'Viewer', - writeComment: 'Write a comment...', - }, - - action: { - addAnotherCard: 'Add another card', - addAnotherList: 'Add another list', - addAnotherTask: 'Add another task', - addCard: 'Add card', - addCard_title: 'Add Card', - addComment: 'Add comment', - addList: 'Add list', - addMember: 'Add member', - addMoreDetailedDescription: 'Add more detailed description', - addTask: 'Add task', - addToCard: 'Add to card', - addUser: 'Add user', - createBoard: 'Create board', - createFile: 'Create file', - createLabel: 'Create label', - createNewLabel: 'Create new label', - createProject: 'Create project', - delete: 'Delete', - deleteAttachment: 'Delete attachment', - deleteAvatar: 'Delete avatar', - deleteBoard: 'Delete board', - deleteCard: 'Delete card', - deleteCard_title: 'Delete Card', - deleteComment: 'Delete comment', - deleteImage: 'Delete image', - deleteLabel: 'Delete label', - deleteList: 'Delete list', - deleteList_title: 'Delete List', - deleteProject: 'Delete project', - deleteProject_title: 'Delete Project', - deleteTask: 'Delete task', - deleteTask_title: 'Delete Task', - deleteUser: 'Delete user', - duplicate: 'Duplicate', - duplicateCard_title: 'Duplicate Card', - edit: 'Edit', - editDueDate_title: 'Edit Due Date', - editDescription_title: 'Edit Description', - editEmail_title: 'Edit E-mail', - editInformation_title: 'Edit Information', - editPassword_title: 'Edit Password', - editPermissions: 'Edit permissions', - editStopwatch_title: 'Edit Stopwatch', - editTitle_title: 'Edit Title', - editUsername_title: 'Edit Username', - hideDetails: 'Hide details', - import: 'Import', - leaveBoard: 'Leave board', - leaveProject: 'Leave project', - logOut_title: 'Log Out', - makeCover_title: 'Make Cover', - move: 'Move', - moveCard_title: 'Move Card', - remove: 'Remove', - removeBackground: 'Remove background', - removeCover_title: 'Remove Cover', - removeFromBoard: 'Remove from board', - removeFromProject: 'Remove from project', - removeManager: 'Remove manager', - removeMember: 'Remove member', - save: 'Save', - showAllAttachments: 'Show all attachments ({{hidden}} hidden)', - showDetails: 'Show details', - showFewerAttachments: 'Show fewer attachments', - start: 'Start', - stop: 'Stop', - subscribe: 'Subscribe', - unsubscribe: 'Unsubscribe', - uploadNewAvatar: 'Upload new avatar', - uploadNewImage: 'Upload new image', - }, - }, -}; +export default { + format: { + date: 'M/d/yyyy', + time: 'p', + dateTime: '$t(format:date) $t(format:time)', + longDate: 'MMM d', + longDateTime: "MMMM d 'at' p", + fullDate: 'MMM d, y', + fullDateTime: "MMMM d, y 'at' p", + }, + + translation: { + common: { + aboutPlanka: 'About Planka', + account: 'Account', + actions: 'Actions', + addAttachment_title: 'Add Attachment', + addComment: 'Add comment', + addManager_title: 'Add Manager', + addMember_title: 'Add Member', + addUser_title: 'Add User', + administrator: 'Administrator', + all: 'All', + allChangesWillBeAutomaticallySavedAfterConnectionRestored: + 'All changes will be automatically saved
after connection restored.', + areYouSureYouWantToDeleteThisAttachment: 'Are you sure you want to delete this attachment?', + areYouSureYouWantToDeleteThisBoard: 'Are you sure you want to delete this board?', + areYouSureYouWantToDeleteThisCard: 'Are you sure you want to delete this card?', + areYouSureYouWantToDeleteThisComment: 'Are you sure you want to delete this comment?', + areYouSureYouWantToDeleteThisLabel: 'Are you sure you want to delete this label?', + areYouSureYouWantToDeleteThisList: 'Are you sure you want to delete this list?', + areYouSureYouWantToDeleteThisProject: 'Are you sure you want to delete this project?', + areYouSureYouWantToDeleteThisTask: 'Are you sure you want to delete this task?', + areYouSureYouWantToDeleteThisUser: 'Are you sure you want to delete this user?', + areYouSureYouWantToLeaveBoard: 'Are you sure you want to leave the board?', + areYouSureYouWantToLeaveProject: 'Are you sure you want to leave the project?', + areYouSureYouWantToRemoveThisManagerFromProject: + 'Are you sure you want to remove this manager from the project?', + areYouSureYouWantToRemoveThisMemberFromBoard: + 'Are you sure you want to remove this member from the board?', + attachment: 'Attachment', + attachments: 'Attachments', + authentication: 'Authentication', + background: 'Background', + board: 'Board', + boardNotFound_title: 'Board Not Found', + canComment: 'Can comment', + canEditContentOfBoard: 'Can edit the content of the board.', + canOnlyViewBoard: 'Can only view the board.', + cardActions_title: 'Card Actions', + cardNotFound_title: 'Card Not Found', + cardOrActionAreDeleted: 'Card or action are deleted.', + color: 'Color', + copy_inline: 'copy', + createBoard_title: 'Create Board', + createLabel_title: 'Create Label', + createNewOneOrSelectExistingOne: 'Create a new one or select
an existing one.', + createProject_title: 'Create Project', + createTextFile_title: 'Create Text File', + currentPassword: 'Current password', + dangerZone_title: 'Danger Zone', + date: 'Date', + dueDate_title: 'Due Date', + deleteAttachment_title: 'Delete Attachment', + deleteBoard_title: 'Delete Board', + deleteCard_title: 'Delete Card', + deleteComment_title: 'Delete Comment', + deleteLabel_title: 'Delete Label', + deleteList_title: 'Delete List', + deleteProject_title: 'Delete Project', + deleteTask_title: 'Delete Task', + deleteUser_title: 'Delete User', + description: 'Description', + detectAutomatically: 'Detect automatically', + dropFileToUpload: 'Drop file to upload', + editor: 'Editor', + editAttachment_title: 'Edit Attachment', + editAvatar_title: 'Edit Avatar', + editBoard_title: 'Edit Board', + editDueDate_title: 'Edit Due Date', + editEmail_title: 'Edit E-mail', + editInformation_title: 'Edit Information', + editLabel_title: 'Edit Label', + editPassword_title: 'Edit Password', + editPermissions_title: 'Edit Permissions', + editStopwatch_title: 'Edit Stopwatch', + editUsername_title: 'Edit Username', + email: 'E-mail', + emailAlreadyInUse: 'E-mail already in use', + enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open.', + enterDescription: 'Enter description...', + enterFilename: 'Enter filename', + enterListTitle: 'Enter list title...', + enterProjectTitle: 'Enter project title', + enterTaskDescription: 'Enter task description...', + filterByLabels_title: 'Filter By Labels', + filterByMembers_title: 'Filter By Members', + fromComputer_title: 'From Computer', + fromTrello: 'From Trello', + general: 'General', + hours: 'Hours', + importBoard_title: 'Import Board', + invalidCurrentPassword: 'Invalid current password', + labels: 'Labels', + language: 'Language', + leaveBoard_title: 'Leave Board', + leaveProject_title: 'Leave Project', + list: 'List', + listActions_title: 'List Actions', + managers: 'Managers', + members: 'Members', + minutes: 'Minutes', + moveCard_title: 'Move Card', + name: 'Name', + newEmail: 'New e-mail', + newPassword: 'New password', + newUsername: 'New username', + noConnectionToServer: 'No connection to server', + noBoards: 'No boards', + noLists: 'No lists', + noProjects: 'No projects', + notifications: 'Notifications', + noUnreadNotifications: 'No unread notifications.', + openBoard_title: 'Open Board', + optional_inline: 'optional', + organization: 'Organization', + phone: 'Phone', + preferences: 'Preferences', + pressPasteShortcutToAddAttachmentFromClipboard: + 'Tip: press Ctrl-V (Cmd-V on Mac) to add an attachment from the clipboard.', + project: 'Project', + projectNotFound_title: 'Project Not Found', + removeManager_title: 'Remove Manager', + removeMember_title: 'Remove Member', + searchLabels: 'Search labels...', + searchMembers: 'Search members...', + searchUsers: 'Search users...', + seconds: 'Seconds', + selectBoard: 'Select board', + selectList: 'Select list', + selectPermissions_title: 'Select Permissions', + selectProject: 'Select project', + settings: 'Settings', + stopwatch: 'Stopwatch', + subscribeToMyOwnCardsByDefault: 'Subscribe to my own cards by default', + taskActions_title: 'Task Actions', + tasks: 'Tasks', + thereIsNoPreviewAvailableForThisAttachment: + 'There is no preview available for this attachment.', + time: 'Time', + title: 'Title', + userActions_title: 'User Actions', + userAddedThisCardToList: '<0>{{user}}<1> added this card to {{list}}', + userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}', + userMovedCardFromListToList: '{{user}} moved <2>{{card}} from {{fromList}} to {{toList}}', + userMovedThisCardFromListToList: + '<0>{{user}}<1> moved this card from {{fromList}} to {{toList}}', + username: 'Username', + usernameAlreadyInUse: 'Username already in use', + users: 'Users', + version: 'Version', + viewer: 'Viewer', + writeComment: 'Write a comment...', + }, + + action: { + addAnotherCard: 'Add another card', + addAnotherList: 'Add another list', + addAnotherTask: 'Add another task', + addCard: 'Add card', + addCard_title: 'Add Card', + addComment: 'Add comment', + addList: 'Add list', + addMember: 'Add member', + addMoreDetailedDescription: 'Add more detailed description', + addTask: 'Add task', + addToCard: 'Add to card', + addUser: 'Add user', + createBoard: 'Create board', + createFile: 'Create file', + createLabel: 'Create label', + createNewLabel: 'Create new label', + createProject: 'Create project', + delete: 'Delete', + deleteAttachment: 'Delete attachment', + deleteAvatar: 'Delete avatar', + deleteBoard: 'Delete board', + deleteCard: 'Delete card', + deleteCard_title: 'Delete Card', + deleteComment: 'Delete comment', + deleteImage: 'Delete image', + deleteLabel: 'Delete label', + deleteList: 'Delete list', + deleteList_title: 'Delete List', + deleteProject: 'Delete project', + deleteProject_title: 'Delete Project', + deleteTask: 'Delete task', + deleteTask_title: 'Delete Task', + deleteUser: 'Delete user', + duplicate: 'Duplicate', + duplicateCard_title: 'Duplicate Card', + edit: 'Edit', + editDueDate_title: 'Edit Due Date', + editDescription_title: 'Edit Description', + editEmail_title: 'Edit E-mail', + editInformation_title: 'Edit Information', + editPassword_title: 'Edit Password', + editPermissions: 'Edit permissions', + editStopwatch_title: 'Edit Stopwatch', + editTitle_title: 'Edit Title', + editUsername_title: 'Edit Username', + hideDetails: 'Hide details', + import: 'Import', + leaveBoard: 'Leave board', + leaveProject: 'Leave project', + logOut_title: 'Log Out', + makeCover_title: 'Make Cover', + move: 'Move', + moveCard_title: 'Move Card', + remove: 'Remove', + removeBackground: 'Remove background', + removeCover_title: 'Remove Cover', + removeFromBoard: 'Remove from board', + removeFromProject: 'Remove from project', + removeManager: 'Remove manager', + removeMember: 'Remove member', + save: 'Save', + showAllAttachments: 'Show all attachments ({{hidden}} hidden)', + showDetails: 'Show details', + showFewerAttachments: 'Show fewer attachments', + start: 'Start', + stop: 'Stop', + subscribe: 'Subscribe', + unsubscribe: 'Unsubscribe', + uploadNewAvatar: 'Upload new avatar', + uploadNewImage: 'Upload new image', + }, + }, +}; diff --git a/client/src/locales/fr/core.js b/client/src/locales/fr/core.js index 1b9296f..c8353b5 100644 --- a/client/src/locales/fr/core.js +++ b/client/src/locales/fr/core.js @@ -1,201 +1,201 @@ -import dateFns from 'date-fns/locale/fr'; - -export default { - dateFns, - - format: { - date: 'P', - time: 'HH:mm', - dateTime: '$t(format:date) $t(format:time)', - longDate: 'd MMM', - longDateTime: "d MMMM 'à' p", - fullDate: 'd MMM y', - fullDateTime: "d MMMM y 'à' p", - }, - - translation: { - common: { - account: 'Compte', - actions: 'Actions', - addAttachment_title: 'Ajouter une pièce jointe', - addComment: 'Ajouter un commentaire', - addMember_title: 'Ajouter un membre', - addUser_title: 'Ajouter un utilisateur', - administrator: 'Administrateur', - all: 'Tout', - allChangesWillBeAutomaticallySavedAfterConnectionRestored: - 'Toutes les modifications seront automatiquement enregistrées
une fois la connexion rétablie.', - areYouSureYouWantToDeleteThisAttachment: 'Voulez-vous vraiment supprimer cette pièce jointe?', - areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce forum?', - areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?', - areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire?', - areYouSureYouWantToDeleteThisLabel: 'Voulez-vous vraiment supprimer ce libellé?', - areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste?', - areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet?', - areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche?', - areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur?', - areYouSureYouWantToRemoveThisMemberFromProject: - 'Êtes-vous sûr de vouloir supprimer ce membre du projet?', - attachment: 'Attachement', - attachments: 'Pièces jointes', - authentication: 'Authentification', - board: 'Tableau', - boardNotFound_title: 'Carte non trouvée', - cardActions_title: 'Actions sur la carte', - cardNotFound_title: 'Carte non trouvée', - cardOrActionAreDeleted: "La carte ou l'action sont supprimées.", - color: 'Couleur', - createBoard_title: 'Créer un tableau', - createLabel_title: 'Créer une étiquette', - createNewOneOrSelectExistingOne: 'Créez-en un nouveau ou sélectionnez
un existant.', - createProject_title: 'Créer un projet', - createTextFile_title: 'Créer un fichier texte', - currentPassword: 'Mot de passe actuel', - date: 'Date', - dueDate_title: "Date d'échéance", - deleteAttachment_title: 'Supprimer la pièce jointe', - deleteBoard_title: 'Supprimer le tableau', - deleteCard_title: 'Supprimer la carte', - deleteComment_title: 'Supprimer le commentaire', - deleteLabel_title: "Supprimer l'étiquette", - deleteList_title: 'Supprimer la liste', - deleteProject_title: 'Supprimer le projet', - deleteTask_title: 'Supprimer la tâche', - deleteUser_title: "Supprimer l'utilisateur", - description: 'Description', - dropFileToUpload: 'Déposer le fichier à télécharger', - editAttachment_title: 'Modifier la pièce jointe', - editAvatar_title: 'Modifier Avatar', - editBoard_title: 'Modifier le tableau', - editDueDate_title: "Modifier la date d'échéance", - editEmail_title: "Modifier l'e-mail", - editLabel_title: "Modifier l'étiquette", - editPassword_title: 'Modifier le mot de passe', - editStopwatch_title: 'Modifier la minuterie', - editUsername_title: "Modifier le nom d'utilisateur", - email: 'E-mail', - emailAlreadyInUse: 'Email déjà utilisé', - enterCardTitle: 'Entrer le titre de la carte...', - enterDescription: 'Entrez la description...', - enterFilename: 'Entrez le nom du fichier', - enterListTitle: 'Entrer le titre de la liste...', - enterProjectTitle: 'Saisir le titre du projet', - enterTaskDescription: 'Saisir la description de la tâche...', - filterByLabels_title: 'Filtrer par libellés', - filterByMembers_title: 'Filtrer par membres', - fromComputer_title: "Depuis l'ordinateur", - hours: 'Les heures', - invalidCurrentPassword: 'Mot de passe actuel invalide', - labels: 'Étiquettes', - list: 'Lister', - listActions_title: 'Liste des actions', - members: 'Membres', - minutes: 'Minutes', - moveCard_title: 'Déplacer la carte', - name: 'Nom', - newEmail: 'Nouveau courriel', - newPassword: 'Nouveau mot de passe', - newUsername: "Nouveau nom d'utilisateur", - noConnectionToServer: 'Pas de connexion au serveur', - noBoards: 'Pas de planches', - noLists: 'Pas de listes', - noProjects: 'Pas de projets', - notifications: 'Notifications', - noUnreadNotifications: 'Aucune notification non lue.', - openBoard_title: 'Open Board', - optional_inline: 'optionnel', - organization: 'Organisation', - phone: 'Téléphone', - preferences: 'Préférences', - pressPasteShortcutToAddAttachmentFromClipboard: 'Conseil', - project: 'Projet', - projectNotFound_title: 'Projet introuvable', - removeMember_title: 'Supprimer le membre', - seconds: 'Secondes', - selectBoard: 'Sélectionner une carte', - selectList: 'Sélectionner une liste', - selectProject: 'Sélectionner un projet', - settings: 'Réglages', - stopwatch: 'Minuteur', - subscribeToMyOwnCardsByDefault: 'Abonnez-vous à mes propres cartes par défaut', - taskActions_title: 'Actions de tâche', - tasks: 'Tâches', - time: 'Temps', - title: 'Titre', - userActions_title: "Actions de l'utilisateur", - userAddedThisCardToList: '<0> {{user}} <1> a ajouté cette carte à {{list}} ', - userLeftNewCommentToCard: - '{{user}} a laissé un nouveau commentaire {{comment}} à <2> {{card}} ', - userMovedCardFromListToList: - '{{user}} a déplacé <2> {{card}} de {{fromList}} vers {{toList}}', - userMovedThisCardFromListToList: - '<0> {{user}} <1> a déplacé cette carte de {{fromList}} vers {{toList}} ', - username: "Nom d'utilisateur", - usernameAlreadyInUse: "Nom d'utilisateur déjà utilisé", - users: 'Utilisateurs', - writeComment: 'Écrire un commentaire...', - }, - - action: { - addAnotherCard: 'Ajouter une autre carte', - addAnotherList: 'Ajouter une autre liste', - addAnotherTask: 'Ajouter une autre tâche', - addCard: 'Ajouter une carte', - addCard_title: 'Ajouter une carte', - addComment: 'Ajouter un commentaire', - addList: 'Ajouter la liste', - addMoreDetailedDescription: 'Ajouter une description plus détaillée', - addTask: 'Ajouter une tâche', - addToCard: 'Ajouter à la carte', - addUser: 'Ajouter un utilisateur', - createBoard: 'Créer un tableau', - createFile: 'Créer un fichier', - createLabel: 'Créer une étiquette', - createNewLabel: 'Créer une nouvelle étiquette', - createProject: 'Créer un projet', - delete: 'Supprimer', - deleteAttachment: 'Supprimer la pièce jointe', - deleteAvatar: "Supprimer l'avatar", - deleteBoard: 'Supprimer le tableau', - deleteCard: 'Supprimer la carte', - deleteCard_title: 'Supprimer la carte', - deleteComment: 'Supprimer le commentaire', - deleteImage: "Supprimer l'image", - deleteLabel: "Supprimer l'étiquette", - deleteList: 'Supprimer la liste', - deleteList_title: 'Supprimer la liste', - deleteProject: 'Supprimer le projet', - deleteProject_title: 'Supprimer le projet', - deleteTask: 'Supprimer la tâche', - deleteTask_title: 'Supprimer la tâche', - deleteUser: "Supprimer l'utilisateur", - duplicate: 'Dupliquer', - edit: 'Modifier', - editDueDate_title: "Modifier la date d'échéance", - editDescription_title: 'Éditer la description', - editEmail_title: "Modifier l'e-mail", - editPassword_title: 'Modifier le mot de passe', - editStopwatch_title: 'Modifier la minuterie', - editTitle_title: 'Modifier le titre', - editUsername_title: "Modifier le nom d'utilisateur", - logOut_title: 'Se déconnecter', - makeCover_title: 'Faire la jaquette', - move: 'Déplacer', - moveCard_title: 'Déplacer la carte', - remove: 'Supprimer', - removeBackground: "Supprimer l'arrière-plan", - removeCover_title: 'Supprimer la jaquette', - removeFromProject: 'Supprimer du projet', - removeMember: 'Supprimer le membre', - save: 'Sauvegarder', - showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)', - showFewerAttachments: 'Afficher moins de pièces jointes', - start: 'Début', - stop: 'Arrêter', - subscribe: "S'abonner", - unsubscribe: 'Se désabonner', - uploadNewAvatar: 'Télécharger un nouvel avatar', - uploadNewImage: 'Télécharger une nouvelle image', - }, - }, -}; +import dateFns from 'date-fns/locale/fr'; + +export default { + dateFns, + + format: { + date: 'P', + time: 'HH:mm', + dateTime: '$t(format:date) $t(format:time)', + longDate: 'd MMM', + longDateTime: "d MMMM 'à' p", + fullDate: 'd MMM y', + fullDateTime: "d MMMM y 'à' p", + }, + + translation: { + common: { + account: 'Compte', + actions: 'Actions', + addAttachment_title: 'Ajouter une pièce jointe', + addComment: 'Ajouter un commentaire', + addMember_title: 'Ajouter un membre', + addUser_title: 'Ajouter un utilisateur', + administrator: 'Administrateur', + all: 'Tout', + allChangesWillBeAutomaticallySavedAfterConnectionRestored: + 'Toutes les modifications seront automatiquement enregistrées
une fois la connexion rétablie.', + areYouSureYouWantToDeleteThisAttachment: 'Voulez-vous vraiment supprimer cette pièce jointe?', + areYouSureYouWantToDeleteThisBoard: 'Êtes-vous sûr de vouloir supprimer ce forum?', + areYouSureYouWantToDeleteThisCard: 'Voulez-vous vraiment supprimer cette carte?', + areYouSureYouWantToDeleteThisComment: 'Êtes-vous sûr de vouloir supprimer ce commentaire?', + areYouSureYouWantToDeleteThisLabel: 'Voulez-vous vraiment supprimer ce libellé?', + areYouSureYouWantToDeleteThisList: 'Êtes-vous sûr de vouloir supprimer cette liste?', + areYouSureYouWantToDeleteThisProject: 'Êtes-vous sûr de vouloir supprimer ce projet?', + areYouSureYouWantToDeleteThisTask: 'Êtes-vous sûr de vouloir supprimer cette tâche?', + areYouSureYouWantToDeleteThisUser: 'Êtes-vous sûr de vouloir supprimer cet utilisateur?', + areYouSureYouWantToRemoveThisMemberFromProject: + 'Êtes-vous sûr de vouloir supprimer ce membre du projet?', + attachment: 'Attachement', + attachments: 'Pièces jointes', + authentication: 'Authentification', + board: 'Tableau', + boardNotFound_title: 'Carte non trouvée', + cardActions_title: 'Actions sur la carte', + cardNotFound_title: 'Carte non trouvée', + cardOrActionAreDeleted: "La carte ou l'action sont supprimées.", + color: 'Couleur', + createBoard_title: 'Créer un tableau', + createLabel_title: 'Créer une étiquette', + createNewOneOrSelectExistingOne: 'Créez-en un nouveau ou sélectionnez
un existant.', + createProject_title: 'Créer un projet', + createTextFile_title: 'Créer un fichier texte', + currentPassword: 'Mot de passe actuel', + date: 'Date', + dueDate_title: "Date d'échéance", + deleteAttachment_title: 'Supprimer la pièce jointe', + deleteBoard_title: 'Supprimer le tableau', + deleteCard_title: 'Supprimer la carte', + deleteComment_title: 'Supprimer le commentaire', + deleteLabel_title: "Supprimer l'étiquette", + deleteList_title: 'Supprimer la liste', + deleteProject_title: 'Supprimer le projet', + deleteTask_title: 'Supprimer la tâche', + deleteUser_title: "Supprimer l'utilisateur", + description: 'Description', + dropFileToUpload: 'Déposer le fichier à télécharger', + editAttachment_title: 'Modifier la pièce jointe', + editAvatar_title: 'Modifier Avatar', + editBoard_title: 'Modifier le tableau', + editDueDate_title: "Modifier la date d'échéance", + editEmail_title: "Modifier l'e-mail", + editLabel_title: "Modifier l'étiquette", + editPassword_title: 'Modifier le mot de passe', + editStopwatch_title: 'Modifier la minuterie', + editUsername_title: "Modifier le nom d'utilisateur", + email: 'E-mail', + emailAlreadyInUse: 'Email déjà utilisé', + enterCardTitle: 'Entrer le titre de la carte...', + enterDescription: 'Entrez la description...', + enterFilename: 'Entrez le nom du fichier', + enterListTitle: 'Entrer le titre de la liste...', + enterProjectTitle: 'Saisir le titre du projet', + enterTaskDescription: 'Saisir la description de la tâche...', + filterByLabels_title: 'Filtrer par libellés', + filterByMembers_title: 'Filtrer par membres', + fromComputer_title: "Depuis l'ordinateur", + hours: 'Les heures', + invalidCurrentPassword: 'Mot de passe actuel invalide', + labels: 'Étiquettes', + list: 'Lister', + listActions_title: 'Liste des actions', + members: 'Membres', + minutes: 'Minutes', + moveCard_title: 'Déplacer la carte', + name: 'Nom', + newEmail: 'Nouveau courriel', + newPassword: 'Nouveau mot de passe', + newUsername: "Nouveau nom d'utilisateur", + noConnectionToServer: 'Pas de connexion au serveur', + noBoards: 'Pas de planches', + noLists: 'Pas de listes', + noProjects: 'Pas de projets', + notifications: 'Notifications', + noUnreadNotifications: 'Aucune notification non lue.', + openBoard_title: 'Open Board', + optional_inline: 'optionnel', + organization: 'Organisation', + phone: 'Téléphone', + preferences: 'Préférences', + pressPasteShortcutToAddAttachmentFromClipboard: 'Conseil', + project: 'Projet', + projectNotFound_title: 'Projet introuvable', + removeMember_title: 'Supprimer le membre', + seconds: 'Secondes', + selectBoard: 'Sélectionner une carte', + selectList: 'Sélectionner une liste', + selectProject: 'Sélectionner un projet', + settings: 'Réglages', + stopwatch: 'Minuteur', + subscribeToMyOwnCardsByDefault: 'Abonnez-vous à mes propres cartes par défaut', + taskActions_title: 'Actions de tâche', + tasks: 'Tâches', + time: 'Temps', + title: 'Titre', + userActions_title: "Actions de l'utilisateur", + userAddedThisCardToList: '<0> {{user}} <1> a ajouté cette carte à {{list}} ', + userLeftNewCommentToCard: + '{{user}} a laissé un nouveau commentaire {{comment}} à <2> {{card}} ', + userMovedCardFromListToList: + '{{user}} a déplacé <2> {{card}} de {{fromList}} vers {{toList}}', + userMovedThisCardFromListToList: + '<0> {{user}} <1> a déplacé cette carte de {{fromList}} vers {{toList}} ', + username: "Nom d'utilisateur", + usernameAlreadyInUse: "Nom d'utilisateur déjà utilisé", + users: 'Utilisateurs', + writeComment: 'Écrire un commentaire...', + }, + + action: { + addAnotherCard: 'Ajouter une autre carte', + addAnotherList: 'Ajouter une autre liste', + addAnotherTask: 'Ajouter une autre tâche', + addCard: 'Ajouter une carte', + addCard_title: 'Ajouter une carte', + addComment: 'Ajouter un commentaire', + addList: 'Ajouter la liste', + addMoreDetailedDescription: 'Ajouter une description plus détaillée', + addTask: 'Ajouter une tâche', + addToCard: 'Ajouter à la carte', + addUser: 'Ajouter un utilisateur', + createBoard: 'Créer un tableau', + createFile: 'Créer un fichier', + createLabel: 'Créer une étiquette', + createNewLabel: 'Créer une nouvelle étiquette', + createProject: 'Créer un projet', + delete: 'Supprimer', + deleteAttachment: 'Supprimer la pièce jointe', + deleteAvatar: "Supprimer l'avatar", + deleteBoard: 'Supprimer le tableau', + deleteCard: 'Supprimer la carte', + deleteCard_title: 'Supprimer la carte', + deleteComment: 'Supprimer le commentaire', + deleteImage: "Supprimer l'image", + deleteLabel: "Supprimer l'étiquette", + deleteList: 'Supprimer la liste', + deleteList_title: 'Supprimer la liste', + deleteProject: 'Supprimer le projet', + deleteProject_title: 'Supprimer le projet', + deleteTask: 'Supprimer la tâche', + deleteTask_title: 'Supprimer la tâche', + deleteUser: "Supprimer l'utilisateur", + duplicate: 'Dupliquer', + edit: 'Modifier', + editDueDate_title: "Modifier la date d'échéance", + editDescription_title: 'Éditer la description', + editEmail_title: "Modifier l'e-mail", + editPassword_title: 'Modifier le mot de passe', + editStopwatch_title: 'Modifier la minuterie', + editTitle_title: 'Modifier le titre', + editUsername_title: "Modifier le nom d'utilisateur", + logOut_title: 'Se déconnecter', + makeCover_title: 'Faire la jaquette', + move: 'Déplacer', + moveCard_title: 'Déplacer la carte', + remove: 'Supprimer', + removeBackground: "Supprimer l'arrière-plan", + removeCover_title: 'Supprimer la jaquette', + removeFromProject: 'Supprimer du projet', + removeMember: 'Supprimer le membre', + save: 'Sauvegarder', + showAllAttachments: 'Afficher toutes les pièces jointes ({{hidden}} masquées)', + showFewerAttachments: 'Afficher moins de pièces jointes', + start: 'Début', + stop: 'Arrêter', + subscribe: "S'abonner", + unsubscribe: 'Se désabonner', + uploadNewAvatar: 'Télécharger un nouvel avatar', + uploadNewImage: 'Télécharger une nouvelle image', + }, + }, +}; diff --git a/client/src/models/Card.js b/client/src/models/Card.js index 3c45256..867df26 100755 --- a/client/src/models/Card.js +++ b/client/src/models/Card.js @@ -1,358 +1,358 @@ -import pick from 'lodash/pick'; -import { attr, fk, many, oneToOne } from 'redux-orm'; - -import BaseModel from './BaseModel'; -import ActionTypes from '../constants/ActionTypes'; -import Config from '../constants/Config'; -import { ActivityTypes } from '../constants/Enums'; - -export default class extends BaseModel { - static modelName = 'Card'; - - static fields = { - id: attr(), - position: attr(), - name: attr(), - description: attr(), - dueDate: attr(), - stopwatch: attr(), - isSubscribed: attr({ - getDefault: () => false, - }), - isActivitiesFetching: attr({ - getDefault: () => false, - }), - isAllActivitiesFetched: attr({ - getDefault: () => false, - }), - isActivitiesDetailsVisible: attr({ - getDefault: () => false, - }), - isActivitiesDetailsFetching: attr({ - getDefault: () => false, - }), - boardId: fk({ - to: 'Board', - as: 'board', - relatedName: 'cards', - }), - listId: fk({ - to: 'List', - as: 'list', - relatedName: 'cards', - }), - coverAttachmentId: oneToOne({ - to: 'Attachment', - as: 'coverAttachment', - relatedName: 'coveredCard', - }), - users: many('User', 'cards'), - labels: many('Label', 'cards'), - }; - - static reducer({ type, payload }, Card) { - switch (type) { - case ActionTypes.LOCATION_CHANGE_HANDLE: - case ActionTypes.CORE_INITIALIZE: - case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: - case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: - if (payload.cards) { - payload.cards.forEach((card) => { - Card.upsert(card); - }); - } - - if (payload.cardMemberships) { - payload.cardMemberships.forEach(({ cardId, userId }) => { - Card.withId(cardId).users.add(userId); - }); - } - - if (payload.cardLabels) { - payload.cardLabels.forEach(({ cardId, labelId }) => { - Card.withId(cardId).labels.add(labelId); - }); - } - - break; - case ActionTypes.SOCKET_RECONNECT_HANDLE: - Card.all() - .toModelArray() - .forEach((cardModel) => { - cardModel.deleteWithClearable(); - }); - - if (payload.cards) { - payload.cards.forEach((card) => { - Card.upsert(card); - }); - } - - if (payload.cardMemberships) { - payload.cardMemberships.forEach(({ cardId, userId }) => { - Card.withId(cardId).users.add(userId); - }); - } - - if (payload.cardLabels) { - payload.cardLabels.forEach(({ cardId, labelId }) => { - Card.withId(cardId).labels.add(labelId); - }); - } - - break; - case ActionTypes.USER_TO_CARD_ADD: { - const cardModel = Card.withId(payload.cardId); - cardModel.users.add(payload.id); - - if (payload.isCurrent) { - cardModel.isSubscribed = true; - } - - break; - } - case ActionTypes.USER_TO_CARD_ADD__SUCCESS: - case ActionTypes.USER_TO_CARD_ADD_HANDLE: - try { - Card.withId(payload.cardMembership.cardId).users.add(payload.cardMembership.userId); - } catch {} // eslint-disable-line no-empty - - break; - case ActionTypes.USER_FROM_CARD_REMOVE: - Card.withId(payload.cardId).users.remove(payload.id); - - break; - case ActionTypes.USER_FROM_CARD_REMOVE__SUCCESS: - case ActionTypes.USER_FROM_CARD_REMOVE_HANDLE: - try { - Card.withId(payload.cardMembership.cardId).users.remove(payload.cardMembership.userId); - } catch {} // eslint-disable-line no-empty - - break; - case ActionTypes.BOARD_FETCH__SUCCESS: - payload.cards.forEach((card) => { - Card.upsert(card); - }); - - payload.cardMemberships.forEach(({ cardId, userId }) => { - Card.withId(cardId).users.add(userId); - }); - - payload.cardLabels.forEach(({ cardId, labelId }) => { - Card.withId(cardId).labels.add(labelId); - }); - - break; - case ActionTypes.LABEL_TO_CARD_ADD: - Card.withId(payload.cardId).labels.add(payload.id); - - break; - case ActionTypes.LABEL_TO_CARD_ADD__SUCCESS: - case ActionTypes.LABEL_TO_CARD_ADD_HANDLE: - try { - Card.withId(payload.cardLabel.cardId).labels.add(payload.cardLabel.labelId); - } catch {} // eslint-disable-line no-empty - - break; - case ActionTypes.LABEL_FROM_CARD_REMOVE: - Card.withId(payload.cardId).labels.remove(payload.id); - - break; - case ActionTypes.LABEL_FROM_CARD_REMOVE__SUCCESS: - case ActionTypes.LABEL_FROM_CARD_REMOVE_HANDLE: - try { - Card.withId(payload.cardLabel.cardId).labels.remove(payload.cardLabel.labelId); - } catch {} // eslint-disable-line no-empty - - break; - case ActionTypes.CARD_CREATE: - case ActionTypes.CARD_UPDATE__SUCCESS: - case ActionTypes.CARD_UPDATE_HANDLE: - Card.upsert(payload.card); - - break; - case ActionTypes.CARD_CREATE__SUCCESS: - Card.withId(payload.localId).delete(); - Card.upsert(payload.card); - - break; - case ActionTypes.CARD_CREATE_HANDLE: { - const cardModel = Card.upsert(payload.card); - - payload.cardMemberships.forEach(({ userId }) => { - cardModel.users.add(userId); - }); - - payload.cardLabels.forEach(({ labelId }) => { - cardModel.labels.add(labelId); - }); - - break; - } - case ActionTypes.CARD_UPDATE: - Card.withId(payload.id).update(payload.data); - - break; - case ActionTypes.CARD_DUPLICATE: { - const cardModel = Card.withId(payload.id); - - const nextCardModel = Card.upsert({ - ...pick(cardModel.ref, [ - 'boardId', - 'listId', - 'position', - 'name', - 'description', - 'dueDate', - 'stopwatch', - ]), - ...payload.card, - }); - - cardModel.users.toRefArray().forEach(({ id }) => { - nextCardModel.users.add(id); - }); - - cardModel.labels.toRefArray().forEach(({ id }) => { - nextCardModel.labels.add(id); - }); - - break; - } - case ActionTypes.CARD_DUPLICATE__SUCCESS: { - Card.withId(payload.localId).deleteWithRelated(); - const cardModel = Card.upsert(payload.card); - - payload.cardMemberships.forEach(({ userId }) => { - cardModel.users.add(userId); - }); - - payload.cardLabels.forEach(({ labelId }) => { - cardModel.labels.add(labelId); - }); - - break; - } - case ActionTypes.CARD_DELETE: - Card.withId(payload.id).deleteWithRelated(); - - break; - case ActionTypes.CARD_DELETE__SUCCESS: - case ActionTypes.CARD_DELETE_HANDLE: { - const cardModel = Card.withId(payload.card.id); - - if (cardModel) { - cardModel.deleteWithRelated(); - } - - break; - } - case ActionTypes.ACTIVITIES_FETCH: - Card.withId(payload.cardId).update({ - isActivitiesFetching: true, - }); - - break; - case ActionTypes.ACTIVITIES_FETCH__SUCCESS: - Card.withId(payload.cardId).update({ - isActivitiesFetching: false, - isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, - }); - - break; - case ActionTypes.ACTIVITIES_DETAILS_TOGGLE: { - const cardModel = Card.withId(payload.cardId); - cardModel.isActivitiesDetailsVisible = payload.isVisible; - - if (payload.isVisible) { - cardModel.isActivitiesDetailsFetching = true; - } - - break; - } - case ActionTypes.ACTIVITIES_DETAILS_TOGGLE__SUCCESS: { - const cardModel = Card.withId(payload.cardId); - - cardModel.update({ - isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, - isActivitiesDetailsFetching: false, - }); - - cardModel.deleteActivities(); - - break; - } - case ActionTypes.NOTIFICATION_CREATE_HANDLE: - payload.cards.forEach((card) => { - Card.upsert(card); - }); - - break; - default: - } - } - - getOrderedTasksQuerySet() { - return this.tasks.orderBy('position'); - } - - getOrderedAttachmentsQuerySet() { - return this.attachments.orderBy('createdAt', false); - } - - getFilteredOrderedInCardActivitiesQuerySet() { - const filter = { - isInCard: true, - }; - - if (!this.isActivitiesDetailsVisible) { - filter.type = ActivityTypes.COMMENT_CARD; - } - - return this.activities.filter(filter).orderBy('createdAt', false); - } - - getUnreadNotificationsQuerySet() { - return this.notifications.filter({ - isRead: false, - }); - } - - isAvailableForUser(userId) { - return this.board && this.board.isAvailableForUser(userId); - } - - deleteClearable() { - this.users.clear(); - this.labels.clear(); - } - - deleteActivities() { - this.activities.toModelArray().forEach((activityModel) => { - if (activityModel.notification) { - activityModel.update({ - isInCard: false, - }); - } else { - activityModel.delete(); - } - }); - } - - deleteRelated() { - this.deleteClearable(); - this.tasks.delete(); - this.attachments.delete(); - this.deleteActivities(); - } - - deleteWithClearable() { - this.deleteClearable(); - this.delete(); - } - - deleteWithRelated() { - this.deleteRelated(); - this.delete(); - } -} +import pick from 'lodash/pick'; +import { attr, fk, many, oneToOne } from 'redux-orm'; + +import BaseModel from './BaseModel'; +import ActionTypes from '../constants/ActionTypes'; +import Config from '../constants/Config'; +import { ActivityTypes } from '../constants/Enums'; + +export default class extends BaseModel { + static modelName = 'Card'; + + static fields = { + id: attr(), + position: attr(), + name: attr(), + description: attr(), + dueDate: attr(), + stopwatch: attr(), + isSubscribed: attr({ + getDefault: () => false, + }), + isActivitiesFetching: attr({ + getDefault: () => false, + }), + isAllActivitiesFetched: attr({ + getDefault: () => false, + }), + isActivitiesDetailsVisible: attr({ + getDefault: () => false, + }), + isActivitiesDetailsFetching: attr({ + getDefault: () => false, + }), + boardId: fk({ + to: 'Board', + as: 'board', + relatedName: 'cards', + }), + listId: fk({ + to: 'List', + as: 'list', + relatedName: 'cards', + }), + coverAttachmentId: oneToOne({ + to: 'Attachment', + as: 'coverAttachment', + relatedName: 'coveredCard', + }), + users: many('User', 'cards'), + labels: many('Label', 'cards'), + }; + + static reducer({ type, payload }, Card) { + switch (type) { + case ActionTypes.LOCATION_CHANGE_HANDLE: + case ActionTypes.CORE_INITIALIZE: + case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: + case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: + if (payload.cards) { + payload.cards.forEach((card) => { + Card.upsert(card); + }); + } + + if (payload.cardMemberships) { + payload.cardMemberships.forEach(({ cardId, userId }) => { + Card.withId(cardId).users.add(userId); + }); + } + + if (payload.cardLabels) { + payload.cardLabels.forEach(({ cardId, labelId }) => { + Card.withId(cardId).labels.add(labelId); + }); + } + + break; + case ActionTypes.SOCKET_RECONNECT_HANDLE: + Card.all() + .toModelArray() + .forEach((cardModel) => { + cardModel.deleteWithClearable(); + }); + + if (payload.cards) { + payload.cards.forEach((card) => { + Card.upsert(card); + }); + } + + if (payload.cardMemberships) { + payload.cardMemberships.forEach(({ cardId, userId }) => { + Card.withId(cardId).users.add(userId); + }); + } + + if (payload.cardLabels) { + payload.cardLabels.forEach(({ cardId, labelId }) => { + Card.withId(cardId).labels.add(labelId); + }); + } + + break; + case ActionTypes.USER_TO_CARD_ADD: { + const cardModel = Card.withId(payload.cardId); + cardModel.users.add(payload.id); + + if (payload.isCurrent) { + cardModel.isSubscribed = true; + } + + break; + } + case ActionTypes.USER_TO_CARD_ADD__SUCCESS: + case ActionTypes.USER_TO_CARD_ADD_HANDLE: + try { + Card.withId(payload.cardMembership.cardId).users.add(payload.cardMembership.userId); + } catch {} // eslint-disable-line no-empty + + break; + case ActionTypes.USER_FROM_CARD_REMOVE: + Card.withId(payload.cardId).users.remove(payload.id); + + break; + case ActionTypes.USER_FROM_CARD_REMOVE__SUCCESS: + case ActionTypes.USER_FROM_CARD_REMOVE_HANDLE: + try { + Card.withId(payload.cardMembership.cardId).users.remove(payload.cardMembership.userId); + } catch {} // eslint-disable-line no-empty + + break; + case ActionTypes.BOARD_FETCH__SUCCESS: + payload.cards.forEach((card) => { + Card.upsert(card); + }); + + payload.cardMemberships.forEach(({ cardId, userId }) => { + Card.withId(cardId).users.add(userId); + }); + + payload.cardLabels.forEach(({ cardId, labelId }) => { + Card.withId(cardId).labels.add(labelId); + }); + + break; + case ActionTypes.LABEL_TO_CARD_ADD: + Card.withId(payload.cardId).labels.add(payload.id); + + break; + case ActionTypes.LABEL_TO_CARD_ADD__SUCCESS: + case ActionTypes.LABEL_TO_CARD_ADD_HANDLE: + try { + Card.withId(payload.cardLabel.cardId).labels.add(payload.cardLabel.labelId); + } catch {} // eslint-disable-line no-empty + + break; + case ActionTypes.LABEL_FROM_CARD_REMOVE: + Card.withId(payload.cardId).labels.remove(payload.id); + + break; + case ActionTypes.LABEL_FROM_CARD_REMOVE__SUCCESS: + case ActionTypes.LABEL_FROM_CARD_REMOVE_HANDLE: + try { + Card.withId(payload.cardLabel.cardId).labels.remove(payload.cardLabel.labelId); + } catch {} // eslint-disable-line no-empty + + break; + case ActionTypes.CARD_CREATE: + case ActionTypes.CARD_UPDATE__SUCCESS: + case ActionTypes.CARD_UPDATE_HANDLE: + Card.upsert(payload.card); + + break; + case ActionTypes.CARD_CREATE__SUCCESS: + Card.withId(payload.localId).delete(); + Card.upsert(payload.card); + + break; + case ActionTypes.CARD_CREATE_HANDLE: { + const cardModel = Card.upsert(payload.card); + + payload.cardMemberships.forEach(({ userId }) => { + cardModel.users.add(userId); + }); + + payload.cardLabels.forEach(({ labelId }) => { + cardModel.labels.add(labelId); + }); + + break; + } + case ActionTypes.CARD_UPDATE: + Card.withId(payload.id).update(payload.data); + + break; + case ActionTypes.CARD_DUPLICATE: { + const cardModel = Card.withId(payload.id); + + const nextCardModel = Card.upsert({ + ...pick(cardModel.ref, [ + 'boardId', + 'listId', + 'position', + 'name', + 'description', + 'dueDate', + 'stopwatch', + ]), + ...payload.card, + }); + + cardModel.users.toRefArray().forEach(({ id }) => { + nextCardModel.users.add(id); + }); + + cardModel.labels.toRefArray().forEach(({ id }) => { + nextCardModel.labels.add(id); + }); + + break; + } + case ActionTypes.CARD_DUPLICATE__SUCCESS: { + Card.withId(payload.localId).deleteWithRelated(); + const cardModel = Card.upsert(payload.card); + + payload.cardMemberships.forEach(({ userId }) => { + cardModel.users.add(userId); + }); + + payload.cardLabels.forEach(({ labelId }) => { + cardModel.labels.add(labelId); + }); + + break; + } + case ActionTypes.CARD_DELETE: + Card.withId(payload.id).deleteWithRelated(); + + break; + case ActionTypes.CARD_DELETE__SUCCESS: + case ActionTypes.CARD_DELETE_HANDLE: { + const cardModel = Card.withId(payload.card.id); + + if (cardModel) { + cardModel.deleteWithRelated(); + } + + break; + } + case ActionTypes.ACTIVITIES_FETCH: + Card.withId(payload.cardId).update({ + isActivitiesFetching: true, + }); + + break; + case ActionTypes.ACTIVITIES_FETCH__SUCCESS: + Card.withId(payload.cardId).update({ + isActivitiesFetching: false, + isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, + }); + + break; + case ActionTypes.ACTIVITIES_DETAILS_TOGGLE: { + const cardModel = Card.withId(payload.cardId); + cardModel.isActivitiesDetailsVisible = payload.isVisible; + + if (payload.isVisible) { + cardModel.isActivitiesDetailsFetching = true; + } + + break; + } + case ActionTypes.ACTIVITIES_DETAILS_TOGGLE__SUCCESS: { + const cardModel = Card.withId(payload.cardId); + + cardModel.update({ + isAllActivitiesFetched: payload.activities.length < Config.ACTIVITIES_LIMIT, + isActivitiesDetailsFetching: false, + }); + + cardModel.deleteActivities(); + + break; + } + case ActionTypes.NOTIFICATION_CREATE_HANDLE: + payload.cards.forEach((card) => { + Card.upsert(card); + }); + + break; + default: + } + } + + getOrderedTasksQuerySet() { + return this.tasks.orderBy('position'); + } + + getOrderedAttachmentsQuerySet() { + return this.attachments.orderBy('createdAt', false); + } + + getFilteredOrderedInCardActivitiesQuerySet() { + const filter = { + isInCard: true, + }; + + if (!this.isActivitiesDetailsVisible) { + filter.type = ActivityTypes.COMMENT_CARD; + } + + return this.activities.filter(filter).orderBy('createdAt', false); + } + + getUnreadNotificationsQuerySet() { + return this.notifications.filter({ + isRead: false, + }); + } + + isAvailableForUser(userId) { + return this.board && this.board.isAvailableForUser(userId); + } + + deleteClearable() { + this.users.clear(); + this.labels.clear(); + } + + deleteActivities() { + this.activities.toModelArray().forEach((activityModel) => { + if (activityModel.notification) { + activityModel.update({ + isInCard: false, + }); + } else { + activityModel.delete(); + } + }); + } + + deleteRelated() { + this.deleteClearable(); + this.tasks.delete(); + this.attachments.delete(); + this.deleteActivities(); + } + + deleteWithClearable() { + this.deleteClearable(); + this.delete(); + } + + deleteWithRelated() { + this.deleteRelated(); + this.delete(); + } +} diff --git a/client/src/models/Task.js b/client/src/models/Task.js index b990fe2..0c9dc37 100755 --- a/client/src/models/Task.js +++ b/client/src/models/Task.js @@ -1,100 +1,100 @@ -import { attr, fk } from 'redux-orm'; - -import { createLocalId } from '../utils/local-id'; -import BaseModel from './BaseModel'; -import ActionTypes from '../constants/ActionTypes'; - -export default class extends BaseModel { - static modelName = 'Task'; - - static fields = { - id: attr(), - position: attr(), - name: attr(), - isCompleted: attr({ - getDefault: () => false, - }), - cardId: fk({ - to: 'Card', - as: 'card', - relatedName: 'tasks', - }), - }; - - static reducer({ type, payload }, Task) { - switch (type) { - case ActionTypes.LOCATION_CHANGE_HANDLE: - case ActionTypes.CORE_INITIALIZE: - case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: - case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: - if (payload.tasks) { - payload.tasks.forEach((task) => { - Task.upsert(task); - }); - } - - break; - case ActionTypes.SOCKET_RECONNECT_HANDLE: - Task.all().delete(); - - if (payload.tasks) { - payload.tasks.forEach((task) => { - Task.upsert(task); - }); - } - - break; - case ActionTypes.BOARD_FETCH__SUCCESS: - case ActionTypes.CARD_CREATE_HANDLE: - case ActionTypes.CARD_DUPLICATE__SUCCESS: - payload.tasks.forEach((task) => { - Task.upsert(task); - }); - - break; - case ActionTypes.CARD_DUPLICATE: - payload.taskIds.forEach((taskId, index) => { - const taskModel = Task.withId(taskId); - - Task.upsert({ - ...taskModel.ref, - id: `${createLocalId()}-${index}`, // TODO: hack? - cardId: payload.card.id, - }); - }); - - break; - case ActionTypes.TASK_CREATE: - case ActionTypes.TASK_CREATE_HANDLE: - case ActionTypes.TASK_UPDATE__SUCCESS: - case ActionTypes.TASK_UPDATE_HANDLE: - Task.upsert(payload.task); - - break; - case ActionTypes.TASK_CREATE__SUCCESS: - Task.withId(payload.localId).delete(); - Task.upsert(payload.task); - - break; - case ActionTypes.TASK_UPDATE: - Task.withId(payload.id).update(payload.data); - - break; - case ActionTypes.TASK_DELETE: - Task.withId(payload.id).delete(); - - break; - case ActionTypes.TASK_DELETE__SUCCESS: - case ActionTypes.TASK_DELETE_HANDLE: { - const taskModel = Task.withId(payload.task.id); - - if (taskModel) { - taskModel.delete(); - } - - break; - } - default: - } - } -} +import { attr, fk } from 'redux-orm'; + +import { createLocalId } from '../utils/local-id'; +import BaseModel from './BaseModel'; +import ActionTypes from '../constants/ActionTypes'; + +export default class extends BaseModel { + static modelName = 'Task'; + + static fields = { + id: attr(), + position: attr(), + name: attr(), + isCompleted: attr({ + getDefault: () => false, + }), + cardId: fk({ + to: 'Card', + as: 'card', + relatedName: 'tasks', + }), + }; + + static reducer({ type, payload }, Task) { + switch (type) { + case ActionTypes.LOCATION_CHANGE_HANDLE: + case ActionTypes.CORE_INITIALIZE: + case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: + case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: + if (payload.tasks) { + payload.tasks.forEach((task) => { + Task.upsert(task); + }); + } + + break; + case ActionTypes.SOCKET_RECONNECT_HANDLE: + Task.all().delete(); + + if (payload.tasks) { + payload.tasks.forEach((task) => { + Task.upsert(task); + }); + } + + break; + case ActionTypes.BOARD_FETCH__SUCCESS: + case ActionTypes.CARD_CREATE_HANDLE: + case ActionTypes.CARD_DUPLICATE__SUCCESS: + payload.tasks.forEach((task) => { + Task.upsert(task); + }); + + break; + case ActionTypes.CARD_DUPLICATE: + payload.taskIds.forEach((taskId, index) => { + const taskModel = Task.withId(taskId); + + Task.upsert({ + ...taskModel.ref, + id: `${createLocalId()}-${index}`, // TODO: hack? + cardId: payload.card.id, + }); + }); + + break; + case ActionTypes.TASK_CREATE: + case ActionTypes.TASK_CREATE_HANDLE: + case ActionTypes.TASK_UPDATE__SUCCESS: + case ActionTypes.TASK_UPDATE_HANDLE: + Task.upsert(payload.task); + + break; + case ActionTypes.TASK_CREATE__SUCCESS: + Task.withId(payload.localId).delete(); + Task.upsert(payload.task); + + break; + case ActionTypes.TASK_UPDATE: + Task.withId(payload.id).update(payload.data); + + break; + case ActionTypes.TASK_DELETE: + Task.withId(payload.id).delete(); + + break; + case ActionTypes.TASK_DELETE__SUCCESS: + case ActionTypes.TASK_DELETE_HANDLE: { + const taskModel = Task.withId(payload.task.id); + + if (taskModel) { + taskModel.delete(); + } + + break; + } + default: + } + } +} diff --git a/client/src/sagas/core/services/cards.js b/client/src/sagas/core/services/cards.js index eb2d1da..6297bf5 100644 --- a/client/src/sagas/core/services/cards.js +++ b/client/src/sagas/core/services/cards.js @@ -1,225 +1,225 @@ -import { call, put, select } from 'redux-saga/effects'; - -import { goToBoard, goToCard } from './router'; -import request from '../request'; -import selectors from '../../../selectors'; -import actions from '../../../actions'; -import api from '../../../api'; -import i18n from '../../../i18n'; -import { createLocalId } from '../../../utils/local-id'; - -export function* createCard(listId, data, autoOpen) { - const { boardId } = yield select(selectors.selectListById, listId); - - const nextData = { - ...data, - position: yield select(selectors.selectNextCardPosition, listId), - }; - - const localId = yield call(createLocalId); - - yield put( - actions.createCard({ - ...nextData, - boardId, - listId, - id: localId, - }), - ); - - let card; - try { - ({ item: card } = yield call(request, api.createCard, listId, nextData)); - } catch (error) { - yield put(actions.createCard.failure(localId, error)); - return; - } - - yield put(actions.createCard.success(localId, card)); - - if (autoOpen) { - yield call(goToCard, card.id); - } -} - -export function* handleCardCreate({ id }) { - let card; - let cardMemberships; - let cardLabels; - let tasks; - let attachments; - - try { - ({ - item: card, - included: { cardMemberships, cardLabels, tasks, attachments }, - } = yield call(request, api.getCard, id)); - } catch (error) { - return; - } - - yield put(actions.handleCardCreate(card, cardMemberships, cardLabels, tasks, attachments)); -} - -export function* updateCard(id, data) { - yield put(actions.updateCard(id, data)); - - let card; - try { - ({ item: card } = yield call(request, api.updateCard, id, data)); - } catch (error) { - yield put(actions.updateCard.failure(id, error)); - return; - } - - yield put(actions.updateCard.success(card)); -} - -export function* updateCurrentCard(data) { - const { cardId } = yield select(selectors.selectPath); - - yield call(updateCard, cardId, data); -} - -// TODO: handle card transfer -export function* handleCardUpdate(card) { - yield put(actions.handleCardUpdate(card)); -} - -export function* moveCard(id, listId, index) { - const position = yield select(selectors.selectNextCardPosition, listId, index, id); - - yield call(updateCard, id, { - listId, - position, - }); -} - -export function* moveCurrentCard(listId, index) { - const { cardId } = yield select(selectors.selectPath); - - yield call(moveCard, cardId, listId, index); -} - -export function* transferCard(id, boardId, listId, index) { - const { cardId: currentCardId, boardId: currentBoardId } = yield select(selectors.selectPath); - const position = yield select(selectors.selectNextCardPosition, listId, index, id); - - if (id === currentCardId) { - yield call(goToBoard, currentBoardId); - } - - yield call(updateCard, id, { - boardId, - listId, - position, - }); -} - -export function* transferCurrentCard(boardId, listId, index) { - const { cardId } = yield select(selectors.selectPath); - - yield call(transferCard, cardId, boardId, listId, index); -} - -export function* duplicateCard(id) { - const { listId, name } = yield select(selectors.selectCardById, id); - const index = yield select(selectors.selectCardIndexById, id); - - const nextData = { - position: yield select(selectors.selectNextCardPosition, listId, index + 1), - name: `${name} (${i18n.t('common.copy', { - context: 'inline', - })})`, - }; - - const localId = yield call(createLocalId); - const taskIds = yield select(selectors.selectTaskIdsByCardId, id); - - yield put( - actions.duplicateCard( - id, - { - ...nextData, - id: localId, - }, - taskIds, - ), - ); - - let card; - let cardMemberships; - let cardLabels; - let tasks; - - try { - ({ - item: card, - included: { cardMemberships, cardLabels, tasks }, - } = yield call(request, api.duplicateCard, id, nextData)); - } catch (error) { - yield put(actions.duplicateCard.failure(localId, error)); - return; - } - - yield put(actions.duplicateCard.success(localId, card, cardMemberships, cardLabels, tasks)); -} - -export function* duplicateCurrentCard() { - const { cardId } = yield select(selectors.selectPath); - - yield call(duplicateCard, cardId); -} - -export function* deleteCard(id) { - const { cardId, boardId } = yield select(selectors.selectPath); - - if (id === cardId) { - yield call(goToBoard, boardId); - } - - yield put(actions.deleteCard(id)); - - let card; - try { - ({ item: card } = yield call(request, api.deleteCard, id)); - } catch (error) { - yield put(actions.deleteCard.failure(id, error)); - return; - } - - yield put(actions.deleteCard.success(card)); -} - -export function* deleteCurrentCard() { - const { cardId } = yield select(selectors.selectPath); - - yield call(deleteCard, cardId); -} - -export function* handleCardDelete(card) { - const { cardId, boardId } = yield select(selectors.selectPath); - - if (card.id === cardId) { - yield call(goToBoard, boardId); - } - - yield put(actions.handleCardDelete(card)); -} - -export default { - createCard, - handleCardCreate, - updateCard, - updateCurrentCard, - handleCardUpdate, - moveCard, - moveCurrentCard, - transferCard, - transferCurrentCard, - duplicateCard, - duplicateCurrentCard, - deleteCard, - deleteCurrentCard, - handleCardDelete, -}; +import { call, put, select } from 'redux-saga/effects'; + +import { goToBoard, goToCard } from './router'; +import request from '../request'; +import selectors from '../../../selectors'; +import actions from '../../../actions'; +import api from '../../../api'; +import i18n from '../../../i18n'; +import { createLocalId } from '../../../utils/local-id'; + +export function* createCard(listId, data, autoOpen) { + const { boardId } = yield select(selectors.selectListById, listId); + + const nextData = { + ...data, + position: yield select(selectors.selectNextCardPosition, listId), + }; + + const localId = yield call(createLocalId); + + yield put( + actions.createCard({ + ...nextData, + boardId, + listId, + id: localId, + }), + ); + + let card; + try { + ({ item: card } = yield call(request, api.createCard, listId, nextData)); + } catch (error) { + yield put(actions.createCard.failure(localId, error)); + return; + } + + yield put(actions.createCard.success(localId, card)); + + if (autoOpen) { + yield call(goToCard, card.id); + } +} + +export function* handleCardCreate({ id }) { + let card; + let cardMemberships; + let cardLabels; + let tasks; + let attachments; + + try { + ({ + item: card, + included: { cardMemberships, cardLabels, tasks, attachments }, + } = yield call(request, api.getCard, id)); + } catch (error) { + return; + } + + yield put(actions.handleCardCreate(card, cardMemberships, cardLabels, tasks, attachments)); +} + +export function* updateCard(id, data) { + yield put(actions.updateCard(id, data)); + + let card; + try { + ({ item: card } = yield call(request, api.updateCard, id, data)); + } catch (error) { + yield put(actions.updateCard.failure(id, error)); + return; + } + + yield put(actions.updateCard.success(card)); +} + +export function* updateCurrentCard(data) { + const { cardId } = yield select(selectors.selectPath); + + yield call(updateCard, cardId, data); +} + +// TODO: handle card transfer +export function* handleCardUpdate(card) { + yield put(actions.handleCardUpdate(card)); +} + +export function* moveCard(id, listId, index) { + const position = yield select(selectors.selectNextCardPosition, listId, index, id); + + yield call(updateCard, id, { + listId, + position, + }); +} + +export function* moveCurrentCard(listId, index) { + const { cardId } = yield select(selectors.selectPath); + + yield call(moveCard, cardId, listId, index); +} + +export function* transferCard(id, boardId, listId, index) { + const { cardId: currentCardId, boardId: currentBoardId } = yield select(selectors.selectPath); + const position = yield select(selectors.selectNextCardPosition, listId, index, id); + + if (id === currentCardId) { + yield call(goToBoard, currentBoardId); + } + + yield call(updateCard, id, { + boardId, + listId, + position, + }); +} + +export function* transferCurrentCard(boardId, listId, index) { + const { cardId } = yield select(selectors.selectPath); + + yield call(transferCard, cardId, boardId, listId, index); +} + +export function* duplicateCard(id) { + const { listId, name } = yield select(selectors.selectCardById, id); + const index = yield select(selectors.selectCardIndexById, id); + + const nextData = { + position: yield select(selectors.selectNextCardPosition, listId, index + 1), + name: `${name} (${i18n.t('common.copy', { + context: 'inline', + })})`, + }; + + const localId = yield call(createLocalId); + const taskIds = yield select(selectors.selectTaskIdsByCardId, id); + + yield put( + actions.duplicateCard( + id, + { + ...nextData, + id: localId, + }, + taskIds, + ), + ); + + let card; + let cardMemberships; + let cardLabels; + let tasks; + + try { + ({ + item: card, + included: { cardMemberships, cardLabels, tasks }, + } = yield call(request, api.duplicateCard, id, nextData)); + } catch (error) { + yield put(actions.duplicateCard.failure(localId, error)); + return; + } + + yield put(actions.duplicateCard.success(localId, card, cardMemberships, cardLabels, tasks)); +} + +export function* duplicateCurrentCard() { + const { cardId } = yield select(selectors.selectPath); + + yield call(duplicateCard, cardId); +} + +export function* deleteCard(id) { + const { cardId, boardId } = yield select(selectors.selectPath); + + if (id === cardId) { + yield call(goToBoard, boardId); + } + + yield put(actions.deleteCard(id)); + + let card; + try { + ({ item: card } = yield call(request, api.deleteCard, id)); + } catch (error) { + yield put(actions.deleteCard.failure(id, error)); + return; + } + + yield put(actions.deleteCard.success(card)); +} + +export function* deleteCurrentCard() { + const { cardId } = yield select(selectors.selectPath); + + yield call(deleteCard, cardId); +} + +export function* handleCardDelete(card) { + const { cardId, boardId } = yield select(selectors.selectPath); + + if (card.id === cardId) { + yield call(goToBoard, boardId); + } + + yield put(actions.handleCardDelete(card)); +} + +export default { + createCard, + handleCardCreate, + updateCard, + updateCurrentCard, + handleCardUpdate, + moveCard, + moveCurrentCard, + transferCard, + transferCurrentCard, + duplicateCard, + duplicateCurrentCard, + deleteCard, + deleteCurrentCard, + handleCardDelete, +}; diff --git a/client/src/sagas/core/watchers/cards.js b/client/src/sagas/core/watchers/cards.js index 3fcb599..a75965d 100644 --- a/client/src/sagas/core/watchers/cards.js +++ b/client/src/sagas/core/watchers/cards.js @@ -1,43 +1,43 @@ -import { all, takeEvery } from 'redux-saga/effects'; - -import services from '../services'; -import EntryActionTypes from '../../../constants/EntryActionTypes'; - -export default function* cardsWatchers() { - yield all([ - takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data, autoOpen } }) => - services.createCard(listId, data, autoOpen), - ), - takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) => - services.handleCardCreate(card), - ), - takeEvery(EntryActionTypes.CARD_UPDATE, ({ payload: { id, data } }) => - services.updateCard(id, data), - ), - takeEvery(EntryActionTypes.CURRENT_CARD_UPDATE, ({ payload: { data } }) => - services.updateCurrentCard(data), - ), - takeEvery(EntryActionTypes.CARD_UPDATE_HANDLE, ({ payload: { card } }) => - services.handleCardUpdate(card), - ), - takeEvery(EntryActionTypes.CARD_MOVE, ({ payload: { id, listId, index } }) => - services.moveCard(id, listId, index), - ), - takeEvery(EntryActionTypes.CURRENT_CARD_MOVE, ({ payload: { listId, index } }) => - services.moveCurrentCard(listId, index), - ), - takeEvery(EntryActionTypes.CARD_TRANSFER, ({ payload: { id, boardId, listId, index } }) => - services.transferCard(id, boardId, listId, index), - ), - takeEvery(EntryActionTypes.CURRENT_CARD_TRANSFER, ({ payload: { boardId, listId, index } }) => - services.transferCurrentCard(boardId, listId, index), - ), - takeEvery(EntryActionTypes.CARD_DUPLICATE, ({ payload: { id } }) => services.duplicateCard(id)), - takeEvery(EntryActionTypes.CURRENT_CARD_DUPLICATE, () => services.duplicateCurrentCard()), - takeEvery(EntryActionTypes.CARD_DELETE, ({ payload: { id } }) => services.deleteCard(id)), - takeEvery(EntryActionTypes.CURRENT_CARD_DELETE, () => services.deleteCurrentCard()), - takeEvery(EntryActionTypes.CARD_DELETE_HANDLE, ({ payload: { card } }) => - services.handleCardDelete(card), - ), - ]); -} +import { all, takeEvery } from 'redux-saga/effects'; + +import services from '../services'; +import EntryActionTypes from '../../../constants/EntryActionTypes'; + +export default function* cardsWatchers() { + yield all([ + takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data, autoOpen } }) => + services.createCard(listId, data, autoOpen), + ), + takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) => + services.handleCardCreate(card), + ), + takeEvery(EntryActionTypes.CARD_UPDATE, ({ payload: { id, data } }) => + services.updateCard(id, data), + ), + takeEvery(EntryActionTypes.CURRENT_CARD_UPDATE, ({ payload: { data } }) => + services.updateCurrentCard(data), + ), + takeEvery(EntryActionTypes.CARD_UPDATE_HANDLE, ({ payload: { card } }) => + services.handleCardUpdate(card), + ), + takeEvery(EntryActionTypes.CARD_MOVE, ({ payload: { id, listId, index } }) => + services.moveCard(id, listId, index), + ), + takeEvery(EntryActionTypes.CURRENT_CARD_MOVE, ({ payload: { listId, index } }) => + services.moveCurrentCard(listId, index), + ), + takeEvery(EntryActionTypes.CARD_TRANSFER, ({ payload: { id, boardId, listId, index } }) => + services.transferCard(id, boardId, listId, index), + ), + takeEvery(EntryActionTypes.CURRENT_CARD_TRANSFER, ({ payload: { boardId, listId, index } }) => + services.transferCurrentCard(boardId, listId, index), + ), + takeEvery(EntryActionTypes.CARD_DUPLICATE, ({ payload: { id } }) => services.duplicateCard(id)), + takeEvery(EntryActionTypes.CURRENT_CARD_DUPLICATE, () => services.duplicateCurrentCard()), + takeEvery(EntryActionTypes.CARD_DELETE, ({ payload: { id } }) => services.deleteCard(id)), + takeEvery(EntryActionTypes.CURRENT_CARD_DELETE, () => services.deleteCurrentCard()), + takeEvery(EntryActionTypes.CARD_DELETE_HANDLE, ({ payload: { card } }) => + services.handleCardDelete(card), + ), + ]); +} diff --git a/client/src/selectors/cards.js b/client/src/selectors/cards.js index d1137dc..ea43960 100644 --- a/client/src/selectors/cards.js +++ b/client/src/selectors/cards.js @@ -1,350 +1,350 @@ -import { createSelector } from 'redux-orm'; - -import orm from '../orm'; -import { selectPath } from './router'; -import { selectCurrentUserId } from './users'; -import { isLocalId } from '../utils/local-id'; - -export const makeSelectCardById = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return { - ...cardModel.ref, - coverUrl: cardModel.coverAttachment && cardModel.coverAttachment.coverUrl, - isPersisted: !isLocalId(id), - }; - }, - ); - -export const selectCardById = makeSelectCardById(); - -export const makeSelectCardIndexById = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - const cardModels = cardModel.list.getFilteredOrderedCardsModelArray(); - return cardModels.findIndex((cardModelItem) => cardModelItem.id === cardModel.id); - }, - ); - -export const selectCardIndexById = makeSelectCardIndexById(); - -export const makeSelectUsersByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.users.toRefArray(); - }, - ); - -export const selectUsersByCardId = makeSelectUsersByCardId(); - -export const makeSelectLabelsByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.labels.toRefArray(); - }, - ); - -export const selectLabelsByCardId = makeSelectLabelsByCardId(); - -export const makeSelectTaskIdsByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel - .getOrderedTasksQuerySet() - .toRefArray() - .map((task) => task.id); - }, - ); - -export const selectTaskIdsByCardId = makeSelectTaskIdsByCardId(); - -export const makeSelectTasksByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.getOrderedTasksQuerySet().toRefArray(); - }, - ); - -export const selectTasksByCardId = makeSelectTasksByCardId(); - -export const makeSelectLastActivityIdByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - const lastActivityModel = cardModel.getFilteredOrderedInCardActivitiesQuerySet().last(); - - return lastActivityModel && lastActivityModel.id; - }, - ); - -export const selectLastActivityIdByCardId = makeSelectLastActivityIdByCardId(); - -export const makeSelectNotificationsByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.getUnreadNotificationsQuerySet().toRefArray(); - }, - ); - -export const selectNotificationsByCardId = makeSelectNotificationsByCardId(); - -export const makeSelectNotificationsTotalByCardId = () => - createSelector( - orm, - (_, id) => id, - ({ Card }, id) => { - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.getUnreadNotificationsQuerySet().count(); - }, - ); - -export const selectNotificationsTotalByCardId = makeSelectNotificationsTotalByCardId(); - -export const selectCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.ref; - }, -); - -export const selectUsersForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.users.toRefArray(); - }, -); - -export const selectLabelsForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel.labels.toRefArray(); - }, -); - -export const selectTasksForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel - .getOrderedTasksQuerySet() - .toRefArray() - .map((task) => ({ - ...task, - isPersisted: !isLocalId(task.id), - })); - }, -); - -export const selectAttachmentsForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel - .getOrderedAttachmentsQuerySet() - .toRefArray() - .map((attachment) => ({ - ...attachment, - isCover: attachment.id === cardModel.coverAttachmentId, - isPersisted: !isLocalId(attachment.id), - })); - }, -); - -export const selectActivitiesForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - (state) => selectCurrentUserId(state), - ({ Card }, id, currentUserId) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel - .getFilteredOrderedInCardActivitiesQuerySet() - .toModelArray() - .map((activityModel) => ({ - ...activityModel.ref, - isPersisted: !isLocalId(activityModel.id), - user: { - ...activityModel.user.ref, - isCurrent: activityModel.user.id === currentUserId, - }, - })); - }, -); - -export const selectNotificationIdsForCurrentCard = createSelector( - orm, - (state) => selectPath(state).cardId, - ({ Card }, id) => { - if (!id) { - return id; - } - - const cardModel = Card.withId(id); - - if (!cardModel) { - return cardModel; - } - - return cardModel - .getUnreadNotificationsQuerySet() - .toRefArray() - .map((notification) => notification.id); - }, -); - -export default { - makeSelectCardById, - selectCardById, - makeSelectCardIndexById, - selectCardIndexById, - makeSelectUsersByCardId, - selectUsersByCardId, - makeSelectLabelsByCardId, - selectLabelsByCardId, - makeSelectTaskIdsByCardId, - selectTaskIdsByCardId, - makeSelectTasksByCardId, - selectTasksByCardId, - makeSelectLastActivityIdByCardId, - selectLastActivityIdByCardId, - makeSelectNotificationsByCardId, - selectNotificationsByCardId, - makeSelectNotificationsTotalByCardId, - selectNotificationsTotalByCardId, - selectCurrentCard, - selectUsersForCurrentCard, - selectLabelsForCurrentCard, - selectTasksForCurrentCard, - selectAttachmentsForCurrentCard, - selectActivitiesForCurrentCard, - selectNotificationIdsForCurrentCard, -}; +import { createSelector } from 'redux-orm'; + +import orm from '../orm'; +import { selectPath } from './router'; +import { selectCurrentUserId } from './users'; +import { isLocalId } from '../utils/local-id'; + +export const makeSelectCardById = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return { + ...cardModel.ref, + coverUrl: cardModel.coverAttachment && cardModel.coverAttachment.coverUrl, + isPersisted: !isLocalId(id), + }; + }, + ); + +export const selectCardById = makeSelectCardById(); + +export const makeSelectCardIndexById = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + const cardModels = cardModel.list.getFilteredOrderedCardsModelArray(); + return cardModels.findIndex((cardModelItem) => cardModelItem.id === cardModel.id); + }, + ); + +export const selectCardIndexById = makeSelectCardIndexById(); + +export const makeSelectUsersByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.users.toRefArray(); + }, + ); + +export const selectUsersByCardId = makeSelectUsersByCardId(); + +export const makeSelectLabelsByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.labels.toRefArray(); + }, + ); + +export const selectLabelsByCardId = makeSelectLabelsByCardId(); + +export const makeSelectTaskIdsByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel + .getOrderedTasksQuerySet() + .toRefArray() + .map((task) => task.id); + }, + ); + +export const selectTaskIdsByCardId = makeSelectTaskIdsByCardId(); + +export const makeSelectTasksByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.getOrderedTasksQuerySet().toRefArray(); + }, + ); + +export const selectTasksByCardId = makeSelectTasksByCardId(); + +export const makeSelectLastActivityIdByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + const lastActivityModel = cardModel.getFilteredOrderedInCardActivitiesQuerySet().last(); + + return lastActivityModel && lastActivityModel.id; + }, + ); + +export const selectLastActivityIdByCardId = makeSelectLastActivityIdByCardId(); + +export const makeSelectNotificationsByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.getUnreadNotificationsQuerySet().toRefArray(); + }, + ); + +export const selectNotificationsByCardId = makeSelectNotificationsByCardId(); + +export const makeSelectNotificationsTotalByCardId = () => + createSelector( + orm, + (_, id) => id, + ({ Card }, id) => { + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.getUnreadNotificationsQuerySet().count(); + }, + ); + +export const selectNotificationsTotalByCardId = makeSelectNotificationsTotalByCardId(); + +export const selectCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.ref; + }, +); + +export const selectUsersForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.users.toRefArray(); + }, +); + +export const selectLabelsForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel.labels.toRefArray(); + }, +); + +export const selectTasksForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel + .getOrderedTasksQuerySet() + .toRefArray() + .map((task) => ({ + ...task, + isPersisted: !isLocalId(task.id), + })); + }, +); + +export const selectAttachmentsForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel + .getOrderedAttachmentsQuerySet() + .toRefArray() + .map((attachment) => ({ + ...attachment, + isCover: attachment.id === cardModel.coverAttachmentId, + isPersisted: !isLocalId(attachment.id), + })); + }, +); + +export const selectActivitiesForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + (state) => selectCurrentUserId(state), + ({ Card }, id, currentUserId) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel + .getFilteredOrderedInCardActivitiesQuerySet() + .toModelArray() + .map((activityModel) => ({ + ...activityModel.ref, + isPersisted: !isLocalId(activityModel.id), + user: { + ...activityModel.user.ref, + isCurrent: activityModel.user.id === currentUserId, + }, + })); + }, +); + +export const selectNotificationIdsForCurrentCard = createSelector( + orm, + (state) => selectPath(state).cardId, + ({ Card }, id) => { + if (!id) { + return id; + } + + const cardModel = Card.withId(id); + + if (!cardModel) { + return cardModel; + } + + return cardModel + .getUnreadNotificationsQuerySet() + .toRefArray() + .map((notification) => notification.id); + }, +); + +export default { + makeSelectCardById, + selectCardById, + makeSelectCardIndexById, + selectCardIndexById, + makeSelectUsersByCardId, + selectUsersByCardId, + makeSelectLabelsByCardId, + selectLabelsByCardId, + makeSelectTaskIdsByCardId, + selectTaskIdsByCardId, + makeSelectTasksByCardId, + selectTasksByCardId, + makeSelectLastActivityIdByCardId, + selectLastActivityIdByCardId, + makeSelectNotificationsByCardId, + selectNotificationsByCardId, + makeSelectNotificationsTotalByCardId, + selectNotificationsTotalByCardId, + selectCurrentCard, + selectUsersForCurrentCard, + selectLabelsForCurrentCard, + selectTasksForCurrentCard, + selectAttachmentsForCurrentCard, + selectActivitiesForCurrentCard, + selectNotificationIdsForCurrentCard, +}; diff --git a/package-lock.json b/package-lock.json index eee91c9..5ec6c0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4122 +1,4122 @@ -{ - "name": "planka", - "version": "1.16.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "planka", - "version": "1.16.2", - "hasInstallScript": true, - "license": "AGPL-3.0", - "dependencies": { - "concurrently": "^8.2.2", - "husky": "^8.0.3", - "lint-staged": "^15.1.0" - }, - "devDependencies": { - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.1", - "prettier": "^3.1.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "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" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "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", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", - "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lint-staged": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", - "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "2.1.0", - "listr2": "7.0.2", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", - "dev": true, - "requires": { - "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": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "requires": { - "type-fest": "^1.0.2" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true - }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "requires": { - "big-integer": "^1.6.44" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "requires": { - "run-applescript": "^5.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "requires": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "requires": { - "@babel/runtime": "^7.21.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "requires": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "dependencies": { - "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - } - } - }, - "default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "requires": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "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", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - } - }, - "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", - "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" - }, - "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==" - }, - "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - }, - "dependencies": { - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - } - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lint-staged": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", - "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", - "requires": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "2.1.0", - "listr2": "7.0.2", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" - }, - "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" - } - } - }, - "listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", - "requires": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "requires": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "requires": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@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" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - } - } - }, - "spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" - }, - "string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "requires": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} +{ + "name": "planka", + "version": "1.16.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "planka", + "version": "1.16.2", + "hasInstallScript": true, + "license": "AGPL-3.0", + "dependencies": { + "concurrently": "^8.2.2", + "husky": "^8.0.3", + "lint-staged": "^15.1.0" + }, + "devDependencies": { + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.1", + "prettier": "^3.1.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "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", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lint-staged": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "2.1.0", + "listr2": "7.0.2", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "dependencies": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "dependencies": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "requires": { + "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": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "requires": { + "type-fest": "^1.0.2" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "requires": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "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", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + } + }, + "eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==" + }, + "husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==" + }, + "ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "lint-staged": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", + "requires": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "2.1.0", + "listr2": "7.0.2", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + } + } + }, + "listr2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "requires": { + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "requires": { + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@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" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + } + } + }, + "spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==" + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json index a4258a1..7ee9657 100644 --- a/package.json +++ b/package.json @@ -1,69 +1,61 @@ -{ - "name": "planka", - "version": "0.0.1-beta.1", - "private": true, - "homepage": "https://plankanban.github.io/planka", - "repository": { - "type": "git", - "url": "https://github.com/plankanban/planka.git" - }, - "license": "AGPL-3.0", - "author": "Maksim Eltyshev", - "scripts": { - "client:build": "npm run build --prefix client", - "client:lint": "npm run lint --prefix client", - "client:start": "npm start --prefix client", - "client:test": "npm test --prefix client", - "docker:build": "docker build -t ghcr.io/plankanban/planka:local -f Dockerfile .", - "docker:build:base": "docker build -t ghcr.io/plankanban/planka:base-local -f Dockerfile.base .", - "postinstall": "(cd server && npm i && cd ../client && npm i)", - "lint": "npm run server:lint && npm run client:lint", - "prepare": "husky install", - "server:console": "npm run console --prefix server", - "server:db:init": "npm run db:init --prefix server", - "server:db:migrate": "npm run db:migrate --prefix server", - "server:db:seed": "npm run db:seed --prefix server", - "server:lint": "npm run lint --prefix server", - "server:start": "npm start --prefix server", - "server:start:prod": "npm run start:prod --prefix server", - "server:test": "npm test --prefix server", - "start": "concurrently -n server,client \"npm run server:start\" \"npm run client:start\"", - "test": "npm run server:test && npm run client:test" - }, - "lint-staged": { - "client/**/*.{js,jsx}": [ - "npm run client:lint" - ], - "server/**/*.js": [ - "npm run server:lint" - ] - }, - "prettier": { - "printWidth": 100, - "singleQuote": true, - "trailingComma": "all" - }, - "eslintConfig": { - "plugins": [ - "prettier" - ], - "extends": [ - "plugin:prettier/recommended" - ], - "rules": { - "no-undef": "off", - "prettier/prettier": "error" - } - }, - "dependencies": { - "concurrently": "^8.2.2", - "husky": "^8.0.3", - "lint-staged": "^15.1.0" - }, - "devDependencies": { - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.1", - "prettier": "^3.1.0" - } -} +{ + "name": "planka", + "version": "0.0.1-beta.1", + "private": true, + "homepage": "https://plankanban.github.io/planka", + "repository": { + "type": "git", + "url": "https://github.com/plankanban/planka.git" + }, + "license": "AGPL-3.0", + "author": "Maksim Eltyshev", + "scripts": { + "client:build": "npm run build --prefix client", + "client:lint": "npm run lint --prefix client", + "client:start": "npm start --prefix client", + "client:test": "npm test --prefix client", + "docker:build": "docker build -t ghcr.io/plankanban/planka:local -f Dockerfile .", + "docker:build:base": "docker build -t ghcr.io/plankanban/planka:base-local -f Dockerfile.base .", + "postinstall": "(cd server && npm i && cd ../client && npm i)", + "lint": "npm run server:lint && npm run client:lint", + "prepare": "husky install", + "server:console": "npm run console --prefix server", + "server:db:init": "npm run db:init --prefix server", + "server:db:migrate": "npm run db:migrate --prefix server", + "server:db:seed": "npm run db:seed --prefix server", + "server:lint": "npm run lint --prefix server", + "server:start": "npm start --prefix server", + "server:start:prod": "npm run start:prod --prefix server", + "server:test": "npm test --prefix server", + "start": "concurrently -n server,client \"npm run server:start\" \"npm run client:start\"", + "test": "npm run server:test && npm run client:test" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "trailingComma": "all" + }, + "eslintConfig": { + "plugins": [ + "prettier" + ], + "extends": [ + "plugin:prettier/recommended" + ], + "rules": { + "no-undef": "off", + "prettier/prettier": "error" + } + }, + "dependencies": { + "concurrently": "^8.2.2", + "husky": "^8.0.3", + "lint-staged": "^15.1.0" + }, + "devDependencies": { + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.1", + "prettier": "^3.1.0" + } +} diff --git a/server/api/controllers/cards/duplicate.js b/server/api/controllers/cards/duplicate.js index 918a8ec..8b8a6dd 100755 --- a/server/api/controllers/cards/duplicate.js +++ b/server/api/controllers/cards/duplicate.js @@ -1,82 +1,82 @@ -const Errors = { - NOT_ENOUGH_RIGHTS: { - notEnoughRights: 'Not enough rights', - }, - CARD_NOT_FOUND: { - cardNotFound: 'Card not found', - }, -}; - -module.exports = { - inputs: { - id: { - type: 'string', - regex: /^[0-9]+$/, - required: true, - }, - position: { - type: 'number', - required: true, - }, - name: { - type: 'string', - }, - }, - - exits: { - notEnoughRights: { - responseType: 'forbidden', - }, - cardNotFound: { - responseType: 'notFound', - }, - }, - - async fn(inputs) { - const { currentUser } = this.req; - - const { card, list, board } = await sails.helpers.cards - .getProjectPath(inputs.id) - .intercept('pathNotFound', () => Errors.CARD_NOT_FOUND); - - const boardMembership = await BoardMembership.findOne({ - boardId: card.boardId, - userId: currentUser.id, - }); - - if (!boardMembership) { - throw Errors.CARD_NOT_FOUND; // Forbidden - } - - if (boardMembership.role !== BoardMembership.Roles.EDITOR) { - throw Errors.NOT_ENOUGH_RIGHTS; - } - - const values = _.pick(inputs, ['position', 'name']); - - const { - card: nextCard, - cardMemberships, - cardLabels, - tasks, - } = await sails.helpers.cards.duplicateOne.with({ - board, - list, - record: card, - values: { - ...values, - creatorUser: currentUser, - }, - request: this.req, - }); - - return { - item: nextCard, - included: { - cardMemberships, - cardLabels, - tasks, - }, - }; - }, -}; +const Errors = { + NOT_ENOUGH_RIGHTS: { + notEnoughRights: 'Not enough rights', + }, + CARD_NOT_FOUND: { + cardNotFound: 'Card not found', + }, +}; + +module.exports = { + inputs: { + id: { + type: 'string', + regex: /^[0-9]+$/, + required: true, + }, + position: { + type: 'number', + required: true, + }, + name: { + type: 'string', + }, + }, + + exits: { + notEnoughRights: { + responseType: 'forbidden', + }, + cardNotFound: { + responseType: 'notFound', + }, + }, + + async fn(inputs) { + const { currentUser } = this.req; + + const { card, list, board } = await sails.helpers.cards + .getProjectPath(inputs.id) + .intercept('pathNotFound', () => Errors.CARD_NOT_FOUND); + + const boardMembership = await BoardMembership.findOne({ + boardId: card.boardId, + userId: currentUser.id, + }); + + if (!boardMembership) { + throw Errors.CARD_NOT_FOUND; // Forbidden + } + + if (boardMembership.role !== BoardMembership.Roles.EDITOR) { + throw Errors.NOT_ENOUGH_RIGHTS; + } + + const values = _.pick(inputs, ['position', 'name']); + + const { + card: nextCard, + cardMemberships, + cardLabels, + tasks, + } = await sails.helpers.cards.duplicateOne.with({ + board, + list, + record: card, + values: { + ...values, + creatorUser: currentUser, + }, + request: this.req, + }); + + return { + item: nextCard, + included: { + cardMemberships, + cardLabels, + tasks, + }, + }; + }, +}; diff --git a/server/api/helpers/boards/import-from-trello.js b/server/api/helpers/boards/import-from-trello.js index 2ab6e0a..6484396 100644 --- a/server/api/helpers/boards/import-from-trello.js +++ b/server/api/helpers/boards/import-from-trello.js @@ -1,156 +1,156 @@ -const POSITION_GAP = 65535; // TODO: move to config - -module.exports = { - inputs: { - user: { - type: 'ref', - required: true, - }, - board: { - type: 'ref', - required: true, - }, - trelloBoard: { - type: 'json', - required: true, - }, - }, - - async fn(inputs) { - const trelloToPlankaLabels = {}; - - const getTrelloLists = () => inputs.trelloBoard.lists.filter((list) => !list.closed); - - const getUsedTrelloLabels = () => { - const result = {}; - inputs.trelloBoard.cards - .map((card) => card.labels) - .flat() - .forEach((label) => { - result[label.id] = label; - }); - - return Object.values(result); - }; - - const getTrelloCardsOfList = (listId) => - inputs.trelloBoard.cards.filter((card) => card.idList === listId && !card.closed); - - const getAllTrelloCheckItemsOfCard = (cardId) => - inputs.trelloBoard.checklists - .filter((checklist) => checklist.idCard === cardId) - .map((checklist) => checklist.checkItems) - .flat(); - - const getTrelloCommentsOfCard = (cardId) => - inputs.trelloBoard.actions.filter( - (action) => - action.type === 'commentCard' && - action.data && - action.data.card && - action.data.card.id === cardId, - ); - - const getPlankaLabelColor = (trelloLabelColor) => - Label.COLORS.find((color) => color.indexOf(trelloLabelColor) !== -1) || 'desert-sand'; - - const importCardLabels = async (plankaCard, trelloCard) => { - return Promise.all( - trelloCard.labels.map(async (trelloLabel) => { - return CardLabel.create({ - cardId: plankaCard.id, - labelId: trelloToPlankaLabels[trelloLabel.id].id, - }); - }), - ); - }; - - const importTasks = async (plankaCard, trelloCard) => { - // TODO find workaround for tasks/checklist mismapping, see issue trello2planka#5 - return Promise.all( - getAllTrelloCheckItemsOfCard(trelloCard.id).map(async (trelloCheckItem) => { - return Task.create({ - cardId: plankaCard.id, - position: trelloCheckItem.pos, - name: trelloCheckItem.name, - isCompleted: trelloCheckItem.state === 'complete', - }).fetch(); - }), - ); - }; - - const importComments = async (plankaCard, trelloCard) => { - const trelloComments = getTrelloCommentsOfCard(trelloCard.id); - trelloComments.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); - - return Promise.all( - trelloComments.map(async (trelloComment) => { - return Action.create({ - cardId: plankaCard.id, - userId: inputs.user.id, - type: 'commentCard', - data: { - text: - `${trelloComment.data.text}\n\n---\n*Note: imported comment, originally posted by ` + - `\n${trelloComment.memberCreator.fullName} (${trelloComment.memberCreator.username}) on ${trelloComment.date}*`, - }, - }).fetch(); - }), - ); - }; - - const importCards = async (plankaList, trelloList) => { - return Promise.all( - getTrelloCardsOfList(trelloList.id).map(async (trelloCard) => { - const plankaCard = await Card.create({ - boardId: inputs.board.id, - listId: plankaList.id, - creatorUserId: inputs.user.id, - position: trelloCard.pos, - name: trelloCard.name, - description: trelloCard.desc || null, - dueDate: trelloCard.due, - }).fetch(); - - await importCardLabels(plankaCard, trelloCard); - await importTasks(plankaCard, trelloCard); - await importComments(plankaCard, trelloCard); - - return plankaCard; - }), - ); - }; - - const importLabels = async () => { - return Promise.all( - getUsedTrelloLabels().map(async (trelloLabel, index) => { - const plankaLabel = await Label.create({ - boardId: inputs.board.id, - position: POSITION_GAP * (index + 1), - name: trelloLabel.name || null, - color: getPlankaLabelColor(trelloLabel.color), - }).fetch(); - - trelloToPlankaLabels[trelloLabel.id] = plankaLabel; - }), - ); - }; - - const importLists = async () => { - return Promise.all( - getTrelloLists().map(async (trelloList) => { - const plankaList = await List.create({ - boardId: inputs.board.id, - name: trelloList.name, - position: trelloList.pos, - }).fetch(); - - return importCards(plankaList, trelloList); - }), - ); - }; - - await importLabels(); - await importLists(); - }, -}; +const POSITION_GAP = 65535; // TODO: move to config + +module.exports = { + inputs: { + user: { + type: 'ref', + required: true, + }, + board: { + type: 'ref', + required: true, + }, + trelloBoard: { + type: 'json', + required: true, + }, + }, + + async fn(inputs) { + const trelloToPlankaLabels = {}; + + const getTrelloLists = () => inputs.trelloBoard.lists.filter((list) => !list.closed); + + const getUsedTrelloLabels = () => { + const result = {}; + inputs.trelloBoard.cards + .map((card) => card.labels) + .flat() + .forEach((label) => { + result[label.id] = label; + }); + + return Object.values(result); + }; + + const getTrelloCardsOfList = (listId) => + inputs.trelloBoard.cards.filter((card) => card.idList === listId && !card.closed); + + const getAllTrelloCheckItemsOfCard = (cardId) => + inputs.trelloBoard.checklists + .filter((checklist) => checklist.idCard === cardId) + .map((checklist) => checklist.checkItems) + .flat(); + + const getTrelloCommentsOfCard = (cardId) => + inputs.trelloBoard.actions.filter( + (action) => + action.type === 'commentCard' && + action.data && + action.data.card && + action.data.card.id === cardId, + ); + + const getPlankaLabelColor = (trelloLabelColor) => + Label.COLORS.find((color) => color.indexOf(trelloLabelColor) !== -1) || 'desert-sand'; + + const importCardLabels = async (plankaCard, trelloCard) => { + return Promise.all( + trelloCard.labels.map(async (trelloLabel) => { + return CardLabel.create({ + cardId: plankaCard.id, + labelId: trelloToPlankaLabels[trelloLabel.id].id, + }); + }), + ); + }; + + const importTasks = async (plankaCard, trelloCard) => { + // TODO find workaround for tasks/checklist mismapping, see issue trello2planka#5 + return Promise.all( + getAllTrelloCheckItemsOfCard(trelloCard.id).map(async (trelloCheckItem) => { + return Task.create({ + cardId: plankaCard.id, + position: trelloCheckItem.pos, + name: trelloCheckItem.name, + isCompleted: trelloCheckItem.state === 'complete', + }).fetch(); + }), + ); + }; + + const importComments = async (plankaCard, trelloCard) => { + const trelloComments = getTrelloCommentsOfCard(trelloCard.id); + trelloComments.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); + + return Promise.all( + trelloComments.map(async (trelloComment) => { + return Action.create({ + cardId: plankaCard.id, + userId: inputs.user.id, + type: 'commentCard', + data: { + text: + `${trelloComment.data.text}\n\n---\n*Note: imported comment, originally posted by ` + + `\n${trelloComment.memberCreator.fullName} (${trelloComment.memberCreator.username}) on ${trelloComment.date}*`, + }, + }).fetch(); + }), + ); + }; + + const importCards = async (plankaList, trelloList) => { + return Promise.all( + getTrelloCardsOfList(trelloList.id).map(async (trelloCard) => { + const plankaCard = await Card.create({ + boardId: inputs.board.id, + listId: plankaList.id, + creatorUserId: inputs.user.id, + position: trelloCard.pos, + name: trelloCard.name, + description: trelloCard.desc || null, + dueDate: trelloCard.due, + }).fetch(); + + await importCardLabels(plankaCard, trelloCard); + await importTasks(plankaCard, trelloCard); + await importComments(plankaCard, trelloCard); + + return plankaCard; + }), + ); + }; + + const importLabels = async () => { + return Promise.all( + getUsedTrelloLabels().map(async (trelloLabel, index) => { + const plankaLabel = await Label.create({ + boardId: inputs.board.id, + position: POSITION_GAP * (index + 1), + name: trelloLabel.name || null, + color: getPlankaLabelColor(trelloLabel.color), + }).fetch(); + + trelloToPlankaLabels[trelloLabel.id] = plankaLabel; + }), + ); + }; + + const importLists = async () => { + return Promise.all( + getTrelloLists().map(async (trelloList) => { + const plankaList = await List.create({ + boardId: inputs.board.id, + name: trelloList.name, + position: trelloList.pos, + }).fetch(); + + return importCards(plankaList, trelloList); + }), + ); + }; + + await importLabels(); + await importLists(); + }, +}; diff --git a/server/api/helpers/cards/duplicate-one.js b/server/api/helpers/cards/duplicate-one.js index a63feaa..5b85099 100644 --- a/server/api/helpers/cards/duplicate-one.js +++ b/server/api/helpers/cards/duplicate-one.js @@ -1,144 +1,144 @@ -const valuesValidator = (value) => { - if (!_.isPlainObject(value)) { - return false; - } - - if (!_.isUndefined(value.position) && !_.isFinite(value.position)) { - return false; - } - - if (!_.isPlainObject(value.creatorUser)) { - return false; - } - - return true; -}; - -module.exports = { - inputs: { - record: { - type: 'ref', - required: true, - }, - values: { - type: 'ref', - custom: valuesValidator, - required: true, - }, - board: { - type: 'ref', - required: true, - }, - list: { - type: 'ref', - required: true, - }, - request: { - type: 'ref', - }, - }, - - async fn(inputs) { - const { values } = inputs; - - const cards = await sails.helpers.lists.getCards(inputs.record.listId); - - const { position, repositions } = sails.helpers.utils.insertToPositionables( - values.position, - cards, - ); - - repositions.forEach(async ({ id, position: nextPosition }) => { - await Card.update({ - id, - listId: inputs.record.listId, - }).set({ - position: nextPosition, - }); - - sails.sockets.broadcast(`board:${inputs.record.boardId}`, 'cardUpdate', { - item: { - id, - position: nextPosition, - }, - }); - }); - - const card = await Card.create({ - ..._.pick(inputs.record, [ - 'boardId', - 'listId', - 'name', - 'description', - 'dueDate', - 'stopwatch', - ]), - ...values, - position, - creatorUserId: values.creatorUser.id, - }).fetch(); - - const cardMemberships = await sails.helpers.cards.getCardMemberships(inputs.record.id); - const cardMembershipsValues = cardMemberships.map((cardMembership) => ({ - ..._.pick(cardMembership, ['userId']), - cardId: card.id, - })); - const nextCardMemberships = await CardMembership.createEach(cardMembershipsValues).fetch(); - - const cardLabels = await sails.helpers.cards.getCardLabels(inputs.record.id); - const cardLabelsValues = cardLabels.map((cardLabel) => ({ - ..._.pick(cardLabel, ['labelId']), - cardId: card.id, - })); - const nextCardLabels = await CardLabel.createEach(cardLabelsValues).fetch(); - - const tasks = await sails.helpers.cards.getTasks(inputs.record.id); - const tasksValues = tasks.map((task) => ({ - ..._.pick(task, ['position', 'name', 'isCompleted']), - cardId: card.id, - })); - const nextTasks = await Task.createEach(tasksValues).fetch(); - - sails.sockets.broadcast( - `board:${card.boardId}`, - 'cardCreate', - { - item: card, - }, - inputs.request, - ); - - if (values.creatorUser.subscribeToOwnCards) { - await CardSubscription.create({ - cardId: card.id, - userId: card.creatorUserId, - }).tolerate('E_UNIQUE'); - - sails.sockets.broadcast(`user:${card.creatorUserId}`, 'cardUpdate', { - item: { - id: card.id, - isSubscribed: true, - }, - }); - } - - await sails.helpers.actions.createOne.with({ - values: { - card, - type: Action.Types.CREATE_CARD, // TODO: introduce separate type? - data: { - list: _.pick(inputs.list, ['id', 'name']), - }, - user: values.creatorUser, - }, - board: inputs.board, - }); - - return { - card, - cardMemberships: nextCardMemberships, - cardLabels: nextCardLabels, - tasks: nextTasks, - }; - }, -}; +const valuesValidator = (value) => { + if (!_.isPlainObject(value)) { + return false; + } + + if (!_.isUndefined(value.position) && !_.isFinite(value.position)) { + return false; + } + + if (!_.isPlainObject(value.creatorUser)) { + return false; + } + + return true; +}; + +module.exports = { + inputs: { + record: { + type: 'ref', + required: true, + }, + values: { + type: 'ref', + custom: valuesValidator, + required: true, + }, + board: { + type: 'ref', + required: true, + }, + list: { + type: 'ref', + required: true, + }, + request: { + type: 'ref', + }, + }, + + async fn(inputs) { + const { values } = inputs; + + const cards = await sails.helpers.lists.getCards(inputs.record.listId); + + const { position, repositions } = sails.helpers.utils.insertToPositionables( + values.position, + cards, + ); + + repositions.forEach(async ({ id, position: nextPosition }) => { + await Card.update({ + id, + listId: inputs.record.listId, + }).set({ + position: nextPosition, + }); + + sails.sockets.broadcast(`board:${inputs.record.boardId}`, 'cardUpdate', { + item: { + id, + position: nextPosition, + }, + }); + }); + + const card = await Card.create({ + ..._.pick(inputs.record, [ + 'boardId', + 'listId', + 'name', + 'description', + 'dueDate', + 'stopwatch', + ]), + ...values, + position, + creatorUserId: values.creatorUser.id, + }).fetch(); + + const cardMemberships = await sails.helpers.cards.getCardMemberships(inputs.record.id); + const cardMembershipsValues = cardMemberships.map((cardMembership) => ({ + ..._.pick(cardMembership, ['userId']), + cardId: card.id, + })); + const nextCardMemberships = await CardMembership.createEach(cardMembershipsValues).fetch(); + + const cardLabels = await sails.helpers.cards.getCardLabels(inputs.record.id); + const cardLabelsValues = cardLabels.map((cardLabel) => ({ + ..._.pick(cardLabel, ['labelId']), + cardId: card.id, + })); + const nextCardLabels = await CardLabel.createEach(cardLabelsValues).fetch(); + + const tasks = await sails.helpers.cards.getTasks(inputs.record.id); + const tasksValues = tasks.map((task) => ({ + ..._.pick(task, ['position', 'name', 'isCompleted']), + cardId: card.id, + })); + const nextTasks = await Task.createEach(tasksValues).fetch(); + + sails.sockets.broadcast( + `board:${card.boardId}`, + 'cardCreate', + { + item: card, + }, + inputs.request, + ); + + if (values.creatorUser.subscribeToOwnCards) { + await CardSubscription.create({ + cardId: card.id, + userId: card.creatorUserId, + }).tolerate('E_UNIQUE'); + + sails.sockets.broadcast(`user:${card.creatorUserId}`, 'cardUpdate', { + item: { + id: card.id, + isSubscribed: true, + }, + }); + } + + await sails.helpers.actions.createOne.with({ + values: { + card, + type: Action.Types.CREATE_CARD, // TODO: introduce separate type? + data: { + list: _.pick(inputs.list, ['id', 'name']), + }, + user: values.creatorUser, + }, + board: inputs.board, + }); + + return { + card, + cardMemberships: nextCardMemberships, + cardLabels: nextCardLabels, + tasks: nextTasks, + }; + }, +}; diff --git a/server/config/routes.js b/server/config/routes.js index 8b88df5..35c53a9 100644 --- a/server/config/routes.js +++ b/server/config/routes.js @@ -1,97 +1,97 @@ -/** - * Route Mappings - * (sails.config.routes) - * - * Your routes tell Sails what to do each time it receives a request. - * - * For more information on configuring custom routes, check out: - * https://sailsjs.com/anatomy/config/routes-js - */ - -module.exports.routes = { - 'GET /api/config': 'show-config', - - 'POST /api/access-tokens': 'access-tokens/create', - 'POST /api/access-tokens/exchange-using-oidc': 'access-tokens/exchange-using-oidc', - 'DELETE /api/access-tokens/me': 'access-tokens/delete', - - 'GET /api/users': 'users/index', - 'POST /api/users': 'users/create', - 'GET /api/users/:id': 'users/show', - 'PATCH /api/users/:id': 'users/update', - 'PATCH /api/users/:id/email': 'users/update-email', - 'PATCH /api/users/:id/password': 'users/update-password', - 'PATCH /api/users/:id/username': 'users/update-username', - 'POST /api/users/:id/avatar': 'users/update-avatar', - 'DELETE /api/users/:id': 'users/delete', - - 'GET /api/projects': 'projects/index', - 'POST /api/projects': 'projects/create', - 'GET /api/projects/:id': 'projects/show', - 'PATCH /api/projects/:id': 'projects/update', - 'POST /api/projects/:id/background-image': 'projects/update-background-image', - 'DELETE /api/projects/:id': 'projects/delete', - - 'POST /api/projects/:projectId/managers': 'project-managers/create', - 'DELETE /api/project-managers/:id': 'project-managers/delete', - - 'POST /api/projects/:projectId/boards': 'boards/create', - 'GET /api/boards/:id': 'boards/show', - 'PATCH /api/boards/:id': 'boards/update', - 'DELETE /api/boards/:id': 'boards/delete', - - 'POST /api/boards/:boardId/memberships': 'board-memberships/create', - 'PATCH /api/board-memberships/:id': 'board-memberships/update', - 'DELETE /api/board-memberships/:id': 'board-memberships/delete', - - 'POST /api/boards/:boardId/labels': 'labels/create', - 'PATCH /api/labels/:id': 'labels/update', - 'DELETE /api/labels/:id': 'labels/delete', - - 'POST /api/boards/:boardId/lists': 'lists/create', - 'PATCH /api/lists/:id': 'lists/update', - 'DELETE /api/lists/:id': 'lists/delete', - - 'POST /api/lists/:listId/cards': 'cards/create', - 'GET /api/cards/:id': 'cards/show', - 'PATCH /api/cards/:id': 'cards/update', - 'POST /api/cards/:id/duplicate': 'cards/duplicate', - 'DELETE /api/cards/:id': 'cards/delete', - 'POST /api/cards/:cardId/memberships': 'card-memberships/create', - 'DELETE /api/cards/:cardId/memberships': 'card-memberships/delete', - 'POST /api/cards/:cardId/labels': 'card-labels/create', - 'DELETE /api/cards/:cardId/labels/:labelId': 'card-labels/delete', - - 'POST /api/cards/:cardId/tasks': 'tasks/create', - 'PATCH /api/tasks/:id': 'tasks/update', - 'DELETE /api/tasks/:id': 'tasks/delete', - - 'POST /api/cards/:cardId/attachments': 'attachments/create', - 'PATCH /api/attachments/:id': 'attachments/update', - 'DELETE /api/attachments/:id': 'attachments/delete', - - 'GET /api/cards/:cardId/actions': 'actions/index', - - 'POST /api/cards/:cardId/comment-actions': 'comment-actions/create', - 'PATCH /api/comment-actions/:id': 'comment-actions/update', - 'DELETE /api/comment-actions/:id': 'comment-actions/delete', - - 'GET /api/notifications': 'notifications/index', - 'GET /api/notifications/:id': 'notifications/show', - 'PATCH /api/notifications/:ids': 'notifications/update', - - 'GET /attachments/:id/download/:filename': { - action: 'attachments/download', - skipAssets: false, - }, - - 'GET /attachments/:id/download/thumbnails/cover-256.:extension': { - action: 'attachments/download-thumbnail', - skipAssets: false, - }, - - 'GET /*': { - view: 'index', - skipAssets: true, - }, -}; +/** + * Route Mappings + * (sails.config.routes) + * + * Your routes tell Sails what to do each time it receives a request. + * + * For more information on configuring custom routes, check out: + * https://sailsjs.com/anatomy/config/routes-js + */ + +module.exports.routes = { + 'GET /api/config': 'show-config', + + 'POST /api/access-tokens': 'access-tokens/create', + 'POST /api/access-tokens/exchange-using-oidc': 'access-tokens/exchange-using-oidc', + 'DELETE /api/access-tokens/me': 'access-tokens/delete', + + 'GET /api/users': 'users/index', + 'POST /api/users': 'users/create', + 'GET /api/users/:id': 'users/show', + 'PATCH /api/users/:id': 'users/update', + 'PATCH /api/users/:id/email': 'users/update-email', + 'PATCH /api/users/:id/password': 'users/update-password', + 'PATCH /api/users/:id/username': 'users/update-username', + 'POST /api/users/:id/avatar': 'users/update-avatar', + 'DELETE /api/users/:id': 'users/delete', + + 'GET /api/projects': 'projects/index', + 'POST /api/projects': 'projects/create', + 'GET /api/projects/:id': 'projects/show', + 'PATCH /api/projects/:id': 'projects/update', + 'POST /api/projects/:id/background-image': 'projects/update-background-image', + 'DELETE /api/projects/:id': 'projects/delete', + + 'POST /api/projects/:projectId/managers': 'project-managers/create', + 'DELETE /api/project-managers/:id': 'project-managers/delete', + + 'POST /api/projects/:projectId/boards': 'boards/create', + 'GET /api/boards/:id': 'boards/show', + 'PATCH /api/boards/:id': 'boards/update', + 'DELETE /api/boards/:id': 'boards/delete', + + 'POST /api/boards/:boardId/memberships': 'board-memberships/create', + 'PATCH /api/board-memberships/:id': 'board-memberships/update', + 'DELETE /api/board-memberships/:id': 'board-memberships/delete', + + 'POST /api/boards/:boardId/labels': 'labels/create', + 'PATCH /api/labels/:id': 'labels/update', + 'DELETE /api/labels/:id': 'labels/delete', + + 'POST /api/boards/:boardId/lists': 'lists/create', + 'PATCH /api/lists/:id': 'lists/update', + 'DELETE /api/lists/:id': 'lists/delete', + + 'POST /api/lists/:listId/cards': 'cards/create', + 'GET /api/cards/:id': 'cards/show', + 'PATCH /api/cards/:id': 'cards/update', + 'POST /api/cards/:id/duplicate': 'cards/duplicate', + 'DELETE /api/cards/:id': 'cards/delete', + 'POST /api/cards/:cardId/memberships': 'card-memberships/create', + 'DELETE /api/cards/:cardId/memberships': 'card-memberships/delete', + 'POST /api/cards/:cardId/labels': 'card-labels/create', + 'DELETE /api/cards/:cardId/labels/:labelId': 'card-labels/delete', + + 'POST /api/cards/:cardId/tasks': 'tasks/create', + 'PATCH /api/tasks/:id': 'tasks/update', + 'DELETE /api/tasks/:id': 'tasks/delete', + + 'POST /api/cards/:cardId/attachments': 'attachments/create', + 'PATCH /api/attachments/:id': 'attachments/update', + 'DELETE /api/attachments/:id': 'attachments/delete', + + 'GET /api/cards/:cardId/actions': 'actions/index', + + 'POST /api/cards/:cardId/comment-actions': 'comment-actions/create', + 'PATCH /api/comment-actions/:id': 'comment-actions/update', + 'DELETE /api/comment-actions/:id': 'comment-actions/delete', + + 'GET /api/notifications': 'notifications/index', + 'GET /api/notifications/:id': 'notifications/show', + 'PATCH /api/notifications/:ids': 'notifications/update', + + 'GET /attachments/:id/download/:filename': { + action: 'attachments/download', + skipAssets: false, + }, + + 'GET /attachments/:id/download/thumbnails/cover-256.:extension': { + action: 'attachments/download-thumbnail', + skipAssets: false, + }, + + 'GET /*': { + view: 'index', + skipAssets: true, + }, +}; diff --git a/server/db/migrations/20180722005928_create_card_label_table.js b/server/db/migrations/20180722005928_create_card_label_table.js index 1d9fb79..f0798a1 100755 --- a/server/db/migrations/20180722005928_create_card_label_table.js +++ b/server/db/migrations/20180722005928_create_card_label_table.js @@ -1,19 +1,19 @@ -module.exports.up = (knex) => - knex.schema.createTable('card_label', (table) => { - /* Columns */ - - table.bigInteger('id').primary().defaultTo(knex.raw('next_id()')); - - table.bigInteger('card_id').notNullable(); - table.bigInteger('label_id').notNullable(); - - table.timestamp('created_at', true); - table.timestamp('updated_at', true); - - /* Indexes */ - - table.unique(['card_id', 'label_id']); - table.index('label_id'); - }); - -module.exports.down = (knex) => knex.schema.dropTable('card_label'); +module.exports.up = (knex) => + knex.schema.createTable('card_label', (table) => { + /* Columns */ + + table.bigInteger('id').primary().defaultTo(knex.raw('next_id()')); + + table.bigInteger('card_id').notNullable(); + table.bigInteger('label_id').notNullable(); + + table.timestamp('created_at', true); + table.timestamp('updated_at', true); + + /* Indexes */ + + table.unique(['card_id', 'label_id']); + table.index('label_id'); + }); + +module.exports.down = (knex) => knex.schema.dropTable('card_label'); diff --git a/server/db/migrations/20230809022050_oidc_with_pkce_flow.js b/server/db/migrations/20230809022050_oidc_with_pkce_flow.js index d3d997b..8ce4105 100644 --- a/server/db/migrations/20230809022050_oidc_with_pkce_flow.js +++ b/server/db/migrations/20230809022050_oidc_with_pkce_flow.js @@ -1,44 +1,44 @@ -module.exports.up = async (knex) => { - await knex.schema.createTable('identity_provider_user', (table) => { - /* Columns */ - - table.bigInteger('id').primary().defaultTo(knex.raw('next_id()')); - - table.bigInteger('user_id').notNullable(); - - table.text('issuer').notNullable(); - table.text('sub').notNullable(); - - table.timestamp('created_at', true); - table.timestamp('updated_at', true); - - /* Indexes */ - - table.unique(['issuer', 'sub']); - table.index('user_id'); - }); - - await knex.schema.table('user_account', (table) => { - /* Columns */ - - table.boolean('is_sso').notNullable().default(false); - - /* Modifications */ - - table.setNullable('password'); - }); - - return knex.schema.alterTable('user_account', (table) => { - table.boolean('is_sso').notNullable().alter(); - }); -}; - -module.exports.down = async (knex) => { - await knex.schema.dropTable('identity_provider_user'); - - return knex.schema.table('user_account', (table) => { - table.dropColumn('is_sso'); - - table.dropNullable('password'); - }); -}; +module.exports.up = async (knex) => { + await knex.schema.createTable('identity_provider_user', (table) => { + /* Columns */ + + table.bigInteger('id').primary().defaultTo(knex.raw('next_id()')); + + table.bigInteger('user_id').notNullable(); + + table.text('issuer').notNullable(); + table.text('sub').notNullable(); + + table.timestamp('created_at', true); + table.timestamp('updated_at', true); + + /* Indexes */ + + table.unique(['issuer', 'sub']); + table.index('user_id'); + }); + + await knex.schema.table('user_account', (table) => { + /* Columns */ + + table.boolean('is_sso').notNullable().default(false); + + /* Modifications */ + + table.setNullable('password'); + }); + + return knex.schema.alterTable('user_account', (table) => { + table.boolean('is_sso').notNullable().alter(); + }); +}; + +module.exports.down = async (knex) => { + await knex.schema.dropTable('identity_provider_user'); + + return knex.schema.table('user_account', (table) => { + table.dropColumn('is_sso'); + + table.dropNullable('password'); + }); +};