Remove Grunt in favor of ts/scripts

This commit is contained in:
Scott Nonnenberg 2021-12-14 08:43:46 -08:00 committed by GitHub
parent 4e947211b2
commit e74376b997
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 1137 additions and 1661 deletions

View File

@ -56,7 +56,7 @@ jobs:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
- name: Build typescript
run: yarn grunt
run: yarn generate
- name: Bundle
run: yarn build:webpack

View File

@ -128,7 +128,6 @@ jobs:
run: yarn install --frozen-lockfile
- run: yarn generate
- run: node build\grunt.js
- run: yarn test-node
- run: copy package.json temp.json
- run: del package.json

View File

@ -59,7 +59,7 @@ cd Signal-Desktop
git-lfs install # Setup Git LFS.
npm install --global yarn # (only if you dont already have `yarn`)
yarn install --frozen-lockfile # Install and build dependencies (this will take a while)
yarn grunt # Generate final JS and CSS assets
yarn generate # Generate final JS and CSS assets
yarn build:webpack # Build parts of the app that use webpack (Sticker Creator)
yarn test # A good idea to make sure tests run first
yarn start # Start Signal!
@ -72,13 +72,14 @@ is no automatic restart mechanism. Alternatively, keep the developer tools open
(Windows & Linux).
Also, note that the assets loaded by the application are not necessarily the same files
youre touching. You may not see your changes until you run `yarn grunt` on the
youre touching. You may not see your changes until you run `yarn generate` on the
command-line like you did during setup. You can make it easier on yourself by generating
the latest built assets when you change a file. Run this in its own terminal instance
while you make changes:
the latest built assets when you change a file. Run each of these in their own terminal
instance while you make changes - they'll run until you stop them:
```
yarn grunt dev # runs until you stop it, re-generating built assets on file changes
yarn transpile --watch # recompiles when you change .ts files
yarn sass-manifest --watch # recompiles when you change .scss files
```
If you miss the `git-lfs` step, run `yarn cache clean` and remove `node_modules` before trying again.

View File

@ -1,148 +0,0 @@
// Copyright 2014-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
const importOnce = require('node-sass-import-once');
const rimraf = require('rimraf');
const mkdirp = require('mkdirp');
const sass = require('node-sass');
/* eslint-disable more/no-then, no-console */
module.exports = grunt => {
const bower = grunt.file.readJSON('bower.json');
const components = [];
// eslint-disable-next-line guard-for-in, no-restricted-syntax
for (const i in bower.concat.app) {
components.push(bower.concat.app[i]);
}
grunt.loadNpmTasks('grunt-sass');
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
components: {
src: components,
dest: 'js/components.js',
},
},
sass: {
options: {
implementation: sass,
sourceMap: true,
importer: importOnce,
},
dev: {
files: {
'stylesheets/manifest.css': 'stylesheets/manifest.scss',
'stylesheets/manifest_bridge.css': 'stylesheets/manifest_bridge.scss',
},
},
},
copy: {
deps: {
files: [
{
src: 'components/mp3lameencoder/lib/Mp3LameEncoder.js',
dest: 'js/Mp3LameEncoder.min.js',
},
{
src: 'components/webaudiorecorder/lib/WebAudioRecorderMp3.js',
dest: 'js/WebAudioRecorderMp3.js',
},
],
},
},
watch: {
protobuf: {
files: ['./protos/SignalService.proto'],
tasks: ['exec:build-protobuf'],
},
sass: {
files: ['./stylesheets/*.scss', './stylesheets/**/*.scss'],
tasks: ['sass'],
},
},
exec: {
'tx-pull-mostly-translated': {
cmd: 'tx pull --all --use-git-timestamps --minimum-perc=80',
},
'tx-pull-any-existing-translation': {
cmd: 'tx pull --use-git-timestamps',
},
transpile: {
cmd: 'yarn transpile',
},
'build-protobuf': {
cmd: 'yarn build-protobuf',
},
},
gitinfo: {}, // to be populated by grunt gitinfo
});
Object.keys(grunt.config.get('pkg').devDependencies).forEach(key => {
if (/^grunt(?!(-cli)?$)/.test(key)) {
// ignore grunt and grunt-cli
grunt.loadNpmTasks(key);
}
});
// Transifex does not understand placeholders, so this task patches all non-en
// locales with missing placeholders
grunt.registerTask('locale-patch', () => {
const en = grunt.file.readJSON('_locales/en/messages.json');
grunt.file.recurse('_locales', (abspath, rootdir, subdir, filename) => {
if (subdir === 'en' || filename !== 'messages.json') {
return;
}
const messages = grunt.file.readJSON(abspath);
// eslint-disable-next-line no-restricted-syntax
for (const key in messages) {
if (en[key] !== undefined && messages[key] !== undefined) {
if (
en[key].placeholders !== undefined &&
messages[key].placeholders === undefined
) {
messages[key].placeholders = en[key].placeholders;
}
}
}
grunt.file.write(abspath, `${JSON.stringify(messages, null, 4)}\n`);
});
});
grunt.registerTask('getExpireTime', () => {
grunt.task.requires('gitinfo');
const gitinfo = grunt.config.get('gitinfo');
const committed = gitinfo.local.branch.current.lastCommitTime;
const buildCreation = Date.parse(committed);
const buildExpiration = buildCreation + 1000 * 60 * 60 * 24 * 90;
grunt.file.write(
'config/local-production.json',
`${JSON.stringify({ buildCreation, buildExpiration })}\n`
);
});
grunt.registerTask('clean-release', () => {
rimraf.sync('release');
mkdirp.sync('release');
});
grunt.registerTask('tx', [
'exec:tx-pull-mostly-translated',
'exec:tx-pull-any-existing-translation',
'locale-patch',
]);
grunt.registerTask('dev', ['default', 'watch']);
grunt.registerTask('date', ['gitinfo', 'getExpireTime']);
grunt.registerTask('default', [
'exec:build-protobuf',
'exec:transpile',
'concat',
'copy:deps',
'sass',
'date',
]);
};

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Voorskou van duimnaelskakel vir $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "يتم جلب صورة مصغرة لمعاينة الوصلة $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "واجه سطح المكتب خطأ في فك التشفير.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "إرسال السجل",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ üçün bağlantı önbaxış eskizi",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Masaüstü, şifrə açma xətası ilə qarşılaşdı.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Jurnalı göndər",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Преглед на линк към $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ লিঙ্ক এর জন্য ছোট পূর্বরূপ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "ডেস্কটপে একটি ডিক্রিপশন ত্রুটি হয়েছে।",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "লগ জমা দিন",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Previsualització de la vista en miniatura de l'enllaç $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Hi ha hagut un error de desencriptació.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Envia el registre",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Náhled na odkaz pro $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop narazil na chybu při dešifrování.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Odeslat log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Rhagolwg dolen llun bach ar gyfer $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Cafodd y bwrdd gwaith yn wall dadgryptio.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Cyflwyno cofnod",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniature-linkforhåndsvisning for $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop stødte på en dekrypteringsfejl.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Indsend log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniaturbild der Link-Vorschau für $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Es trat ein Entschlüsselungsfehler auf.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Diagnoseprotokoll übermitteln",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Προεπισκόπηση συνδέσμου για $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Το Desktop αντιμετώπισε σφάλμα αποκρυπτογράφησης.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Υποβολή αρχείου",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatura antaŭrigardo de ligilo pri $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Eraro de malĉifrado okazis.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Sendi protokolon",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatura de vista previa para $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Fallo encontrado al descifrar.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Enviar el registro de depuración",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Lingi eelvaate pisipilt: $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Programmil tekkis dekrüptimistõrge.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Postita logi",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Estekaren miniatura aurrebista $domain$ domeinurako",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "پیش نمایش پیوند thumbnail برای $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Linkin $domain$ esikatselukuva",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Ohjelma törmäsi salauksen purkuvirheeseen.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Lähetä loki",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Imagette daperçu de lien pour $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Signal pour ordinateur a rencontré une erreur de déchiffrement.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Envoyer le journal",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ માટે થંબનેલ લિંક પ્રિવ્યુ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "קדם־תצוגה של קישור עבור $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "שולחן העבודה נתקל בשגיאת פיענוח.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "הגש יומן",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ के लिये थंबनेल लिंक पूर्वावलोकन",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "डेस्कटॉप एक डिक्रिप्शन एरर में चला गया.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "लॉग सबमिट करें",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Sličica pregleda poveznice za $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "A $domain$ hivatkozás előnézeti képe",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "A Desktop egy dekódolási hibába ütközött.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Log küldése",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Gambar mini pratinjau tautan untuk $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop menemui eror dekripsi.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Kirim catatan",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Smámynd forskoðunar tengils fyrir $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Forritið lenti í afkóðunarvillu.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Senda inn atvikaskrá",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatura anteprima del collegamento per $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ha riscontrato un errore di decrittazione.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Invia log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ のリンクプレビュー",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "デスクトップで復号化エラーが発生しました。",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "ログを送信",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "ការមើលតំណជារូបភាពតូចៗសម្រាប់$domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ಗೆ ಥಂಬ್‌ನೇಲ್‌ ಲಿಂಕ್‌ ಪೂರ್ವವೀಕ್ಷಣೆ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$의 섬네일 링크 미리보기",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Thumbnail link preview for $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "ຮູບນ້ອຍລີງ ທີຜ່ານມາ ສຳລັບ $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatiūrinė nuorodos peržiūra, skirta $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Programa susidūrė su iššifravimo klaida.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Pateikti žurnalą",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ sīktēlu saites priekšskatījums",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Линк до сликичка за преглед на $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$-ൻ്റെ ലിങ്ക് പ്രിവ്യൂ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ करिता थंबनेल दुवा पुनरावलोकन",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": " डेस्कटॉपमध्ये डिक्रिप्शन त्रुटी आली",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "लॉग सादर करा",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Pratonton pautan imej kecil untuk $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Komputer meja mengalami ralat nyahinkripsi.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Hantar log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatyrbilde til linkforhåndsvisning for $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Voorbeeldafbeelding voor $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Signal-Desktop heeft een probleem met ontsleutelen.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Foutopsporingslog indienen",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Førehandsvisning av lenkje til $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Send inn logg",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Thumbnail link preview for $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": " $domain$ ਦੇ ਲਈ ਥੰਬਨੇਲ ਲਿੰਕ ਦੀ ਝਲਕ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Podgląd miniatury odnośnika dla $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Aplikacja Desktop napotkała błąd, w trakcie odszyfrowywania.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Wyślij logi debugowania",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "د $domain$ لپاره د thumbnail د لینک مخکتنه",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "ډیسکټاپ له یوې ډیکرپشن شوې تیروتنې سره رن شوی",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "د رپوټ تسلیمول",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Pré-visualização em miniatura do link $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Signal encontrou um erro ao descriptografar uma mensagem.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Enviar um registro de depuração",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Pré-visualização da hiperligação da miniatura $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "O desktop apresentou um erro de desencriptação.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submeter relatório",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Miniatură a previzualizări pentru $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop a întâmpinat o eroare de decriptare.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Trimite jurnalul",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Миниатюра предпросмотра ссылки для $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "В Signal Desktop произошла ошибка расшифровки.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Отправить журнал",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Náhľad odkazu pre $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "V programe Signal Desktop sa vyskytla chyba pri dešifrovaní.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Odoslať denník",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Predogledna sličica povezave na: $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Prišlo je do težav z dešifriranjem.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Oddaj sistemsko zabeležbo",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Paraparje lidhjeje miniature për $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktopi hasi një gabim shfshehtëzimi.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Parashtroni regjistër",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Сличица прегледа линка за $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Десктоп је налетео на грешку у дешифрирању.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Пошањи извештај",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Länkförhandsgranskning i miniatyrbild för $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop stötte på ett dekrypteringsfel.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Skicka in logg",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Muunganisho wa hakiki ya kijipicha kwa $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ க்கான சிறு இணைப்பு முன்னோட்டம்",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$కోసం సూక్ష్మచిత్రం పూర్వప్రదర్శన లింకు ",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "ภาพย่อตัวอย่างลิงก์ของ $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ için bağlantı ön izlemesi küçük resmi",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop deşifreleme hatası ile karşılaştı.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Günlüğü gönder",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ نىڭ كىچىك سۈرەت ئۇلانما ئالدىن كۆزىتىشى",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Мініатюра попереднього перегляду посилання для $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$کیلئے پیش نظر تھمب نیل لنک",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "Hình thu nhỏ liên kết bản xem trước cho $domain$",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$的链接预览缩略图",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "Desktop ran into a decryption error.",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "Submit log",

View File

@ -425,7 +425,7 @@
"placeholders": {
"count": {
"content": "$1",
"example": 123
"example": "123"
}
}
},
@ -631,7 +631,7 @@
"message": "$domain$ 的縮圖連結預覽",
"description": "Shown while Signal Desktop is fetching metadata for a url in composition area",
"placeholders": {
"path": {
"domain": {
"content": "$1",
"example": "instagram.com"
}
@ -649,7 +649,17 @@
},
"decryptionErrorToast": {
"message": "電腦遇到解密錯誤。",
"description": "An error popup when we haven't added an error for decryption error."
"description": "An error popup when we haven't added an error for decryption error.",
"placeholders": {
"name": {
"content": "$1",
"example": "John"
},
"deviceId": {
"content": "$1",
"example": "2"
}
}
},
"decryptionErrorToastAction": {
"message": "上傳日誌",

View File

@ -1,43 +0,0 @@
{
"name": "signal-desktop",
"version": "0.0.0",
"homepage": "https://github.com/signalapp/Signal-Desktop",
"license": "AGPL-3.0-only",
"private": true,
"dependencies": {
"mp3lameencoder": "https://github.com/higuma/mp3-lame-encoder-js.git",
"protobuf": "~3.8.0",
"qrcode": "https://github.com/davidshimjs/qrcodejs.git#1c78ccd71",
"webaudiorecorder": "https://github.com/higuma/web-audio-recorder-js.git"
},
"devDependencies": {
},
"preen": {
"mp3lameencoder": [
"lib/Mp3LameEncoder.js"
],
"protobuf": [
"dist/ProtoBuf.js"
],
"qrcode": [
"qrcode.js"
],
"webaudiorecorder": [
"lib/WebAudioRecorder.js",
"lib/WebAudioRecorderMp3.js"
]
},
"concat": {
"app": [
"node_modules/jquery/dist/jquery.js",
"components/long/**/*.js",
"components/bytebuffer/**/*.js",
"components/protobuf/**/*.js",
"node_modules/mustache/mustache.js",
"node_modules/underscore/underscore.js",
"components/qrcode/**/*.js",
"components/autosize/**/*.js",
"components/webaudiorecorder/lib/WebAudioRecorder.js"
]
}
}

View File

@ -1,5 +0,0 @@
// Copyright 2017-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// because grunt.cmd is totally flakey on windows
require('grunt').cli();

View File

@ -1,662 +0,0 @@
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['backbone', 'underscore'], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory(require('backbone'), require('underscore'));
} else {
// Browser globals (root is window)
root.returnExports = factory(root.Backbone, root._);
}
}(this, function (Backbone, _) {
// Generate four random hex digits.
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
// Generate a pseudo-GUID by concatenating random hexadecimal.
function guid() {
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
if ( _(indexedDB).isUndefined() ) { return; }
// Driver object
// That's the interesting part.
// There is a driver for each schema provided. The schema is a te combination of name (for the database), a version as well as migrations to reach that
// version of the database.
function Driver(schema, ready, nolog, onerror) {
this.schema = schema;
this.ready = ready;
this.error = null;
this.transactions = []; // Used to list all transactions and keep track of active ones.
this.db = null;
this.nolog = nolog;
this.onerror = onerror;
var lastMigrationPathVersion = _.last(this.schema.migrations).version;
if (!this.nolog) debugLog("opening database " + this.schema.id + " in version #" + lastMigrationPathVersion);
this.dbRequest = indexedDB.open(this.schema.id,lastMigrationPathVersion); //schema version need to be an unsigned long
this.launchMigrationPath = function(dbVersion) {
var transaction = this.dbRequest.transaction;
var clonedMigrations = _.clone(schema.migrations);
this.migrate(transaction, clonedMigrations, dbVersion, {
error: function (event) {
this.error = "Database not up to date. " + dbVersion + " expected was " + lastMigrationPathVersion;
}.bind(this)
});
};
this.dbRequest.onblocked = function(event){
if (!this.nolog) debugLog("connection to database blocked");
}
this.dbRequest.onsuccess = function (e) {
this.db = e.target.result; // Attach the connection ot the queue.
var currentIntDBVersion = (parseInt(this.db.version) || 0); // we need convert beacuse chrome store in integer and ie10 DP4+ in int;
var lastMigrationInt = (parseInt(lastMigrationPathVersion) || 0); // And make sure we compare numbers with numbers.
if (currentIntDBVersion === lastMigrationInt) { //if support new event onupgradeneeded will trigger the ready function
// No migration to perform!
this.ready();
} else if (currentIntDBVersion < lastMigrationInt ) {
// We need to migrate up to the current migration defined in the database
this.launchMigrationPath(currentIntDBVersion);
} else {
// Looks like the IndexedDB is at a higher version than the current driver schema.
this.error = "Database version is greater than current code " + currentIntDBVersion + " expected was " + lastMigrationInt;
}
}.bind(this);
this.dbRequest.onerror = function (e) {
// Failed to open the database
this.error = "Couldn't not connect to the database"
if (!this.nolog) debugLog("Couldn't not connect to the database");
this.onerror();
}.bind(this);
this.dbRequest.onabort = function (e) {
// Failed to open the database
this.error = "Connection to the database aborted"
if (!this.nolog) debugLog("Connection to the database aborted");
this.onerror();
}.bind(this);
this.dbRequest.onupgradeneeded = function(iDBVersionChangeEvent){
this.db =iDBVersionChangeEvent.target.result;
var newVersion = iDBVersionChangeEvent.newVersion;
var oldVersion = iDBVersionChangeEvent.oldVersion;
// Fix Safari 8 and iOS 8 bug
// at the first connection oldVersion is equal to 9223372036854776000
// but the real value is 0
if (oldVersion > 99999999999)
oldVersion = 0;
if (!this.nolog) debugLog("onupgradeneeded = " + oldVersion + " => " + newVersion);
this.launchMigrationPath(oldVersion);
}.bind(this);
}
function debugLog(str) {
if (typeof window !== "undefined" && typeof window.console !== "undefined" && typeof window.console.log !== "undefined") {
window.console.log(str);
}
else if(console.log !== "undefined") {
console.log(str)
}
}
// Driver Prototype
Driver.prototype = {
// Tracks transactions. Mostly for debugging purposes. TO-IMPROVE
_track_transaction: function(transaction) {
this.transactions.push(transaction);
function removeIt() {
var idx = this.transactions.indexOf(transaction);
if (idx !== -1) {this.transactions.splice(idx); }
};
transaction.oncomplete = removeIt.bind(this);
transaction.onabort = removeIt.bind(this);
transaction.onerror = removeIt.bind(this);
},
// Performs all the migrations to reach the right version of the database.
migrate: function (transaction, migrations, version, options) {
transaction.onerror = options.error;
transaction.onabort = options.error;
if (!this.nolog) debugLog("migrate begin version from #" + version);
var that = this;
var migration = migrations.shift();
if (migration) {
if (!version || version < migration.version) {
// We need to apply this migration-
if (typeof migration.before == "undefined") {
migration.before = function (next) {
next();
};
}
if (typeof migration.after == "undefined") {
migration.after = function (next) {
next();
};
}
// First, let's run the before script
if (!this.nolog) debugLog("migrate begin before version #" + migration.version);
migration.before(function () {
if (!this.nolog) debugLog("migrate done before version #" + migration.version);
if (!this.nolog) debugLog("migrate begin migrate version #" + migration.version);
migration.migrate(transaction, function () {
if (!this.nolog) debugLog("migrate done migrate version #" + migration.version);
// Migration successfully appliedn let's go to the next one!
if (!this.nolog) debugLog("migrate begin after version #" + migration.version);
migration.after(function () {
if (!this.nolog) debugLog("migrate done after version #" + migration.version);
if (!this.nolog) debugLog("Migrated to " + migration.version);
//last modification occurred, need finish
if(migrations.length ==0) {
if (!this.nolog) {
debugLog("migrate setting transaction.oncomplete to finish version #" + migration.version);
transaction.oncomplete = function() {
debugLog("migrate done transaction.oncomplete version #" + migration.version);
debugLog("Done migrating");
}
}
}
else
{
if (!this.nolog) debugLog("migrate end from version #" + version + " to " + migration.version);
that.migrate(transaction, migrations, version, options);
}
}.bind(this));
}.bind(this));
}.bind(this));
} else {
// No need to apply this migration
if (!this.nolog) debugLog("Skipping migration " + migration.version);
this.migrate(transaction, migrations, version, options);
}
}
},
// This is the main method, called by the ExecutionQueue when the driver is ready (database open and migration performed)
execute: function (storeName, method, object, options) {
if (!this.nolog) debugLog("execute : " + method + " on " + storeName + " for " + object.id);
switch (method) {
case "create":
this.create(storeName, object, options);
break;
case "read":
if (object.id || object.cid) {
this.read(storeName, object, options); // It's a model
} else {
this.query(storeName, object, options); // It's a collection
}
break;
case "update":
this.update(storeName, object, options); // We may want to check that this is not a collection. TOFIX
break;
case "delete":
if (object.id || object.cid) {
this.delete(storeName, object, options);
} else {
this.clear(storeName, object, options);
}
break;
default:
// Hum what?
}
},
// Writes the json to the storeName in db. It is a create operations, which means it will fail if the key already exists
// options are just success and error callbacks.
create: function (storeName, object, options) {
var writeTransaction = this.db.transaction([storeName], 'readwrite');
//this._track_transaction(writeTransaction);
var store = writeTransaction.objectStore(storeName);
var json = object.toJSON();
var idAttribute = _.result(object, 'idAttribute');
var writeRequest;
if (json[idAttribute] === undefined && !store.autoIncrement) json[idAttribute] = guid();
writeTransaction.onerror = function (e) {
options.error(e);
};
writeTransaction.oncomplete = function (e) {
options.success(json);
};
if (!store.keyPath)
writeRequest = store.add(json, json[idAttribute]);
else
writeRequest = store.add(json);
},
// Writes the json to the storeName in db. It is an update operation, which means it will overwrite the value if the key already exist
// options are just success and error callbacks.
update: function (storeName, object, options) {
var writeTransaction = this.db.transaction([storeName], 'readwrite');
//this._track_transaction(writeTransaction);
var store = writeTransaction.objectStore(storeName);
var json = object.toJSON();
var idAttribute = _.result(object, 'idAttribute');
var writeRequest;
if (!json[idAttribute]) json[idAttribute] = guid();
if (!store.keyPath)
writeRequest = store.put(json, json[idAttribute]);
else
writeRequest = store.put(json);
writeRequest.onerror = function (e) {
options.error(e);
};
writeTransaction.oncomplete = function (e) {
options.success(json);
};
},
// Reads from storeName in db with json.id if it's there of with any json.xxxx as long as xxx is an index in storeName
read: function (storeName, object, options) {
var readTransaction = this.db.transaction([storeName], "readonly");
this._track_transaction(readTransaction);
var store = readTransaction.objectStore(storeName);
var json = object.toJSON();
var idAttribute = _.result(object, 'idAttribute');
var getRequest = null;
if (json[idAttribute]) {
getRequest = store.get(json[idAttribute]);
} else if(options.index) {
var index = store.index(options.index.name);
getRequest = index.get(options.index.value);
} else {
// We need to find which index we have
var cardinality = 0; // try to fit the index with most matches
_.each(store.indexNames, function (key, index) {
index = store.index(key);
if(typeof index.keyPath === 'string' && 1 > cardinality) {
// simple index
if (json[index.keyPath] !== undefined) {
getRequest = index.get(json[index.keyPath]);
cardinality = 1;
}
} else if(typeof index.keyPath === 'object' && index.keyPath.length > cardinality) {
// compound index
var valid = true;
var keyValue = _.map(index.keyPath, function(keyPart) {
valid = valid && json[keyPart] !== undefined;
return json[keyPart];
});
if(valid) {
getRequest = index.get(keyValue);
cardinality = index.keyPath.length;
}
}
});
}
if (getRequest) {
getRequest.onsuccess = function (event) {
if (event.target.result) {
options.success(event.target.result);
} else {
options.error("Not Found");
}
};
getRequest.onerror = function () {
options.error("Not Found"); // We couldn't find the record.
}
} else {
options.error("Not Found"); // We couldn't even look for it, as we don't have enough data.
}
},
// Deletes the json.id key and value in storeName from db.
delete: function (storeName, object, options) {
var deleteTransaction = this.db.transaction([storeName], 'readwrite');
//this._track_transaction(deleteTransaction);
var store = deleteTransaction.objectStore(storeName);
var json = object.toJSON();
var idAttribute = _.result(object, 'idAttribute');
var deleteRequest = store.delete(json[idAttribute]);
deleteTransaction.oncomplete = function (event) {
options.success(null);
};
deleteRequest.onerror = function (event) {
options.error("Not Deleted");
};
},
// Clears all records for storeName from db.
clear: function (storeName, object, options) {
var deleteTransaction = this.db.transaction([storeName], "readwrite");
//this._track_transaction(deleteTransaction);
var store = deleteTransaction.objectStore(storeName);
var deleteRequest = store.clear();
deleteRequest.onsuccess = function (event) {
options.success(null);
};
deleteRequest.onerror = function (event) {
options.error("Not Cleared");
};
},
// Performs a query on storeName in db.
// options may include :
// - conditions : value of an index, or range for an index
// - range : range for the primary key
// - limit : max number of elements to be yielded
// - offset : skipped items.
query: function (storeName, collection, options) {
var elements = [];
var skipped = 0, processed = 0;
var queryTransaction = this.db.transaction([storeName], "readonly");
//this._track_transaction(queryTransaction);
var idAttribute = _.result(collection.model.prototype, 'idAttribute');
var readCursor = null;
var store = queryTransaction.objectStore(storeName);
var index = null,
lower = null,
upper = null,
bounds = null;
if (options.conditions) {
// We have a condition, we need to use it for the cursor
_.each(store.indexNames, function (key) {
if (!readCursor) {
index = store.index(key);
if (options.conditions[index.keyPath] instanceof Array) {
lower = options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1] ? options.conditions[index.keyPath][1] : options.conditions[index.keyPath][0];
upper = options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1] ? options.conditions[index.keyPath][0] : options.conditions[index.keyPath][1];
bounds = IDBKeyRange.bound(lower, upper, true, true);
if (options.conditions[index.keyPath][0] > options.conditions[index.keyPath][1]) {
// Looks like we want the DESC order
readCursor = index.openCursor(bounds, window.IDBCursor.PREV || "prev");
} else {
// We want ASC order
readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
}
} else if (typeof options.conditions[index.keyPath] === 'object' && ('$gt' in options.conditions[index.keyPath] || '$gte' in options.conditions[index.keyPath])) {
if('$gt' in options.conditions[index.keyPath])
bounds = IDBKeyRange.lowerBound(options.conditions[index.keyPath]['$gt'], true);
else
bounds = IDBKeyRange.lowerBound(options.conditions[index.keyPath]['$gte']);
readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
} else if (typeof options.conditions[index.keyPath] === 'object' && ('$lt' in options.conditions[index.keyPath] || '$lte' in options.conditions[index.keyPath])) {
if('$lt' in options.conditions[index.keyPath])
bounds = IDBKeyRange.upperBound(options.conditions[index.keyPath]['$lt'], true);
else
bounds = IDBKeyRange.upperBound(options.conditions[index.keyPath]['$lte']);
readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
} else if (options.conditions[index.keyPath] != undefined) {
bounds = IDBKeyRange.only(options.conditions[index.keyPath]);
readCursor = index.openCursor(bounds);
}
}
});
} else if (options.index) {
index = store.index(options.index.name);
var excludeLower = !!options.index.excludeLower;
var excludeUpper = !!options.index.excludeUpper;
if (index) {
if (options.index.lower && options.index.upper) {
bounds = IDBKeyRange.bound(options.index.lower, options.index.upper, excludeLower, excludeUpper);
} else if (options.index.lower) {
bounds = IDBKeyRange.lowerBound(options.index.lower, excludeLower);
} else if (options.index.upper) {
bounds = IDBKeyRange.upperBound(options.index.upper, excludeUpper);
} else if (options.index.only) {
bounds = IDBKeyRange.only(options.index.only);
}
if (typeof options.index.order === 'string' && options.index.order.toLowerCase() === 'desc') {
readCursor = index.openCursor(bounds, window.IDBCursor.PREV || "prev");
} else {
readCursor = index.openCursor(bounds, window.IDBCursor.NEXT || "next");
}
}
} else {
// No conditions, use the index
if (options.range) {
lower = options.range[0] > options.range[1] ? options.range[1] : options.range[0];
upper = options.range[0] > options.range[1] ? options.range[0] : options.range[1];
bounds = IDBKeyRange.bound(lower, upper);
if (options.range[0] > options.range[1]) {
readCursor = store.openCursor(bounds, window.IDBCursor.PREV || "prev");
} else {
readCursor = store.openCursor(bounds, window.IDBCursor.NEXT || "next");
}
} else {
readCursor = store.openCursor();
}
}
if (typeof (readCursor) == "undefined" || !readCursor) {
options.error("No Cursor");
} else {
readCursor.onerror = function(e){
options.error("readCursor error", e);
};
// Setup a handler for the cursors `success` event:
readCursor.onsuccess = function (e) {
var cursor = e.target.result;
if (!cursor) {
if (options.addIndividually || options.clear) {
// nothing!
// We need to indicate that we're done. But, how?
collection.trigger("reset");
} else {
options.success(elements); // We're done. No more elements.
}
}
else {
// Cursor is not over yet.
if (options.limit && processed >= options.limit) {
// Yet, we have processed enough elements. So, let's just skip.
if (bounds) {
if (options.conditions && options.conditions[index.keyPath]) {
cursor.continue(options.conditions[index.keyPath][1] + 1); /* We need to 'terminate' the cursor cleany, by moving to the end */
} else if (options.index && (options.index.upper || options.index.lower)) {
if (typeof options.index.order === 'string' && options.index.order.toLowerCase() === 'desc') {
cursor.continue(options.index.lower);
} else {
cursor.continue(options.index.upper);
}
}
} else {
cursor.continue(); /* We need to 'terminate' the cursor cleany, by moving to the end */
}
}
else if (options.offset && options.offset > skipped) {
skipped++;
cursor.continue(); /* We need to Moving the cursor forward */
} else {
// This time, it looks like it's good!
if (options.addIndividually) {
collection.add(cursor.value);
} else if (options.clear) {
var deleteRequest = store.delete(cursor.value[idAttribute]);
deleteRequest.onsuccess = function (event) {
elements.push(cursor.value);
};
deleteRequest.onerror = function (event) {
elements.push(cursor.value);
};
} else {
elements.push(cursor.value);
}
processed++;
cursor.continue();
}
}
};
}
},
close :function(){
if(this.db){
this.db.close();
}
}
};
// ExecutionQueue object
// The execution queue is an abstraction to buffer up requests to the database.
// It holds a "driver". When the driver is ready, it just fires up the queue and executes in sync.
function ExecutionQueue(schema,next,nolog) {
this.driver = new Driver(schema, this.ready.bind(this), nolog, this.error.bind(this));
this.started = false;
this.failed = false;
this.stack = [];
this.version = _.last(schema.migrations).version;
this.next = next;
}
// ExecutionQueue Prototype
ExecutionQueue.prototype = {
// Called when the driver is ready
// It just loops over the elements in the queue and executes them.
ready: function () {
this.started = true;
_.each(this.stack, function (message) {
this.execute(message);
}.bind(this));
this.stack = []; // fix memory leak
this.next();
},
error: function() {
this.failed = true;
_.each(this.stack, function (message) {
this.execute(message);
}.bind(this));
this.stack = [];
this.next();
},
// Executes a given command on the driver. If not started, just stacks up one more element.
execute: function (message) {
if (this.started) {
try {
this.driver.execute(message[2].storeName || message[1].storeName, message[0], message[1], message[2]); // Upon messages, we execute the query
} catch (e) {
if (e.name === 'InvalidStateError') {
var f = window.onInvalidStateError;
if (f) f(e);
}
throw e;
}
} else if (this.failed) {
message[2].error();
} else {
this.stack.push(message);
}
},
close : function(){
this.driver.close();
}
};
// Method used by Backbone for sync of data with data store. It was initially designed to work with "server side" APIs, This wrapper makes
// it work with the local indexedDB stuff. It uses the schema attribute provided by the object.
// The wrapper keeps an active Executuon Queue for each "schema", and executes querues agains it, based on the object type (collection or
// single model), but also the method... etc.
// Keeps track of the connections
var Databases = {};
function sync(method, object, options) {
if(method == "closeall"){
_.each(Databases,function(database){
database.close();
});
// Clean up active databases object.
Databases = {};
return Backbone.$.Deferred().resolve();
}
// If a model or a collection does not define a database, fall back on ajaxSync
if (!object || !_.isObject(object.database)) {
return Backbone.ajaxSync(method, object, options);
}
var schema = object.database;
if (Databases[schema.id]) {
if(Databases[schema.id].version != _.last(schema.migrations).version){
Databases[schema.id].close();
delete Databases[schema.id];
}
}
var promise;
if (typeof Backbone.$ === 'undefined' || typeof Backbone.$.Deferred === 'undefined') {
var noop = function() {};
var resolve = noop;
var reject = noop;
} else {
var dfd = Backbone.$.Deferred();
var resolve = dfd.resolve;
var reject = dfd.reject;
promise = dfd.promise();
}
var success = options.success;
options.success = function(resp) {
if (success) success(resp);
resolve();
object.trigger('sync', object, resp, options);
};
var error = options.error;
options.error = function(resp) {
if (error) error(resp);
reject();
object.trigger('error', object, resp, options);
};
var next = function(){
Databases[schema.id].execute([method, object, options]);
};
if (!Databases[schema.id]) {
Databases[schema.id] = new ExecutionQueue(schema,next,schema.nolog);
} else {
next();
}
return promise;
};
Backbone.ajaxSync = Backbone.sync;
Backbone.sync = sync;
return { sync: sync, debugLog: debugLog};
}));

View File

@ -15,11 +15,17 @@
"postinstall": "yarn build:acknowledgments && yarn build:fuses && patch-package && yarn electron:install-app-deps && rimraf node_modules/dtrace-provider",
"postuninstall": "yarn build:acknowledgments",
"start": "electron .",
"grunt": "grunt",
"generate": "yarn grunt",
"generate": "npm-run-all build-protobuf transpile sass get-expire-time copy-and-concat",
"build-release": "yarn run build",
"sign-release": "node ts/updater/generateSignature.js",
"notarize": "node ts/build/notarize.js",
"get-strings": "node ts/scripts/get-strings.js",
"get-expire-time": "node ts/scripts/get-expire-time.js",
"copy-and-concat": "node ts/scripts/copy-and-concat.js",
"sass": "npm-run-all sass-manifest sass-manifest-bridge",
"sass-base": "node-sass --source-map true --importer node_modules/node-sass-import-once/index.js",
"sass-manifest": "yarn sass-base stylesheets/manifest.scss stylesheets/manifest.css",
"sass-manifest-bridge": "yarn sass-base stylesheets/manifest_bridge.scss stylesheets/manifest_bridge.css",
"build-module-protobuf": "pbjs --target static-module --wrap commonjs --out ts/protobuf/compiled.js protos/*.proto && pbts --out ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
"clean-module-protobuf": "rm -f ts/protobuf/compiled.d.ts ts/protobuf/compiled.js",
"build-protobuf": "yarn build-module-protobuf",
@ -43,18 +49,16 @@
"clean-transpile-once": "rimraf app/**/*.js app/*.js ts/**/*.js ts/*.js tsconfig.tsbuildinfo",
"clean-transpile": "yarn run clean-transpile-once && yarn run clean-transpile-once",
"open-coverage": "open coverage/lcov-report/index.html",
"ready": "npm-run-all --print-label clean-transpile grunt --parallel lint lint-deps test-node test-electron",
"ready": "npm-run-all --print-label clean-transpile generate --parallel lint lint-deps test-node test-electron",
"dev": "run-p --print-label dev:*",
"dev:grunt": "yarn grunt dev",
"dev:transpile": "yarn run transpile --watch --preserveWatchOutput",
"dev:webpack": "cross-env NODE_ENV=development webpack serve --mode development",
"dev:typed-scss": "yarn build:typed-scss -w",
"dev:storybook": "cross-env SIGNAL_ENV=storybook start-storybook -p 6006 -s ./",
"storybook:axe": "build-storybook && axe-storybook",
"build": "run-s --print-label build:grunt build:typed-scss build:webpack build:fuses:release build:release build:fuses build:zip",
"build": "run-s --print-label generate build:typed-scss build:webpack build:fuses:release build:release build:fuses build:zip",
"build:acknowledgments": "node scripts/generate-acknowledgments.js",
"build:dev": "run-s --print-label build:grunt build:typed-scss build:webpack",
"build:grunt": "yarn grunt",
"build:dev": "run-s --print-label generate build:typed-scss build:webpack",
"build:typed-scss": "tsm sticker-creator",
"build:webpack": "run-p build:webpack:sticker-creator build:webpack:preload build:webpack:sql-worker build:webpack:heic-worker",
"build:webpack:sticker-creator": "cross-env NODE_ENV=production webpack",
@ -65,7 +69,7 @@
"build:release": "cross-env SIGNAL_ENV=production yarn build:electron -- --config.directories.output=release",
"build:fuses": "node scripts/fuse-electron.js",
"build:fuses:release": "node scripts/fuse-electron.js --release",
"build:zip": "node scripts/zip-macos-release.js",
"build:zip": "node ts/scripts/zip-macos-release.js",
"preverify:ts": "yarn build:typed-scss",
"verify": "run-p --print-label verify:*",
"verify:ts": "tsc --noEmit",
@ -264,14 +268,6 @@
"eslint-plugin-more": "1.0.0",
"eslint-plugin-react": "7.20.6",
"file-loader": "4.2.0",
"grunt": "1.4.1",
"grunt-cli": "1.4.3",
"grunt-contrib-concat": "2.0.0",
"grunt-contrib-copy": "1.0.0",
"grunt-contrib-watch": "1.1.0",
"grunt-exec": "3.0.0",
"grunt-gitinfo": "0.1.9",
"grunt-sass": "3.1.0",
"html-webpack-plugin": "5.3.1",
"mocha": "9.1.3",
"mocha-testcheck": "1.0.0-rc.0",

View File

@ -3,6 +3,8 @@
module.exports = {
rules: {
'no-console': 'off',
// We still get the value of this rule, it just allows for dev deps
'import/no-extraneous-dependencies': [
'error',

View File

@ -1,6 +1,5 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const { flipFuses, FuseVersion, FuseV1Options } = require('@electron/fuses');

View File

@ -1,7 +1,6 @@
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const assert = require('assert');
const fs = require('fs');
const { join } = require('path');

View File

@ -1,6 +1,5 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const path = require('path');
const { execSync } = require('child_process');

View File

@ -1,8 +1,6 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const fs = require('fs');
const _ = require('lodash');

View File

@ -1,8 +1,6 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const fs = require('fs');
const { execSync } = require('child_process');

View File

@ -1,8 +1,6 @@
// Copyright 2018-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const fs = require('fs');
const _ = require('lodash');

View File

@ -1,8 +1,6 @@
// Copyright 2018-2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
const fs = require('fs');
const _ = require('lodash');

16
ts/scripts/.eslintrc.js Normal file
View File

@ -0,0 +1,16 @@
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
module.exports = {
rules: {
'no-console': 'off',
// We still get the value of this rule, it just allows for dev deps
'import/no-extraneous-dependencies': [
'error',
{
devDependencies: true,
},
],
},
};

View File

@ -0,0 +1,54 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { basename, join } from 'path';
import { copyFileSync, readFileSync, writeFileSync } from 'fs';
// Concat
console.log('Concatenating...');
const BASE_BOWER = join(__dirname, '../../components');
const BASE_NODE = join(__dirname, '../../node_modules');
const CONCAT_TARGET = join(__dirname, '../../js/components.js');
const CONCAT_SOURCES = [
join(BASE_NODE, 'jquery/dist/jquery.js'),
join(BASE_NODE, 'mustache/mustache.js'),
join(BASE_NODE, 'underscore/underscore.js'),
join(BASE_BOWER, 'qrcode/qrcode.js'),
join(BASE_BOWER, 'webaudiorecorder/lib/WebAudioRecorder.js'),
];
let concat = '// concatenated components.js';
CONCAT_SOURCES.forEach(source => {
const contents = readFileSync(source, 'utf8');
const name = basename(source);
console.log(`Concatenating ${source}`);
concat += `\n\n// ${name}\n${contents}`;
});
console.log(`Writing to ${CONCAT_TARGET}`);
writeFileSync(CONCAT_TARGET, concat);
// Copy
console.log();
console.log('Copying...');
const BASE_JS = join(__dirname, '../../js');
const COPY_SOURCES = [
{
src: join(BASE_BOWER, 'mp3lameencoder/lib/Mp3LameEncoder.js'),
dest: join(BASE_JS, 'Mp3LameEncoder.min.js'),
},
{
src: join(BASE_BOWER, 'webaudiorecorder/lib/WebAudioRecorderMp3.js'),
dest: join(BASE_JS, 'WebAudioRecorderMp3.js'),
},
];
for (const { src, dest } of COPY_SOURCES) {
console.log(`Copying ${src} to ${dest}`);
copyFileSync(src, dest);
}

View File

@ -0,0 +1,26 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { join } from 'path';
import { execSync } from 'child_process';
import { writeFileSync } from 'fs';
import { DAY } from '../util/durations';
const unixTimestamp = parseInt(
execSync('git show -s --format=%ct').toString('utf8'),
10
);
const buildCreation = unixTimestamp * 1000;
const buildExpiration = buildCreation + DAY * 90;
const localProductionPath = join(
__dirname,
'../../config/local-production.json'
);
const localProductionConfig = { buildCreation, buildExpiration };
writeFileSync(
localProductionPath,
`${JSON.stringify(localProductionConfig)}\n`
);

53
ts/scripts/get-strings.ts Normal file
View File

@ -0,0 +1,53 @@
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { join, resolve } from 'path';
import { existsSync, readdirSync, writeFileSync } from 'fs';
import { execSync } from 'child_process';
import { readJsonSync } from 'fs-extra';
import type { LocaleMessagesType } from '../types/I18N';
console.log('Getting latest strings!');
console.log();
console.log('Getting strings, allow for new ones over 80% translated');
execSync('tx pull --all --use-git-timestamps --minimum-perc=80', {
stdio: [null, process.stdout, process.stderr],
});
console.log();
console.log('Getting strings, updating everything previously missed');
execSync('tx pull --use-git-timestamps', {
stdio: [null, process.stdout, process.stderr],
});
const BASE_DIR = join(__dirname, '../../_locales');
const en: LocaleMessagesType = readJsonSync(
join(BASE_DIR, '/en/messages.json')
);
const locales = readdirSync(join(BASE_DIR, ''));
console.log();
console.log('Re-adding placeholders to non-en locales');
locales.forEach((locale: string) => {
if (locale === 'en') {
return;
}
const target = resolve(join(BASE_DIR, locale, 'messages.json'));
if (!existsSync(target)) {
throw new Error(`File not found for ${locale}: ${target}`);
}
const messages: LocaleMessagesType = readJsonSync(target);
Object.keys(messages).forEach(key => {
if (!en[key]) {
return;
}
messages[key].placeholders = en[key].placeholders;
});
console.log(`Writing ${target}`);
writeFileSync(target, `${JSON.stringify(messages, null, 4)}\n`);
});

View File

@ -1,8 +1,6 @@
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-console */
import fs from 'fs';
import path from 'path';
import rimraf from 'rimraf';

View File

@ -7,6 +7,12 @@ export type LocaleMessagesType = {
[key: string]: {
message: string;
description?: string;
placeholders?: {
[name: string]: {
content: string;
example: string;
};
};
};
};

View File

@ -1,18 +1,4 @@
[
{
"rule": "jQuery-after(",
"path": "components/indexeddb-backbonejs-adapter/backbone-indexeddb.js",
"reasonCategory": "falseMatch",
"updated": "2018-09-13T21:24:40.667Z",
"line": " migration.after(function () {"
},
{
"rule": "jQuery-before(",
"path": "components/indexeddb-backbonejs-adapter/backbone-indexeddb.js",
"reasonCategory": "falseMatch",
"updated": "2018-09-13T21:24:40.667Z",
"line": " migration.before(function () {"
},
{
"rule": "eval",
"path": "components/mp3lameencoder/lib/Mp3LameEncoder.js",
@ -599,6 +585,101 @@
"reasonCategory": "falseMatch",
"updated": "2018-09-19T18:13:29.628Z"
},
{
"rule": "jQuery-insertAfter(",
"path": "node_modules/async/dist/async.js",
"line": " if (this.tail) this.insertAfter(this.tail, node);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertBefore(",
"path": "node_modules/async/dist/async.js",
"line": " if (this.head) this.insertBefore(this.head, node);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertBefore(",
"path": "node_modules/async/dist/async.js",
"line": " q._tasks.insertBefore(nextNode, item);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/async/dist/async.js",
"line": "function wrap(defer) {",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/async/dist/async.js",
"line": "var setImmediate$1 = wrap(_defer);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/async/dist/async.js",
"line": "var nextTick = wrap(_defer$1);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-$(",
"path": "node_modules/async/dist/async.min.js",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertAfter(",
"path": "node_modules/async/dist/async.min.js",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertBefore(",
"path": "node_modules/async/dist/async.min.js",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertAfter(",
"path": "node_modules/async/internal/DoublyLinkedList.js",
"line": " if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertBefore(",
"path": "node_modules/async/internal/DoublyLinkedList.js",
"line": " if (this.head) this.insertBefore(this.head, node);else setInitial(this, node);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/async/internal/setImmediate.js",
"line": "function wrap(defer) {",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/async/internal/setImmediate.js",
"line": "exports.default = wrap(_defer);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "jQuery-insertBefore(",
"path": "node_modules/async/priorityQueue.js",
"line": " q._tasks.insertBefore(nextNode, item);",
"reasonCategory": "falseMatch",
"updated": "2021-12-11T02:14:15.457Z"
},
{
"rule": "DOM-innerHTML",
"path": "node_modules/axe-core/axe.js",
@ -6618,26 +6699,6 @@
"reasonCategory": "falseMatch",
"updated": "2018-09-19T21:59:32.770Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/underscore.string/dist/underscore.string.js",
"line": "module.exports = function wrap(str, options){",
"reasonCategory": "falseMatch",
"updated": "2018-09-19T18:13:29.628Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/underscore.string/dist/underscore.string.min.js",
"reasonCategory": "falseMatch",
"updated": "2021-05-06T21:37:22.288Z"
},
{
"rule": "jQuery-wrap(",
"path": "node_modules/underscore.string/wrap.js",
"line": "module.exports = function wrap(str, options){",
"reasonCategory": "falseMatch",
"updated": "2018-09-19T18:13:29.628Z"
},
{
"rule": "jQuery-after(",
"path": "node_modules/underscore/amd/after.js",

View File

@ -38,7 +38,6 @@ const FILES_TO_IGNORE = new Set(
[
'.github/ISSUE_TEMPLATE/bug_report.md',
'.github/PULL_REQUEST_TEMPLATE.md',
'components/indexeddb-backbonejs-adapter/backbone-indexeddb.js',
'components/mp3lameencoder/lib/Mp3LameEncoder.js',
'components/qrcode/qrcode.js',
'components/recorderjs/recorder.js',

View File

@ -170,14 +170,6 @@ const excludedFilesRegexp = RegExp(
'^node_modules/gauge/.+',
'^node_modules/global-agent/.+',
'^node_modules/globule/.+',
'^node_modules/grunt-cli/.+',
'^node_modules/grunt-contrib-concat/.+',
'^node_modules/grunt-contrib-watch/.+',
'^node_modules/grunt-gitinfo/.+',
'^node_modules/grunt-legacy-log-utils/.+',
'^node_modules/grunt-legacy-log/.+',
'^node_modules/grunt-legacy-util/.+',
'^node_modules/grunt/.+',
'^node_modules/handle-thing/.+',
'^node_modules/handlebars/.+', // Used by nyc#istanbul-reports
'^node_modules/har-validator/.+',

548
yarn.lock
View File

@ -3862,11 +3862,6 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
array-each@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
array-filter@~0.0.0:
version "0.0.1"
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
@ -3923,11 +3918,6 @@ array-reduce@~0.0.0:
resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
array-slice@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
array-union@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
@ -4127,7 +4117,7 @@ async-limiter@~1.0.0:
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@0.9.x, async@~0.9.0:
async@0.9.x:
version "0.9.2"
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
@ -4137,18 +4127,13 @@ async@^2.1.4:
dependencies:
lodash "^4.14.0"
async@^2.6.0, async@^2.6.2:
async@^2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
dependencies:
lodash "^4.17.14"
async@~3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -4746,16 +4731,6 @@ body-parser@1.19.0:
raw-body "2.4.0"
type-is "~1.6.17"
body@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069"
integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=
dependencies:
continuable-cache "^0.3.1"
error "^7.0.0"
raw-body "~1.1.0"
safe-json-parse "~1.0.1"
bonjour@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
@ -5036,11 +5011,6 @@ builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
bytes@1:
version "1.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@ -5288,7 +5258,7 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@^4.1.1, chalk@^4.1.2:
chalk@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@ -5296,14 +5266,6 @@ chalk@^4.1.1, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chalk@~4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
change-emitter@^0.1.2:
version "0.1.6"
resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
@ -5681,10 +5643,6 @@ colors@^1.1.2:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d"
integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==
colors@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
combined-stream@1.0.6, combined-stream@~1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
@ -5866,11 +5824,6 @@ content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
continuable-cache@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=
convert-source-map@^1.1.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
@ -6271,11 +6224,6 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
dateformat@~3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
debug-log@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
@ -6512,11 +6460,6 @@ destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
detect-file@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
detect-indent@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
@ -7079,13 +7022,6 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
error@^7.0.0:
version "7.2.1"
resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894"
integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==
dependencies:
string-template "~0.2.1"
es-abstract@^1.10.0, es-abstract@^1.11.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.9.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
@ -7661,10 +7597,6 @@ event-target-shim@^5.0.0:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
eventemitter2@~0.4.13:
version "0.4.14"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
eventemitter3@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
@ -7772,11 +7704,6 @@ execa@^5.0.0:
signal-exit "^3.0.3"
strip-final-newline "^2.0.0"
exit@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
expand-brackets@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@ -7806,13 +7733,6 @@ expand-template@^2.0.3:
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
dependencies:
homedir-polyfill "^1.0.1"
express@^4.17.0, express@^4.17.1:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
@ -8039,12 +7959,6 @@ faye-websocket@^0.11.3, faye-websocket@~0.11.1:
dependencies:
websocket-driver ">=0.5.1"
faye-websocket@~0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
dependencies:
websocket-driver ">=0.5.1"
fbjs@^0.8.0, fbjs@^0.8.1:
version "0.8.17"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
@ -8120,10 +8034,6 @@ file-selector@^0.1.11:
dependencies:
tslib "^1.9.0"
file-sync-cmp@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz#a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b"
file-system-cache@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f"
@ -8272,43 +8182,11 @@ find-yarn-workspace-root@^2.0.0:
dependencies:
micromatch "^4.0.2"
findup-sync@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
dependencies:
detect-file "^1.0.0"
is-glob "^4.0.0"
micromatch "^4.0.2"
resolve-dir "^1.0.1"
findup-sync@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
dependencies:
glob "~5.0.0"
fined@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
dependencies:
expand-tilde "^2.0.2"
is-plain-object "^2.0.3"
object.defaults "^1.1.0"
object.pick "^1.2.0"
parse-filepath "^1.0.1"
firstline@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.1.tgz#b88673c42009f8821fac2926e99720acee924fae"
integrity sha1-uIZzxCAJ+IIfrCkm6ZcgrO6ST64=
flagged-respawn@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
@ -8381,13 +8259,6 @@ for-own@^0.1.3, for-own@^0.1.4:
dependencies:
for-in "^1.0.1"
for-own@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
dependencies:
for-in "^1.0.1"
foreach@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@ -8638,13 +8509,6 @@ gaze@^1.0.0:
dependencies:
globule "^1.0.0"
gaze@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
dependencies:
globule "^1.0.0"
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@ -8740,15 +8604,6 @@ get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
getobject@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c"
getobject@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.0.tgz#27eeb6394716cfb6adcef275a33c2752df9ca49a"
integrity sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@ -8805,7 +8660,7 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
glob@7.1.6, glob@^7.1.3, glob@^7.1.6, glob@~7.1.6:
glob@7.1.6, glob@^7.1.3, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -8874,16 +8729,6 @@ glob@^7.1.4:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@~5.0.0:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
dependencies:
inflight "^1.0.4"
inherits "2"
minimatch "2 || 3"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-agent@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
@ -8910,26 +8755,6 @@ global-modules@2.0.0:
dependencies:
global-prefix "^3.0.0"
global-modules@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
dependencies:
global-prefix "^1.0.1"
is-windows "^1.0.1"
resolve-dir "^1.0.0"
global-prefix@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
dependencies:
expand-tilde "^2.0.2"
homedir-polyfill "^1.0.1"
ini "^1.3.4"
is-windows "^1.0.1"
which "^1.2.14"
global-prefix@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
@ -9102,135 +8927,6 @@ growl@1.10.5:
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
grunt-cli@1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.3.tgz#22c9f1a3d2780bf9b0d206e832e40f8f499175ff"
integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==
dependencies:
grunt-known-options "~2.0.0"
interpret "~1.1.0"
liftup "~3.0.1"
nopt "~4.0.1"
v8flags "~3.2.0"
grunt-cli@~1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.2.tgz#8a83dcc89ebd92d278ccd6014105011cffc71165"
integrity sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==
dependencies:
grunt-known-options "~1.1.1"
interpret "~1.1.0"
liftup "~3.0.1"
nopt "~4.0.1"
v8flags "~3.2.0"
grunt-contrib-concat@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz#3af65e4663186abce6052a6bed345b53c0551090"
integrity sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==
dependencies:
chalk "^4.1.2"
source-map "^0.5.3"
grunt-contrib-copy@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz#7060c6581e904b8ab0d00f076e0a8f6e3e7c3573"
integrity sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=
dependencies:
chalk "^1.1.1"
file-sync-cmp "^0.1.0"
grunt-contrib-watch@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz#c143ca5b824b288a024b856639a5345aedb78ed4"
integrity sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==
dependencies:
async "^2.6.0"
gaze "^1.1.0"
lodash "^4.17.10"
tiny-lr "^1.1.1"
grunt-exec@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/grunt-exec/-/grunt-exec-3.0.0.tgz#881f868d64098788fddaf22fa25d8572a9d64dc7"
integrity sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==
grunt-gitinfo@0.1.9:
version "0.1.9"
resolved "https://registry.yarnpkg.com/grunt-gitinfo/-/grunt-gitinfo-0.1.9.tgz#299601084e5638cff0e3e4d36093beb5cec9b9ba"
integrity sha512-nAyUZQrLkgHZuqepTgkA3jn9CX4kyrNcWzjENxo/nOwYjZPEWDJeaxWcYrAzB5OcBk5gYJmTA0r3XCgczxtbPg==
dependencies:
async "~0.9.0"
getobject "~0.1.0"
lodash "^4.17.14"
grunt-known-options@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d"
integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==
grunt-known-options@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c"
integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==
grunt-legacy-log-utils@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz#49a8c7dc74051476dcc116c32faf9db8646856ef"
integrity sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==
dependencies:
chalk "~4.1.0"
lodash "~4.17.19"
grunt-legacy-log@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz#1c6eaf92371ea415af31ea84ce50d434ef6d39c4"
integrity sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==
dependencies:
colors "~1.1.2"
grunt-legacy-log-utils "~2.1.0"
hooker "~0.2.3"
lodash "~4.17.19"
grunt-legacy-util@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz#0f929d13a2faf9988c9917c82bff609e2d9ba255"
integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==
dependencies:
async "~3.2.0"
exit "~0.1.2"
getobject "~1.0.0"
hooker "~0.2.3"
lodash "~4.17.21"
underscore.string "~3.3.5"
which "~2.0.2"
grunt-sass@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/grunt-sass/-/grunt-sass-3.1.0.tgz#a5936cc2a80ec08092d9f31c101dc307d1e4f71c"
integrity sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==
grunt@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.1.tgz#7d1e17db1f9c8108777f7273d6b9359755576f50"
integrity sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==
dependencies:
dateformat "~3.0.3"
eventemitter2 "~0.4.13"
exit "~0.1.2"
findup-sync "~0.3.0"
glob "~7.1.6"
grunt-cli "~1.4.2"
grunt-known-options "~2.0.0"
grunt-legacy-log "~3.0.0"
grunt-legacy-util "~2.0.1"
iconv-lite "~0.4.13"
js-yaml "~3.14.0"
minimatch "~3.0.4"
mkdirp "~1.0.4"
nopt "~3.0.6"
rimraf "~3.0.2"
gud@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
@ -9477,17 +9173,6 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
dependencies:
react-is "^16.7.0"
homedir-polyfill@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8"
integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==
dependencies:
parse-passwd "^1.0.0"
hooker@~0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
hosted-git-info@^2.1.4:
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@ -9748,10 +9433,6 @@ iconv-lite@^0.6.2:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
iconv-lite@~0.4.13:
version "0.4.13"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@ -9987,11 +9668,6 @@ interpret@^2.2.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
interpret@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
intl-tel-input@17.0.13:
version "17.0.13"
resolved "https://registry.yarnpkg.com/intl-tel-input/-/intl-tel-input-17.0.13.tgz#74a51db3b44f47ae8264df7d101a0810e53c77a6"
@ -10043,14 +9719,6 @@ is-absolute-url@^3.0.3:
resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
is-absolute@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
dependencies:
is-relative "^1.0.0"
is-windows "^1.0.1"
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@ -10471,13 +10139,6 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-relative@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
dependencies:
is-unc-path "^1.0.0"
is-root@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c"
@ -10532,13 +10193,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
is-unc-path@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
dependencies:
unc-path-regex "^0.1.2"
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
@ -10560,7 +10214,7 @@ is-window@^1.0.2:
resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d"
integrity sha1-LIlspT25feRdPDMTOmXYyfVjSA0=
is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2:
is-windows@^1.0.0, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@ -10748,14 +10402,6 @@ js-yaml@^3.2.7:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@~3.14.0:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@ -11060,20 +10706,6 @@ libheif-js@^1.10.0:
resolved "https://registry.yarnpkg.com/libheif-js/-/libheif-js-1.12.0.tgz#9ad1ed16a8e6412b4d3d83565d285465a00e7305"
integrity sha512-hDs6xQ7028VOwAFwEtM0Q+B2x2NW69Jb2MhQFUbk3rUrHzz4qo5mqS8VrqNgYnSc8TiUGnR691LnO4uIfEE23w==
liftup@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce"
integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==
dependencies:
extend "^3.0.2"
findup-sync "^4.0.0"
fined "^1.2.0"
flagged-respawn "^1.0.1"
is-plain-object "^2.0.4"
object.map "^1.0.1"
rechoir "^0.7.0"
resolve "^1.19.0"
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
@ -11086,11 +10718,6 @@ linkify-it@2.2.0:
dependencies:
uc.micro "^1.0.1"
livereload-js@^2.3.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c"
integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==
load-json-file@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@ -11201,7 +10828,7 @@ lodash.throttle@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.19, lodash@~4.17.21:
lodash@4.17.21, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.2.1:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -11340,13 +10967,6 @@ make-error@^1.1.1:
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
make-iterator@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
dependencies:
kind-of "^6.0.2"
mamacro@^0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
@ -11359,7 +10979,7 @@ map-age-cleaner@^0.1.1:
dependencies:
p-defer "^1.0.0"
map-cache@^0.2.0, map-cache@^0.2.2:
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@ -11748,7 +11368,7 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2, minimatch@~3.0.4:
minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@ -11860,7 +11480,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
mkdirp@^1.0.3, mkdirp@~1.0.4:
mkdirp@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@ -12262,20 +11882,6 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
nopt@~3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
dependencies:
abbrev "1"
nopt@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-package-data@^2.3.2:
version "2.4.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
@ -12469,7 +12075,7 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
object-inspect@^1.11.0:
object-inspect@^1.11.0, object-inspect@^1.9.0:
version "1.11.1"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b"
integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==
@ -12479,11 +12085,6 @@ object-inspect@^1.7.0, object-inspect@^1.8.0:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
object-inspect@^1.9.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@ -12519,16 +12120,6 @@ object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
object.defaults@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
dependencies:
array-each "^1.0.1"
array-slice "^1.0.0"
for-own "^1.0.0"
isobject "^3.0.0"
object.entries@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
@ -12602,14 +12193,6 @@ object.hasown@^1.1.0:
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.map@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
dependencies:
for-own "^1.0.0"
make-iterator "^1.0.0"
object.omit@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@ -12617,7 +12200,7 @@ object.omit@^2.0.0:
for-own "^0.1.4"
is-extendable "^0.1.1"
object.pick@^1.2.0, object.pick@^1.3.0:
object.pick@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
dependencies:
@ -13011,15 +12594,6 @@ parse-entities@^1.1.2:
is-decimal "^1.0.0"
is-hexadecimal "^1.0.0"
parse-filepath@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
dependencies:
is-absolute "^1.0.0"
map-cache "^0.2.0"
path-root "^0.1.1"
parse-glob@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
@ -13053,11 +12627,6 @@ parse-json@^5.0.0:
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
parse-passwd@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
@ -13145,18 +12714,6 @@ path-parse@^1.0.5, path-parse@^1.0.6:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-root-regex@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
path-root@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
dependencies:
path-root-regex "^0.1.0"
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
@ -13886,13 +13443,6 @@ qs@6.7.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
qs@^6.4.0:
version "6.10.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
dependencies:
side-channel "^1.0.4"
qs@^6.6.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.8.0.tgz#87b763f0d37ca54200334cd57bb2ef8f68a1d081"
@ -14041,14 +13591,6 @@ raw-body@^2.2.0:
iconv-lite "0.4.19"
unpipe "1.0.0"
raw-body@~1.1.0:
version "1.1.7"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425"
integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=
dependencies:
bytes "1"
string_decoder "0.10"
raw-loader@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-2.0.0.tgz#e2813d9e1e3f80d1bbade5ad082e809679e20c26"
@ -15019,14 +14561,6 @@ resolve-cwd@^3.0.0:
dependencies:
resolve-from "^5.0.0"
resolve-dir@^1.0.0, resolve-dir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
dependencies:
expand-tilde "^2.0.0"
global-modules "^1.0.0"
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
@ -15075,7 +14609,7 @@ resolve@^1.13.1, resolve@^1.17.0:
dependencies:
path-parse "^1.0.6"
resolve@^1.19.0, resolve@^1.20.0, resolve@^1.9.0:
resolve@^1.20.0, resolve@^1.9.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@ -15160,7 +14694,7 @@ rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
dependencies:
glob "^7.1.3"
rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2:
rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@ -15234,11 +14768,6 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1,
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-json-parse@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@ -15962,7 +15491,7 @@ split2@4.0.0:
resolved "https://registry.yarnpkg.com/split2/-/split2-4.0.0.tgz#c76cb53ad55040ddff3a9c3b73fc88a4690f047c"
integrity sha512-gjmavJzvQCAZzaEHWoJBOwqIUAiEvUOlguQ6uO0+0LTS1tlLa2YetTLWCrm049ouvLOa1l6SOGm3XaiRiCg9SQ==
sprintf-js@^1.0.3, sprintf-js@^1.1.2:
sprintf-js@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
@ -16069,11 +15598,6 @@ strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
string-template@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
string-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@ -16210,10 +15734,6 @@ string.prototype.trimstart@^1.0.4:
call-bind "^1.0.2"
define-properties "^1.1.3"
string_decoder@0.10, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
string_decoder@^1.0.0, string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@ -16228,6 +15748,10 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
strip-ansi@5.2.0, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
@ -16633,18 +16157,6 @@ tiny-invariant@^1.0.2:
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73"
integrity sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==
tiny-lr@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==
dependencies:
body "^5.1.0"
debug "^3.1.0"
faye-websocket "~0.10.0"
livereload-js "^2.3.0"
object-assign "^4.1.0"
qs "^6.4.0"
tiny-warning@^1.0.0, tiny-warning@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
@ -17009,19 +16521,6 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
unc-path-regex@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
underscore.string@~3.3.5:
version "3.3.5"
resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
dependencies:
sprintf-js "^1.0.3"
util-deprecate "^1.0.2"
underscore@1.12.1, underscore@>=1.8.3:
version "1.12.1"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
@ -17264,13 +16763,6 @@ v8-compile-cache@^2.2.0:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
v8flags@~3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
dependencies:
homedir-polyfill "^1.0.1"
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
@ -17587,14 +17079,14 @@ which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@2.0.2, which@^2.0.1, which@^2.0.2, which@~2.0.2:
which@2.0.2, which@^2.0.1, which@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
which@^1.2.14, which@^1.2.9, which@^1.3.1:
which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==