Merge remote-tracking branch 'origin/develop' into shadow-control-2.0
This commit is contained in:
commit
6fc929a0a0
7
.browserslistrc
Normal file
7
.browserslistrc
Normal file
|
@ -0,0 +1,7 @@
|
|||
>0.2%
|
||||
not op_mini all
|
||||
Safari > 15
|
||||
Firefox >= 115
|
||||
Firefox ESR
|
||||
Android > 4
|
||||
not dead
|
|
@ -45,6 +45,7 @@ test:
|
|||
stage: test
|
||||
tags:
|
||||
- amd64
|
||||
- himem
|
||||
variables:
|
||||
APT_CACHE_DIR: apt-cache
|
||||
script:
|
||||
|
@ -58,6 +59,7 @@ build:
|
|||
stage: build
|
||||
tags:
|
||||
- amd64
|
||||
- himem
|
||||
script:
|
||||
- yarn
|
||||
- npm run build
|
||||
|
|
9
changelog.d/browsers-support.change
Normal file
9
changelog.d/browsers-support.change
Normal file
|
@ -0,0 +1,9 @@
|
|||
Updated our build system to support browsers:
|
||||
Safari >= 15
|
||||
Firefox >= 115
|
||||
Android > 4
|
||||
no Opera Mini support
|
||||
no IE support
|
||||
no "dead" (unmaintained) browsers support
|
||||
|
||||
This does not guarantee that browsers will or will not work.
|
1
changelog.d/date-absolute.add
Normal file
1
changelog.d/date-absolute.add
Normal file
|
@ -0,0 +1 @@
|
|||
Support displaying time in absolute format
|
1
changelog.d/non-anonymous-polls.add
Normal file
1
changelog.d/non-anonymous-polls.add
Normal file
|
@ -0,0 +1 @@
|
|||
Inform users that Smithereen public polls are public
|
0
changelog.d/piss-fix.skip
Normal file
0
changelog.d/piss-fix.skip
Normal file
0
changelog.d/piss-serialization.skip
Normal file
0
changelog.d/piss-serialization.skip
Normal file
|
@ -24,7 +24,7 @@
|
|||
"@fortawesome/vue-fontawesome": "3.0.3",
|
||||
"@kazvmoe-infra/pinch-zoom-element": "1.2.0",
|
||||
"@kazvmoe-infra/unicode-emoji-json": "0.4.0",
|
||||
"@ruffle-rs/ruffle": "0.1.0-nightly.2024.3.17",
|
||||
"@ruffle-rs/ruffle": "0.1.0-nightly.2024.8.21",
|
||||
"@vuelidate/core": "2.0.3",
|
||||
"@vuelidate/validators": "2.0.4",
|
||||
"body-scroll-lock": "3.1.5",
|
||||
|
@ -58,7 +58,7 @@
|
|||
"@intlify/vue-i18n-loader": "5.0.1",
|
||||
"@ungap/event-target": "0.2.4",
|
||||
"@vue/babel-helper-vue-jsx-merge-props": "1.4.0",
|
||||
"@vue/babel-plugin-jsx": "1.2.1",
|
||||
"@vue/babel-plugin-jsx": "1.2.2",
|
||||
"@vue/compiler-sfc": "3.2.45",
|
||||
"@vue/test-utils": "2.2.8",
|
||||
"autoprefixer": "10.4.19",
|
||||
|
@ -88,9 +88,9 @@
|
|||
"http-proxy-middleware": "2.0.6",
|
||||
"iso-639-1": "2.1.15",
|
||||
"json-loader": "0.5.7",
|
||||
"karma": "6.4.2",
|
||||
"karma": "6.4.4",
|
||||
"karma-coverage": "2.2.0",
|
||||
"karma-firefox-launcher": "2.1.2",
|
||||
"karma-firefox-launcher": "2.1.3",
|
||||
"karma-mocha": "2.0.1",
|
||||
"karma-mocha-reporter": "2.2.5",
|
||||
"karma-sinon-chai": "2.0.2",
|
||||
|
|
|
@ -27,7 +27,9 @@ export default {
|
|||
component: 'Alert'
|
||||
},
|
||||
component: 'Border',
|
||||
textColor: '--parent'
|
||||
directives: {
|
||||
textColor: '--parent'
|
||||
}
|
||||
},
|
||||
{
|
||||
variant: 'error',
|
||||
|
|
|
@ -34,8 +34,8 @@ export default {
|
|||
directives: {
|
||||
'--defaultButtonHoverGlow': 'shadow | 0 0 4 --text',
|
||||
'--defaultButtonShadow': 'shadow | 0 0 2 #000000',
|
||||
'--defaultButtonBevel': 'shadow | $borderSide(#FFFFFF, top, 0.2) | $borderSide(#000000, bottom, 0.2)',
|
||||
'--pressedButtonBevel': 'shadow | $borderSide(#FFFFFF, bottom, 0.2)| $borderSide(#000000, top, 0.2)'
|
||||
'--defaultButtonBevel': 'shadow | $borderSide(#FFFFFF, top, 0.2), $borderSide(#000000, bottom, 0.2)',
|
||||
'--pressedButtonBevel': 'shadow | $borderSide(#FFFFFF, bottom, 0.2), $borderSide(#000000, top, 0.2)'
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -27,7 +27,7 @@ export default {
|
|||
{
|
||||
component: 'Root',
|
||||
directives: {
|
||||
'--defaultInputBevel': 'shadow | $borderSide(#FFFFFF, bottom, 0.2)| $borderSide(#000000, top, 0.2)'
|
||||
'--defaultInputBevel': 'shadow | $borderSide(#FFFFFF, bottom, 0.2), $borderSide(#000000, top, 0.2)'
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -76,6 +76,13 @@
|
|||
>
|
||||
{{ $t('polls.vote') }}
|
||||
</button>
|
||||
<span
|
||||
v-if="poll.pleroma?.non_anonymous"
|
||||
:title="$t('polls.non_anonymous_title')"
|
||||
>
|
||||
{{ $t('polls.non_anonymous') }}
|
||||
·
|
||||
</span>
|
||||
<div class="total">
|
||||
<template v-if="typeof poll.voters_count === 'number'">
|
||||
{{ $tc("polls.people_voted_count", poll.voters_count, { count: poll.voters_count }) }}
|
||||
|
|
|
@ -217,6 +217,29 @@
|
|||
{{ $t('settings.no_rich_text_description') }}
|
||||
</BooleanSetting>
|
||||
</li>
|
||||
<li>
|
||||
<BooleanSetting
|
||||
path="useAbsoluteTimeFormat"
|
||||
expert="1"
|
||||
>
|
||||
{{ $t('settings.absolute_time_format') }}
|
||||
</BooleanSetting>
|
||||
</li>
|
||||
<ul
|
||||
class="setting-list suboptions"
|
||||
v-if="mergedConfig.useAbsoluteTimeFormat"
|
||||
>
|
||||
<li>
|
||||
<UnitSetting
|
||||
path="absoluteTimeFormatMinAge"
|
||||
unit-set="time"
|
||||
:units="['s', 'm', 'h', 'd']"
|
||||
:min="0"
|
||||
>
|
||||
{{ $t('settings.absolute_time_format_min_age') }}
|
||||
</UnitSetting>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>{{ $t('settings.attachments') }}</h3>
|
||||
<li>
|
||||
<BooleanSetting
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
:datetime="time"
|
||||
:title="localeDateString"
|
||||
>
|
||||
{{ relativeTimeString }}
|
||||
{{ relativeOrAbsoluteTimeString }}
|
||||
</time>
|
||||
</template>
|
||||
|
||||
|
@ -16,16 +16,28 @@ export default {
|
|||
props: ['time', 'autoUpdate', 'longFormat', 'nowThreshold', 'templateKey'],
|
||||
data () {
|
||||
return {
|
||||
relativeTimeMs: 0,
|
||||
relativeTime: { key: 'time.now', num: 0 },
|
||||
interval: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
localeDateString () {
|
||||
const browserLocale = localeService.internalToBrowserLocale(this.$i18n.locale)
|
||||
shouldUseAbsoluteTimeFormat () {
|
||||
if (!this.$store.getters.mergedConfig.useAbsoluteTimeFormat) {
|
||||
return false
|
||||
}
|
||||
return DateUtils.durationStrToMs(this.$store.getters.mergedConfig.absoluteTimeFormatMinAge) <= this.relativeTimeMs
|
||||
},
|
||||
browserLocale () {
|
||||
return localeService.internalToBrowserLocale(this.$i18n.locale)
|
||||
},
|
||||
timeAsDate () {
|
||||
return typeof this.time === 'string'
|
||||
? new Date(Date.parse(this.time)).toLocaleString(browserLocale)
|
||||
: this.time.toLocaleString(browserLocale)
|
||||
? new Date(Date.parse(this.time))
|
||||
: this.time
|
||||
},
|
||||
localeDateString () {
|
||||
return this.timeAsDate.toLocaleString(this.browserLocale)
|
||||
},
|
||||
relativeTimeString () {
|
||||
const timeString = this.$i18n.tc(this.relativeTime.key, this.relativeTime.num, [this.relativeTime.num])
|
||||
|
@ -35,6 +47,40 @@ export default {
|
|||
}
|
||||
|
||||
return timeString
|
||||
},
|
||||
absoluteTimeString () {
|
||||
if (this.longFormat) {
|
||||
return this.localeDateString
|
||||
}
|
||||
const now = new Date()
|
||||
const formatter = (() => {
|
||||
if (DateUtils.isSameDay(this.timeAsDate, now)) {
|
||||
return new Intl.DateTimeFormat(this.browserLocale, {
|
||||
minute: 'numeric',
|
||||
hour: 'numeric'
|
||||
})
|
||||
} else if (DateUtils.isSameMonth(this.timeAsDate, now)) {
|
||||
return new Intl.DateTimeFormat(this.browserLocale, {
|
||||
hour: 'numeric',
|
||||
day: 'numeric'
|
||||
})
|
||||
} else if (DateUtils.isSameYear(this.timeAsDate, now)) {
|
||||
return new Intl.DateTimeFormat(this.browserLocale, {
|
||||
month: 'short',
|
||||
day: 'numeric'
|
||||
})
|
||||
} else {
|
||||
return new Intl.DateTimeFormat(this.browserLocale, {
|
||||
year: 'numeric',
|
||||
month: 'short'
|
||||
})
|
||||
}
|
||||
})()
|
||||
|
||||
return formatter.format(this.timeAsDate)
|
||||
},
|
||||
relativeOrAbsoluteTimeString () {
|
||||
return this.shouldUseAbsoluteTimeFormat ? this.absoluteTimeString : this.relativeTimeString
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
@ -54,6 +100,7 @@ export default {
|
|||
methods: {
|
||||
refreshRelativeTimeObject () {
|
||||
const nowThreshold = typeof this.nowThreshold === 'number' ? this.nowThreshold : 1
|
||||
this.relativeTimeMs = DateUtils.relativeTimeMs(this.time)
|
||||
this.relativeTime = this.longFormat
|
||||
? DateUtils.relativeTime(this.time, nowThreshold)
|
||||
: DateUtils.relativeTimeShort(this.time, nowThreshold)
|
||||
|
|
|
@ -229,7 +229,9 @@
|
|||
"expiry": "Poll age",
|
||||
"expires_in": "Poll ends in {0}",
|
||||
"expired": "Poll ended {0} ago",
|
||||
"not_enough_options": "Too few unique options in poll"
|
||||
"not_enough_options": "Too few unique options in poll",
|
||||
"non_anonymous": "Public poll",
|
||||
"non_anonymous_title": "Other instances may display the options you voted for"
|
||||
},
|
||||
"emoji": {
|
||||
"stickers": "Stickers",
|
||||
|
@ -506,6 +508,8 @@
|
|||
"autocomplete_select_first": "Automatically select the first candidate when autocomplete results are available",
|
||||
"emoji_reactions_on_timeline": "Show emoji reactions on timeline",
|
||||
"emoji_reactions_scale": "Reactions scale factor",
|
||||
"absolute_time_format": "Use absolute time format",
|
||||
"absolute_time_format_min_age": "Only use for time older than this amount of time",
|
||||
"export_theme": "Save preset",
|
||||
"filtering": "Filtering",
|
||||
"wordfilter": "Wordfilter",
|
||||
|
|
|
@ -190,7 +190,8 @@
|
|||
"mobile_notifications_close": "關掉通知",
|
||||
"announcements": "公告",
|
||||
"search": "Tshuē",
|
||||
"mobile_notifications_mark_as_seen": "Lóng 標做有讀"
|
||||
"mobile_notifications_mark_as_seen": "Lóng 標做有讀",
|
||||
"quotes": "引用"
|
||||
},
|
||||
"notifications": {
|
||||
"broken_favorite": "狀態毋知影,leh tshiau-tshuē……",
|
||||
|
@ -212,7 +213,8 @@
|
|||
"unread_follow_requests": "{num}ê新ê跟tuè請求",
|
||||
"configuration_tip": "用{theSettings},lí通自訂siánn物佇tsia顯示。{dismiss}",
|
||||
"configuration_tip_settings": "設定",
|
||||
"configuration_tip_dismiss": "Mài koh顯示"
|
||||
"configuration_tip_dismiss": "Mài koh顯示",
|
||||
"subscribed_status": "有發送ê"
|
||||
},
|
||||
"polls": {
|
||||
"add_poll": "開投票",
|
||||
|
@ -252,7 +254,8 @@
|
|||
},
|
||||
"load_all_hint": "載入頭前 {saneAmount} ê 繪文字,規个攏載入效能可能 ē khah 食力。",
|
||||
"load_all": "Kā {emojiAmount} ê 繪文字攏載入",
|
||||
"regional_indicator": "地區指引 {letter}"
|
||||
"regional_indicator": "地區指引 {letter}",
|
||||
"hide_custom_emoji": "Khàm掉自訂ê繪文字"
|
||||
},
|
||||
"errors": {
|
||||
"storage_unavailable": "Pleroma buē-tàng the̍h 著瀏覽器儲存 ê。Lí ê 登入狀態抑是局部設定 buē 儲存,mā 凡勢 tú 著意料外 ê 問題。拍開 cookie 看māi。"
|
||||
|
@ -263,7 +266,8 @@
|
|||
"emoji_reactions": "繪文字 ê 反應",
|
||||
"reports": "檢舉",
|
||||
"moves": "用者 ê 移民",
|
||||
"load_older": "載入 koh khah 早 ê 互動"
|
||||
"load_older": "載入 koh khah 早 ê 互動",
|
||||
"statuses": "訂ê"
|
||||
},
|
||||
"post_status": {
|
||||
"edit_status": "編輯狀態",
|
||||
|
@ -935,7 +939,34 @@
|
|||
"notification_extra_chats": "顯示bô讀ê開講",
|
||||
"notification_extra_announcements": "顯示bô讀ê公告",
|
||||
"notification_extra_follow_requests": "顯示新ê跟tuè請求",
|
||||
"notification_extra_tip": "顯示自訂其他通知ê撇步"
|
||||
"notification_extra_tip": "顯示自訂其他通知ê撇步",
|
||||
"confirm_new_setting": "Lí敢確認新ê設定?",
|
||||
"text_size_tip": "用 {0} 做絕對值,{1} ē根據瀏覽器ê標準文字sài-suh放大縮小。",
|
||||
"theme_debug": "佇處理透明ê時,顯示背景主題ia̋n-jín 所假使ê(DEBUG)",
|
||||
"units": {
|
||||
"time": {
|
||||
"s": "秒鐘",
|
||||
"m": "分鐘",
|
||||
"h": "點鐘",
|
||||
"d": "工"
|
||||
}
|
||||
},
|
||||
"actor_type": "Tsit ê口座是:",
|
||||
"actor_type_Person": "一般ê用者",
|
||||
"actor_type_description": "標記lí ê口座做群組,ē hōo自動轉送提起伊ê狀態。",
|
||||
"actor_type_Group": "群組",
|
||||
"actor_type_Service": "機器lâng",
|
||||
"appearance": "外觀",
|
||||
"confirm_new_question": "Tse看起來kám好?設定ē佇10秒鐘後改轉去。",
|
||||
"revert": "改轉去",
|
||||
"confirm": "確認",
|
||||
"text_size": "文字kap界面ê sài-suh",
|
||||
"text_size_tip2": "毋是 {0} ê值可能ē破壞一寡物件kap主題",
|
||||
"emoji_size": "繪文字ê sài-suh",
|
||||
"navbar_size": "頂 liâu-á êsài-suh",
|
||||
"panel_header_size": "面pang標題ê sài-suh",
|
||||
"visual_tweaks": "細細ê外觀調整",
|
||||
"scale_and_layout": "界面ê sài-suh kap排列"
|
||||
},
|
||||
"status": {
|
||||
"favorites": "收藏",
|
||||
|
@ -1001,7 +1032,7 @@
|
|||
"show_only_conversation_under_this": "Kan-ta顯示tsit ê狀態ê回應",
|
||||
"status_history": "狀態ê歷史",
|
||||
"reaction_count_label": "{num}ê lâng用表情反應",
|
||||
"hide_quote": "Khàm條引用ê狀態",
|
||||
"hide_quote": "Khàm掉引用ê狀態",
|
||||
"display_quote": "顯示引用ê狀態",
|
||||
"invisible_quote": "引用ê狀態bē當用:{link}",
|
||||
"more_actions": "佇tsit ê狀態ê其他動作"
|
||||
|
|
|
@ -180,7 +180,9 @@ export const defaultState = {
|
|||
autocompleteSelect: undefined, // instance default
|
||||
closingDrawerMarksAsSeen: undefined, // instance default
|
||||
unseenAtTop: undefined, // instance default
|
||||
ignoreInactionableSeen: undefined // instance default
|
||||
ignoreInactionableSeen: undefined, // instance default
|
||||
useAbsoluteTimeFormat: undefined, // instance defualt
|
||||
absoluteTimeFormatMinAge: undefined // instance default
|
||||
}
|
||||
|
||||
// caching the instance default properties
|
||||
|
|
|
@ -119,6 +119,8 @@ const defaultState = {
|
|||
closingDrawerMarksAsSeen: true,
|
||||
unseenAtTop: false,
|
||||
ignoreInactionableSeen: false,
|
||||
useAbsoluteTimeFormat: false,
|
||||
absoluteTimeFormatMinAge: '0d',
|
||||
|
||||
// Nasty stuff
|
||||
customEmoji: [],
|
||||
|
|
|
@ -6,10 +6,13 @@ export const WEEK = 7 * DAY
|
|||
export const MONTH = 30 * DAY
|
||||
export const YEAR = 365.25 * DAY
|
||||
|
||||
export const relativeTime = (date, nowThreshold = 1) => {
|
||||
export const relativeTimeMs = (date) => {
|
||||
if (typeof date === 'string') date = Date.parse(date)
|
||||
return Math.abs(Date.now() - date)
|
||||
}
|
||||
export const relativeTime = (date, nowThreshold = 1) => {
|
||||
const round = Date.now() > date ? Math.floor : Math.ceil
|
||||
const d = Math.abs(Date.now() - date)
|
||||
const d = relativeTimeMs(date)
|
||||
const r = { num: round(d / YEAR), key: 'time.unit.years' }
|
||||
if (d < nowThreshold * SECOND) {
|
||||
r.num = 0
|
||||
|
@ -57,3 +60,39 @@ export const secondsToUnit = (unit, amount) => {
|
|||
case 'days': return (1000 * amount) / DAY
|
||||
}
|
||||
}
|
||||
|
||||
export const isSameYear = (a, b) => {
|
||||
return a.getFullYear() === b.getFullYear()
|
||||
}
|
||||
|
||||
export const isSameMonth = (a, b) => {
|
||||
return a.getFullYear() === b.getFullYear() &&
|
||||
a.getMonth() === b.getMonth()
|
||||
}
|
||||
|
||||
export const isSameDay = (a, b) => {
|
||||
return a.getFullYear() === b.getFullYear() &&
|
||||
a.getMonth() === b.getMonth() &&
|
||||
a.getDate() === b.getDate()
|
||||
}
|
||||
|
||||
export const durationStrToMs = (str) => {
|
||||
if (typeof str !== 'string') {
|
||||
return 0
|
||||
}
|
||||
|
||||
const unit = str.replace(/[0-9,.]+/, '')
|
||||
const value = str.replace(/[^0-9,.]+/, '')
|
||||
switch (unit) {
|
||||
case 'd':
|
||||
return value * DAY
|
||||
case 'h':
|
||||
return value * HOUR
|
||||
case 'm':
|
||||
return value * MINUTE
|
||||
case 's':
|
||||
return value * SECOND
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ const internalToBackendLocaleMulti = codes => {
|
|||
|
||||
const getLanguageName = (code) => {
|
||||
const specialLanguageNames = {
|
||||
pdc: 'Pennsylvania Dutch',
|
||||
pdc: 'Pennsilfaanisch-Deitsch',
|
||||
ja_easy: 'やさしいにほんご',
|
||||
'nan-TW': '臺語(閩南語)',
|
||||
zh: '简体中文',
|
||||
|
|
157
src/services/theme_data/iss_deserializer.js
Normal file
157
src/services/theme_data/iss_deserializer.js
Normal file
|
@ -0,0 +1,157 @@
|
|||
import { flattenDeep } from 'lodash'
|
||||
|
||||
const parseShadow = string => {
|
||||
const modes = ['_full', 'inset', 'x', 'y', 'blur', 'spread', 'color', 'alpha']
|
||||
const regexPrep = [
|
||||
// inset keyword (optional)
|
||||
'^(?:(inset)\\s+)?',
|
||||
// x
|
||||
'(?:(-?[0-9]+(?:\\.[0-9]+)?)\\s+)',
|
||||
// y
|
||||
'(?:(-?[0-9]+(?:\\.[0-9]+)?)\\s+)',
|
||||
// blur (optional)
|
||||
'(?:(-?[0-9]+(?:\\.[0-9]+)?)\\s+)?',
|
||||
// spread (optional)
|
||||
'(?:(-?[0-9]+(?:\\.[0-9]+)?)\\s+)?',
|
||||
// either hex, variable or function
|
||||
'(#[0-9a-f]{6}|--[a-z\\-_]+|\\$[a-z\\-()_]+)',
|
||||
// opacity (optional)
|
||||
'(?:\\s+\\/\\s+([0-9]+(?:\\.[0-9]+)?)\\s*)?$'
|
||||
].join('')
|
||||
const regex = new RegExp(regexPrep, 'gis') // global, (stable) indices, single-string
|
||||
const result = regex.exec(string)
|
||||
if (result == null) {
|
||||
return string
|
||||
} else {
|
||||
const numeric = new Set(['x', 'y', 'blur', 'spread', 'alpha'])
|
||||
const { x, y, blur, spread, alpha, inset, color } = Object.fromEntries(modes.map((mode, i) => {
|
||||
if (numeric.has(mode)) {
|
||||
return [mode, Number(result[i])]
|
||||
} else if (mode === 'inset') {
|
||||
return [mode, !!result[i]]
|
||||
} else {
|
||||
return [mode, result[i]]
|
||||
}
|
||||
}).filter(([k, v]) => v !== false).slice(1))
|
||||
|
||||
return { x, y, blur, spread, color, alpha, inset }
|
||||
}
|
||||
}
|
||||
// this works nearly the same as HTML tree converter
|
||||
const parseIss = (input) => {
|
||||
const buffer = [{ selector: null, content: [] }]
|
||||
let textBuffer = ''
|
||||
|
||||
const getCurrentBuffer = () => {
|
||||
let current = buffer[buffer.length - 1]
|
||||
if (current == null) {
|
||||
current = { selector: null, content: [] }
|
||||
}
|
||||
return current
|
||||
}
|
||||
|
||||
// Processes current line buffer, adds it to output buffer and clears line buffer
|
||||
const flushText = (kind) => {
|
||||
if (textBuffer === '') return
|
||||
if (kind === 'content') {
|
||||
getCurrentBuffer().content.push(textBuffer.trim())
|
||||
} else {
|
||||
getCurrentBuffer().selector = textBuffer.trim()
|
||||
}
|
||||
textBuffer = ''
|
||||
}
|
||||
|
||||
for (let i = 0; i < input.length; i++) {
|
||||
const char = input[i]
|
||||
|
||||
if (char === ';') {
|
||||
flushText('content')
|
||||
} else if (char === '{') {
|
||||
flushText('header')
|
||||
} else if (char === '}') {
|
||||
flushText('content')
|
||||
buffer.push({ selector: null, content: [] })
|
||||
textBuffer = ''
|
||||
} else {
|
||||
textBuffer += char
|
||||
}
|
||||
}
|
||||
|
||||
return buffer
|
||||
}
|
||||
export const deserialize = (input) => {
|
||||
const ast = parseIss(input)
|
||||
const finalResult = ast.filter(i => i.selector != null).map(item => {
|
||||
const { selector, content } = item
|
||||
let stateCount = 0
|
||||
const selectors = selector.split(/,/g)
|
||||
const result = selectors.map(selector => {
|
||||
const output = { component: '' }
|
||||
let currentDepth = null
|
||||
|
||||
selector.split(/ /g).reverse().forEach((fragment, index, arr) => {
|
||||
const fragmentObject = { component: '' }
|
||||
|
||||
let mode = 'component'
|
||||
for (let i = 0; i < fragment.length; i++) {
|
||||
const char = fragment[i]
|
||||
switch (char) {
|
||||
case '.': {
|
||||
mode = 'variant'
|
||||
fragmentObject.variant = ''
|
||||
break
|
||||
}
|
||||
case ':': {
|
||||
mode = 'state'
|
||||
fragmentObject.state = fragmentObject.state || []
|
||||
stateCount++
|
||||
break
|
||||
}
|
||||
default: {
|
||||
if (mode === 'state') {
|
||||
const currentState = fragmentObject.state[stateCount - 1]
|
||||
if (currentState == null) {
|
||||
fragmentObject.state.push('')
|
||||
}
|
||||
fragmentObject.state[stateCount - 1] += char
|
||||
} else {
|
||||
fragmentObject[mode] += char
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentDepth !== null) {
|
||||
currentDepth.parent = { ...fragmentObject }
|
||||
currentDepth = currentDepth.parent
|
||||
} else {
|
||||
Object.keys(fragmentObject).forEach(key => {
|
||||
output[key] = fragmentObject[key]
|
||||
})
|
||||
if (index !== (arr.length - 1)) {
|
||||
output.parent = { component: '' }
|
||||
}
|
||||
currentDepth = output
|
||||
}
|
||||
})
|
||||
|
||||
output.directives = Object.fromEntries(content.map(d => {
|
||||
const [property, value] = d.split(':')
|
||||
let realValue = value.trim()
|
||||
if (property === 'shadow') {
|
||||
if (realValue === 'none') {
|
||||
realValue = []
|
||||
} else {
|
||||
realValue = value.split(',').map(v => parseShadow(v.trim()))
|
||||
}
|
||||
} if (!Number.isNaN(Number(value))) {
|
||||
realValue = Number(value)
|
||||
}
|
||||
return [property, realValue]
|
||||
}))
|
||||
|
||||
return output
|
||||
})
|
||||
return result
|
||||
})
|
||||
return flattenDeep(finalResult)
|
||||
}
|
48
src/services/theme_data/iss_serializer.js
Normal file
48
src/services/theme_data/iss_serializer.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
import { unroll } from './iss_utils.js'
|
||||
|
||||
const serializeShadow = s => {
|
||||
if (typeof s === 'object') {
|
||||
return `${s.inset ? 'inset ' : ''}${s.x} ${s.y} ${s.blur} ${s.spread} ${s.color} / ${s.alpha}`
|
||||
} else {
|
||||
return s
|
||||
}
|
||||
}
|
||||
|
||||
export const serialize = (ruleset) => {
|
||||
return ruleset.map((rule) => {
|
||||
if (Object.keys(rule.directives || {}).length === 0) return false
|
||||
|
||||
const header = unroll(rule).reverse().map(rule => {
|
||||
const { component } = rule
|
||||
const newVariant = (rule.variant == null || rule.variant === 'normal') ? '' : ('.' + rule.variant)
|
||||
const newState = (rule.state || []).filter(st => st !== 'normal')
|
||||
|
||||
return `${component}${newVariant}${newState.map(st => ':' + st).join('')}`
|
||||
}).join(' ')
|
||||
|
||||
const content = Object.entries(rule.directives).map(([directive, value]) => {
|
||||
if (directive.startsWith('--')) {
|
||||
const [valType, newValue] = value.split('|') // only first one! intentional!
|
||||
switch (valType) {
|
||||
case 'shadow':
|
||||
return ` ${directive}: ${valType.trim()} | ${newValue.map(serializeShadow).map(s => s.trim()).join(', ')}`
|
||||
default:
|
||||
return ` ${directive}: ${valType.trim()} | ${newValue.trim()}`
|
||||
}
|
||||
} else {
|
||||
switch (directive) {
|
||||
case 'shadow':
|
||||
if (value.length > 0) {
|
||||
return ` ${directive}: ${value.map(serializeShadow).join(', ')}`
|
||||
} else {
|
||||
return ` ${directive}: none`
|
||||
}
|
||||
default:
|
||||
return ` ${directive}: ${value}`
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return `${header} {\n${content.join(';\n')}\n}`
|
||||
}).filter(x => x).join('\n\n')
|
||||
}
|
|
@ -522,9 +522,21 @@ export const init = ({
|
|||
console.debug('Eager processing took ' + (t2 - t1) + ' ms')
|
||||
}
|
||||
|
||||
// optimization to traverse big-ass array only once instead of twice
|
||||
const eager = []
|
||||
const lazy = []
|
||||
|
||||
result.forEach(x => {
|
||||
if (typeof x === 'function') {
|
||||
lazy.push(x)
|
||||
} else {
|
||||
eager.push(x)
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
lazy: result.filter(x => typeof x === 'function'),
|
||||
eager: result.filter(x => typeof x !== 'function'),
|
||||
lazy,
|
||||
eager,
|
||||
staticVars,
|
||||
engineChecksum
|
||||
}
|
||||
|
|
276
test/unit/specs/components/gallery.spec.js
Normal file
276
test/unit/specs/components/gallery.spec.js
Normal file
|
@ -0,0 +1,276 @@
|
|||
import Gallery from 'src/components/gallery/gallery.vue'
|
||||
|
||||
describe('Gallery', () => {
|
||||
let local
|
||||
|
||||
it('attachments is falsey', () => {
|
||||
local = { attachments: false }
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([])
|
||||
|
||||
local = { attachments: null }
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([])
|
||||
|
||||
local = { attachments: undefined }
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([])
|
||||
})
|
||||
|
||||
it('no attachments', () => {
|
||||
local = { attachments: [] }
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([])
|
||||
})
|
||||
|
||||
it('one audio attachment', () => {
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'audio/mpeg' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] }
|
||||
])
|
||||
})
|
||||
|
||||
it('one image attachment', () => {
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/png' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ items: [{ mimetype: 'image/png' }] }
|
||||
])
|
||||
})
|
||||
|
||||
it('one audio attachment and one image attachment', () => {
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }] }
|
||||
])
|
||||
})
|
||||
|
||||
it('has "size" key set to "hide"', () => {
|
||||
let local
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'audio/mpeg' }
|
||||
],
|
||||
size: 'hide'
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ minimal: true, items: [{ mimetype: 'audio/mpeg' }] }
|
||||
])
|
||||
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' }
|
||||
],
|
||||
size: 'hide'
|
||||
}
|
||||
|
||||
// When defining `size: hide`, the `items` aren't
|
||||
// grouped and `audio` isn't set
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ minimal: true, items: [{ mimetype: 'image/jpg' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/png' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/jpg' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/png' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/jpg' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/png' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'image/jpg' }] }
|
||||
])
|
||||
})
|
||||
|
||||
// types other than image or audio should be `minimal`
|
||||
it('non-image/audio', () => {
|
||||
let local
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'plain/text' }
|
||||
]
|
||||
}
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ minimal: true, items: [{ mimetype: 'plain/text' }] }
|
||||
])
|
||||
|
||||
// No grouping of non-image/audio items
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'plain/text' },
|
||||
{ mimetype: 'plain/text' },
|
||||
{ mimetype: 'plain/text' }
|
||||
]
|
||||
}
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ minimal: true, items: [{ mimetype: 'plain/text' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'plain/text' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'plain/text' }] }
|
||||
])
|
||||
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'plain/text' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'audio/mpeg' }
|
||||
]
|
||||
}
|
||||
// NOTE / TODO: When defining `size: hide`, the `items` aren't
|
||||
// grouped and `audio` isn't set
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ items: [{ mimetype: 'image/png' }] },
|
||||
{ minimal: true, items: [{ mimetype: 'plain/text' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }] },
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] }
|
||||
])
|
||||
})
|
||||
|
||||
it('mixed attachments', () => {
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/jpg' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }] },
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/jpg' }, { mimetype: 'image/jpg' }] }
|
||||
])
|
||||
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'audio/mpeg' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/jpg' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }] },
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }] },
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] }
|
||||
])
|
||||
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' }
|
||||
]
|
||||
}
|
||||
|
||||
// Group by three-per-row, unless there's one dangling, then stick it on the end of the last row
|
||||
// https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1785#note_98514
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/jpg' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/png' }, { mimetype: 'image/jpg' }] }
|
||||
])
|
||||
|
||||
local = {
|
||||
attachments: [
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' }
|
||||
]
|
||||
}
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/jpg' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }, { mimetype: 'image/png' }] },
|
||||
{ items: [{ mimetype: 'image/jpg' }, { mimetype: 'image/png' }] }
|
||||
])
|
||||
})
|
||||
|
||||
it('does not do grouping when grid is set', () => {
|
||||
const attachments = [
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'image/jpg' }
|
||||
]
|
||||
|
||||
local = { grid: true, attachments }
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ grid: true, items: attachments }
|
||||
])
|
||||
})
|
||||
|
||||
it('limit is set', () => {
|
||||
const attachments = [
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/png' },
|
||||
{ mimetype: 'image/jpg' },
|
||||
{ mimetype: 'audio/mpeg' },
|
||||
{ mimetype: 'image/jpg' }
|
||||
]
|
||||
|
||||
let local
|
||||
local = { attachments, limit: 2 }
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }] }
|
||||
])
|
||||
|
||||
local = { attachments, limit: 3 }
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }, { mimetype: 'image/jpg' }] }
|
||||
])
|
||||
|
||||
local = { attachments, limit: 4 }
|
||||
|
||||
expect(Gallery.computed.rows.call(local)).to.eql([
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] },
|
||||
{ items: [{ mimetype: 'image/png' }, { mimetype: 'image/jpg' }] },
|
||||
{ audio: true, items: [{ mimetype: 'audio/mpeg' }] }
|
||||
])
|
||||
})
|
||||
})
|
40
test/unit/specs/services/theme_data/iss_deserializer.spec.js
Normal file
40
test/unit/specs/services/theme_data/iss_deserializer.spec.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
import { deserialize } from 'src/services/theme_data/iss_deserializer.js'
|
||||
import { serialize } from 'src/services/theme_data/iss_serializer.js'
|
||||
const componentsContext = require.context('src', true, /\.style.js(on)?$/)
|
||||
|
||||
describe('ISS (de)serialization', () => {
|
||||
componentsContext.keys().forEach(key => {
|
||||
const component = componentsContext(key).default
|
||||
|
||||
it(`(De)serialization of component ${component.name} works`, () => {
|
||||
const normalized = component.defaultRules.map(x => ({ component: component.name, ...x }))
|
||||
const serialized = serialize(normalized)
|
||||
const deserialized = deserialize(serialized)
|
||||
|
||||
// for some reason comparing objects directly fails the assert
|
||||
expect(JSON.stringify(deserialized, null, 2)).to.equal(JSON.stringify(normalized, null, 2))
|
||||
})
|
||||
})
|
||||
|
||||
/*
|
||||
// Debug snippet
|
||||
const onlyComponent = componentsContext('./components/panel_header.style.js').default
|
||||
it.only(`(De)serialization of component ${onlyComponent.name} works`, () => {
|
||||
const normalized = onlyComponent.defaultRules.map(x => ({ component: onlyComponent.name, ...x }))
|
||||
console.log('BEGIN INPUT ================')
|
||||
console.log(normalized)
|
||||
console.log('END INPUT ==================')
|
||||
const serialized = serialize(normalized)
|
||||
console.log('BEGIN SERIAL ===============')
|
||||
console.log(serialized)
|
||||
console.log('END SERIAL =================')
|
||||
const deserialized = deserialize(serialized)
|
||||
console.log('BEGIN DESERIALIZED =========')
|
||||
console.log(serialized)
|
||||
console.log('END DESERIALIZED ===========')
|
||||
|
||||
// for some reason comparing objects directly fails the assert
|
||||
expect(JSON.stringify(deserialized, null, 2)).to.equal(JSON.stringify(normalized, null, 2))
|
||||
})
|
||||
/* */
|
||||
})
|
301
yarn.lock
301
yarn.lock
|
@ -46,6 +46,14 @@
|
|||
"@babel/highlight" "^7.23.4"
|
||||
chalk "^2.4.2"
|
||||
|
||||
"@babel/code-frame@^7.24.1":
|
||||
version "7.24.2"
|
||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
|
||||
integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
|
||||
dependencies:
|
||||
"@babel/highlight" "^7.24.2"
|
||||
picocolors "^1.0.0"
|
||||
|
||||
"@babel/compat-data@^7.17.7":
|
||||
version "7.17.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
|
||||
|
@ -173,14 +181,14 @@
|
|||
"@jridgewell/trace-mapping" "^0.3.17"
|
||||
jsesc "^2.5.1"
|
||||
|
||||
"@babel/generator@^7.23.6":
|
||||
version "7.23.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
|
||||
integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
|
||||
"@babel/generator@^7.24.1":
|
||||
version "7.24.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0"
|
||||
integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==
|
||||
dependencies:
|
||||
"@babel/types" "^7.23.6"
|
||||
"@jridgewell/gen-mapping" "^0.3.2"
|
||||
"@jridgewell/trace-mapping" "^0.3.17"
|
||||
"@babel/types" "^7.24.0"
|
||||
"@jridgewell/gen-mapping" "^0.3.5"
|
||||
"@jridgewell/trace-mapping" "^0.3.25"
|
||||
jsesc "^2.5.1"
|
||||
|
||||
"@babel/helper-annotate-as-pure@^7.16.7":
|
||||
|
@ -422,7 +430,7 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.21.4"
|
||||
|
||||
"@babel/helper-module-imports@^7.22.15":
|
||||
"@babel/helper-module-imports@~7.22.15":
|
||||
version "7.22.15"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
|
||||
integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
|
||||
|
@ -711,6 +719,16 @@
|
|||
chalk "^2.4.2"
|
||||
js-tokens "^4.0.0"
|
||||
|
||||
"@babel/highlight@^7.24.2":
|
||||
version "7.24.2"
|
||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
|
||||
integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
|
||||
dependencies:
|
||||
"@babel/helper-validator-identifier" "^7.22.20"
|
||||
chalk "^2.4.2"
|
||||
js-tokens "^4.0.0"
|
||||
picocolors "^1.0.0"
|
||||
|
||||
"@babel/parser@^7.14.7":
|
||||
version "7.18.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9"
|
||||
|
@ -756,6 +774,11 @@
|
|||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
|
||||
integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
|
||||
|
||||
"@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1":
|
||||
version "7.24.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a"
|
||||
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
|
||||
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
|
||||
|
@ -1465,6 +1488,15 @@
|
|||
"@babel/parser" "^7.22.15"
|
||||
"@babel/types" "^7.22.15"
|
||||
|
||||
"@babel/template@^7.23.9":
|
||||
version "7.24.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
|
||||
integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.23.5"
|
||||
"@babel/parser" "^7.24.0"
|
||||
"@babel/types" "^7.24.0"
|
||||
|
||||
"@babel/traverse@^7.18.10":
|
||||
version "7.18.10"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08"
|
||||
|
@ -1561,19 +1593,19 @@
|
|||
debug "^4.1.0"
|
||||
globals "^11.1.0"
|
||||
|
||||
"@babel/traverse@^7.23.7":
|
||||
version "7.23.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305"
|
||||
integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==
|
||||
"@babel/traverse@^7.23.9":
|
||||
version "7.24.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
|
||||
integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.23.5"
|
||||
"@babel/generator" "^7.23.6"
|
||||
"@babel/code-frame" "^7.24.1"
|
||||
"@babel/generator" "^7.24.1"
|
||||
"@babel/helper-environment-visitor" "^7.22.20"
|
||||
"@babel/helper-function-name" "^7.23.0"
|
||||
"@babel/helper-hoist-variables" "^7.22.5"
|
||||
"@babel/helper-split-export-declaration" "^7.22.6"
|
||||
"@babel/parser" "^7.23.6"
|
||||
"@babel/types" "^7.23.6"
|
||||
"@babel/parser" "^7.24.1"
|
||||
"@babel/types" "^7.24.0"
|
||||
debug "^4.3.1"
|
||||
globals "^11.1.0"
|
||||
|
||||
|
@ -1663,7 +1695,7 @@
|
|||
"@babel/helper-validator-identifier" "^7.19.1"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6":
|
||||
"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
|
||||
version "7.23.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
|
||||
integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
|
||||
|
@ -1672,6 +1704,15 @@
|
|||
"@babel/helper-validator-identifier" "^7.22.20"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@babel/types@^7.23.9", "@babel/types@^7.24.0":
|
||||
version "7.24.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
|
||||
integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
|
||||
dependencies:
|
||||
"@babel/helper-string-parser" "^7.23.4"
|
||||
"@babel/helper-validator-identifier" "^7.22.20"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@chenfengyuan/vue-qrcode@2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@chenfengyuan/vue-qrcode/-/vue-qrcode-2.0.0.tgz#8cd01f6fc528d471680ebe812ec47c830aea7e63"
|
||||
|
@ -1866,6 +1907,15 @@
|
|||
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||
"@jridgewell/trace-mapping" "^0.3.9"
|
||||
|
||||
"@jridgewell/gen-mapping@^0.3.5":
|
||||
version "0.3.5"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
|
||||
integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
|
||||
dependencies:
|
||||
"@jridgewell/set-array" "^1.2.1"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||
"@jridgewell/trace-mapping" "^0.3.24"
|
||||
|
||||
"@jridgewell/resolve-uri@3.1.0":
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
|
||||
|
@ -1876,11 +1926,21 @@
|
|||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
|
||||
integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
|
||||
|
||||
"@jridgewell/resolve-uri@^3.1.0":
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
|
||||
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
|
||||
|
||||
"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
|
||||
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
|
||||
|
||||
"@jridgewell/set-array@^1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
|
||||
integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
|
||||
|
||||
"@jridgewell/source-map@^0.3.2":
|
||||
version "0.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
|
||||
|
@ -1899,7 +1959,7 @@
|
|||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
|
||||
integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.4.15":
|
||||
"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
|
||||
version "1.4.15"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
|
||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||
|
@ -1928,6 +1988,14 @@
|
|||
"@jridgewell/resolve-uri" "3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "1.4.14"
|
||||
|
||||
"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
|
||||
version "0.3.25"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
|
||||
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
|
||||
dependencies:
|
||||
"@jridgewell/resolve-uri" "^3.1.0"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||
|
||||
"@jridgewell/trace-mapping@^0.3.9":
|
||||
version "0.3.14"
|
||||
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
|
||||
|
@ -2014,10 +2082,10 @@
|
|||
"@nodelib/fs.scandir" "2.1.5"
|
||||
fastq "^1.6.0"
|
||||
|
||||
"@ruffle-rs/ruffle@0.1.0-nightly.2024.3.17":
|
||||
version "0.1.0-nightly.2024.3.17"
|
||||
resolved "https://registry.yarnpkg.com/@ruffle-rs/ruffle/-/ruffle-0.1.0-nightly.2024.3.17.tgz#df3626f7277ed85742a602508c191d3186b0cabc"
|
||||
integrity sha512-Wl/7CDZSmomOcfBeOYOO6xUUrN7upnGRDJEm3fpCtN3j5kU8dGF8xzaziAttjkD8byLYS09InE7PlUTyyAwCiQ==
|
||||
"@ruffle-rs/ruffle@0.1.0-nightly.2024.8.21":
|
||||
version "0.1.0-nightly.2024.8.21"
|
||||
resolved "https://registry.yarnpkg.com/@ruffle-rs/ruffle/-/ruffle-0.1.0-nightly.2024.8.21.tgz#e4bdb6386b487dc12471681c7265f565d813e1cf"
|
||||
integrity sha512-nfTPJEPJPo4MrUACuLoW19wNKgF1rrbxCO5if1MZfsWcUxZ6+pwlQWq1JxXalxEjYg8VwJtWzWEchWJQkMckwA==
|
||||
|
||||
"@sinclair/typebox@^0.24.1":
|
||||
version "0.24.51"
|
||||
|
@ -2059,10 +2127,10 @@
|
|||
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918"
|
||||
integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==
|
||||
|
||||
"@socket.io/base64-arraybuffer@~1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#568d9beae00b0d835f4f8c53fd55714986492e61"
|
||||
integrity sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==
|
||||
"@socket.io/component-emitter@~3.1.0":
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
|
||||
integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
|
||||
|
||||
"@testim/chrome-version@^1.1.3":
|
||||
version "1.1.3"
|
||||
|
@ -2084,11 +2152,6 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
|
||||
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
|
||||
|
||||
"@types/component-emitter@^1.2.10":
|
||||
version "1.2.11"
|
||||
resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506"
|
||||
integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==
|
||||
|
||||
"@types/cookie@^0.4.1":
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
|
||||
|
@ -2225,37 +2288,37 @@
|
|||
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2"
|
||||
integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==
|
||||
|
||||
"@vue/babel-helper-vue-transform-on@1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.1.tgz#3a48da809025b9a0eb4f4b3030e0d316c40fac0a"
|
||||
integrity sha512-jtEXim+pfyHWwvheYwUwSXm43KwQo8nhOBDyjrUITV6X2tB7lJm6n/+4sqR8137UVZZul5hBzWHdZ2uStYpyRQ==
|
||||
"@vue/babel-helper-vue-transform-on@1.2.2":
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz#7f1f817a4f00ad531651a8d1d22e22d9e42807ef"
|
||||
integrity sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==
|
||||
|
||||
"@vue/babel-plugin-jsx@1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.1.tgz#786c5395605a1d2463d6b10d8a7f3abdc01d25ce"
|
||||
integrity sha512-Yy9qGktktXhB39QE99So/BO2Uwm/ZG+gpL9vMg51ijRRbINvgbuhyJEi4WYmGRMx/MSTfK0xjgZ3/MyY+iLCEg==
|
||||
"@vue/babel-plugin-jsx@1.2.2":
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz#eb426fb4660aa510bb8d188ff0ec140405a97d8a"
|
||||
integrity sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==
|
||||
dependencies:
|
||||
"@babel/helper-module-imports" "^7.22.15"
|
||||
"@babel/helper-module-imports" "~7.22.15"
|
||||
"@babel/helper-plugin-utils" "^7.22.5"
|
||||
"@babel/plugin-syntax-jsx" "^7.23.3"
|
||||
"@babel/template" "^7.22.15"
|
||||
"@babel/traverse" "^7.23.7"
|
||||
"@babel/types" "^7.23.6"
|
||||
"@vue/babel-helper-vue-transform-on" "1.2.1"
|
||||
"@vue/babel-plugin-resolve-type" "1.2.1"
|
||||
"@babel/template" "^7.23.9"
|
||||
"@babel/traverse" "^7.23.9"
|
||||
"@babel/types" "^7.23.9"
|
||||
"@vue/babel-helper-vue-transform-on" "1.2.2"
|
||||
"@vue/babel-plugin-resolve-type" "1.2.2"
|
||||
camelcase "^6.3.0"
|
||||
html-tags "^3.3.1"
|
||||
svg-tags "^1.0.0"
|
||||
|
||||
"@vue/babel-plugin-resolve-type@1.2.1":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.1.tgz#874fb3e02d033b3dd2e0fc883a3d1ceef0bdf39b"
|
||||
integrity sha512-IOtnI7pHunUzHS/y+EG/yPABIAp0VN8QhQ0UCS09jeMVxgAnI9qdOzO85RXdQGxq+aWCdv8/+k3W0aYO6j/8fQ==
|
||||
"@vue/babel-plugin-resolve-type@1.2.2":
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz#66844898561da6449e0f4a261b0c875118e0707b"
|
||||
integrity sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.23.5"
|
||||
"@babel/helper-module-imports" "^7.22.15"
|
||||
"@babel/helper-module-imports" "~7.22.15"
|
||||
"@babel/helper-plugin-utils" "^7.22.5"
|
||||
"@babel/parser" "^7.23.6"
|
||||
"@babel/parser" "^7.23.9"
|
||||
"@vue/compiler-sfc" "^3.4.15"
|
||||
|
||||
"@vue/compiler-core@3.2.45":
|
||||
|
@ -3144,30 +3207,10 @@ caniuse-api@^3.0.0:
|
|||
lodash.memoize "^4.1.2"
|
||||
lodash.uniq "^4.5.0"
|
||||
|
||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001370:
|
||||
version "1.0.30001376"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001376.tgz#af2450833e5a06873fbb030a9556ca9461a2736d"
|
||||
integrity sha512-I27WhtOQ3X3v3it9gNs/oTpoE5KpwmqKR5oKPA8M0G7uMXh9Ty81Q904HpKUrM30ei7zfcL5jE7AXefgbOfMig==
|
||||
|
||||
caniuse-lite@^1.0.30001359:
|
||||
version "1.0.30001366"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001366.tgz#c73352c83830a9eaf2dea0ff71fb4b9a4bbaa89c"
|
||||
integrity sha512-yy7XLWCubDobokgzudpkKux8e0UOOnLHE6mlNJBzT3lZJz6s5atSEzjoL+fsCPkI0G8MP5uVdDx1ur/fXEWkZA==
|
||||
|
||||
caniuse-lite@^1.0.30001400:
|
||||
version "1.0.30001418"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6"
|
||||
integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==
|
||||
|
||||
caniuse-lite@^1.0.30001587:
|
||||
version "1.0.30001591"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz#16745e50263edc9f395895a7cd468b9f3767cf33"
|
||||
integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==
|
||||
|
||||
caniuse-lite@^1.0.30001599:
|
||||
version "1.0.30001599"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce"
|
||||
integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==
|
||||
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001359, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599:
|
||||
version "1.0.30001662"
|
||||
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz"
|
||||
integrity sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==
|
||||
|
||||
chai-nightwatch@0.5.3:
|
||||
version "0.5.3"
|
||||
|
@ -3424,11 +3467,6 @@ compare-versions@^5.0.1:
|
|||
resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7"
|
||||
integrity sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==
|
||||
|
||||
component-emitter@~1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
|
||||
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
|
@ -3778,6 +3816,13 @@ debug@^4.1.0, debug@^4.1.1:
|
|||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@~4.3.4:
|
||||
version "4.3.6"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
|
||||
integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
decamelize-keys@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
|
||||
|
@ -4074,17 +4119,15 @@ end-of-stream@^1.1.0:
|
|||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
engine.io-parser@~5.0.3:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.3.tgz#ca1f0d7b11e290b4bfda251803baea765ed89c09"
|
||||
integrity sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==
|
||||
dependencies:
|
||||
"@socket.io/base64-arraybuffer" "~1.0.2"
|
||||
engine.io-parser@~5.2.1:
|
||||
version "5.2.3"
|
||||
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f"
|
||||
integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==
|
||||
|
||||
engine.io@~6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0"
|
||||
integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==
|
||||
engine.io@~6.5.2:
|
||||
version "6.5.5"
|
||||
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.5.tgz#430b80d8840caab91a50e9e23cb551455195fc93"
|
||||
integrity sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==
|
||||
dependencies:
|
||||
"@types/cookie" "^0.4.1"
|
||||
"@types/cors" "^2.8.12"
|
||||
|
@ -4094,8 +4137,8 @@ engine.io@~6.2.0:
|
|||
cookie "~0.4.1"
|
||||
cors "~2.8.5"
|
||||
debug "~4.3.1"
|
||||
engine.io-parser "~5.0.3"
|
||||
ws "~8.2.3"
|
||||
engine.io-parser "~5.2.1"
|
||||
ws "~8.17.1"
|
||||
|
||||
enhanced-resolve@^5.10.0:
|
||||
version "5.10.0"
|
||||
|
@ -5966,13 +6009,13 @@ karma-coverage@2.2.0:
|
|||
istanbul-reports "^3.0.5"
|
||||
minimatch "^3.0.4"
|
||||
|
||||
karma-firefox-launcher@2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz#9a38cc783c579a50f3ed2a82b7386186385cfc2d"
|
||||
integrity sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==
|
||||
karma-firefox-launcher@2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/karma-firefox-launcher/-/karma-firefox-launcher-2.1.3.tgz#b278a4cbffa92ab81394b1a398813847b0624a85"
|
||||
integrity sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==
|
||||
dependencies:
|
||||
is-wsl "^2.2.0"
|
||||
which "^2.0.1"
|
||||
which "^3.0.0"
|
||||
|
||||
karma-mocha-reporter@2.2.5:
|
||||
version "2.2.5"
|
||||
|
@ -6018,10 +6061,10 @@ karma-webpack@5.0.0:
|
|||
minimatch "^3.0.4"
|
||||
webpack-merge "^4.1.5"
|
||||
|
||||
karma@6.4.2:
|
||||
version "6.4.2"
|
||||
resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e"
|
||||
integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==
|
||||
karma@6.4.4:
|
||||
version "6.4.4"
|
||||
resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.4.tgz#dfa5a426cf5a8b53b43cd54ef0d0d09742351492"
|
||||
integrity sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==
|
||||
dependencies:
|
||||
"@colors/colors" "1.5.0"
|
||||
body-parser "^1.19.0"
|
||||
|
@ -6042,7 +6085,7 @@ karma@6.4.2:
|
|||
qjobs "^1.2.0"
|
||||
range-parser "^1.2.1"
|
||||
rimraf "^3.0.2"
|
||||
socket.io "^4.4.1"
|
||||
socket.io "^4.7.2"
|
||||
source-map "^0.6.1"
|
||||
tmp "^0.2.1"
|
||||
ua-parser-js "^0.7.30"
|
||||
|
@ -8381,31 +8424,34 @@ slice-ansi@^4.0.0:
|
|||
astral-regex "^2.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
|
||||
socket.io-adapter@~2.4.0:
|
||||
version "2.4.0"
|
||||
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6"
|
||||
integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==
|
||||
|
||||
socket.io-parser@~4.0.4:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0"
|
||||
integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==
|
||||
socket.io-adapter@~2.5.2:
|
||||
version "2.5.5"
|
||||
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082"
|
||||
integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==
|
||||
dependencies:
|
||||
"@types/component-emitter" "^1.2.10"
|
||||
component-emitter "~1.3.0"
|
||||
debug "~4.3.4"
|
||||
ws "~8.17.1"
|
||||
|
||||
socket.io-parser@~4.2.4:
|
||||
version "4.2.4"
|
||||
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
|
||||
integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
|
||||
dependencies:
|
||||
"@socket.io/component-emitter" "~3.1.0"
|
||||
debug "~4.3.1"
|
||||
|
||||
socket.io@^4.4.1:
|
||||
version "4.5.1"
|
||||
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029"
|
||||
integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==
|
||||
socket.io@^4.7.2:
|
||||
version "4.7.5"
|
||||
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8"
|
||||
integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==
|
||||
dependencies:
|
||||
accepts "~1.3.4"
|
||||
base64id "~2.0.0"
|
||||
cors "~2.8.5"
|
||||
debug "~4.3.2"
|
||||
engine.io "~6.2.0"
|
||||
socket.io-adapter "~2.4.0"
|
||||
socket.io-parser "~4.0.4"
|
||||
engine.io "~6.5.2"
|
||||
socket.io-adapter "~2.5.2"
|
||||
socket.io-parser "~4.2.4"
|
||||
|
||||
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
|
||||
version "1.0.2"
|
||||
|
@ -9417,6 +9463,13 @@ which@^1.3.1:
|
|||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
which@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1"
|
||||
integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
widest-line@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
|
||||
|
@ -9479,10 +9532,10 @@ ws@^8.2.3:
|
|||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
|
||||
integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
|
||||
|
||||
ws@~8.2.3:
|
||||
version "8.2.3"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
|
||||
integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
|
||||
ws@~8.17.1:
|
||||
version "8.17.1"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
|
||||
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
|
||||
|
||||
xml-name-validator@^4.0.0:
|
||||
version "4.0.0"
|
||||
|
|
Loading…
Reference in a new issue