mirror of
https://github.com/StarCitizenTools/mediawiki-extensions-TabberNeue.git
synced 2024-11-23 16:06:45 +00:00
feat: drop Codex tabs
It has never worked correctly and it is difficult to maintain both MW compatability across versions and Codex
This commit is contained in:
parent
11eb2ac328
commit
2f827857dc
|
@ -99,7 +99,6 @@ Name | Description | Values | Default
|
|||
`$wgTabberNeueEnableAnimation` | Enable or disable smooth scroll animation |`true` - enable; `false` - disable | `true`
|
||||
`$wgTabberNeueParseTabName` | Parse tab name as wikitext. This can have a performance impact and cause unexpected behaviors. |`true` - enable; `false` - disable | `false`
|
||||
`$wgTabberNeueUpdateLocationOnTabChange` | If enabled, when a tab is selected, the URL displayed on the browser changes. Opening this URL makes that tab initially selected |`true` - enable; `false` - disable | `true`
|
||||
`$wgTabberNeueUseCodex` | Use Codex to render Tabber. It is experimental and many features might not work as expected |`true` - enable; `false` - disable | `false`
|
||||
`$wgTabberNeueUseLegacyTabIds` | If enabled, tabpanel IDs will not be prepended with "tabber-tabpanel-". This provides better compatibility with the old Tabber extension, but will cause issues if there are headings with the same name as an existing tab |`true` - enable; `false` - disable | `false`
|
||||
|
||||
#### Tracking category
|
||||
|
|
|
@ -67,24 +67,6 @@
|
|||
"mobile"
|
||||
]
|
||||
},
|
||||
"ext.tabberNeue.codex": {
|
||||
"packageFiles": [
|
||||
"ext.tabberNeue.codex/ext.tabberNeue.codex.js",
|
||||
"ext.tabberNeue.codex/App.vue",
|
||||
"ext.tabberNeue.codex/TabContent.vue"
|
||||
],
|
||||
"styles": [
|
||||
"ext.tabberNeue.codex/ext.tabberNeue.codex.less"
|
||||
],
|
||||
"dependencies": [
|
||||
"@wikimedia/codex",
|
||||
"mediawiki.util"
|
||||
],
|
||||
"targets": [
|
||||
"desktop",
|
||||
"mobile"
|
||||
]
|
||||
},
|
||||
"ext.tabberNeue.visualEditor": {
|
||||
"scripts": [
|
||||
"ve-tabberNeue/ve.ce.MWTabberNode.js",
|
||||
|
@ -146,11 +128,6 @@
|
|||
"description": "Parse tab name as wikitext. This can have a performance impact and cause unexpected behaviors.",
|
||||
"public": true
|
||||
},
|
||||
"TabberNeueUseCodex": {
|
||||
"value": false,
|
||||
"description": "Use Codex to render Tabber. It is experimental and many features might not work as expected.",
|
||||
"public": true
|
||||
},
|
||||
"TabberNeueEnableAnimation": {
|
||||
"value": true,
|
||||
"description": "Enable or disable smooth scroll animation",
|
||||
|
|
|
@ -31,9 +31,6 @@ class Tabber {
|
|||
/** @var bool */
|
||||
private static $parseTabName = false;
|
||||
|
||||
/** @var bool */
|
||||
private static $useCodex = false;
|
||||
|
||||
/** @var bool */
|
||||
private static $useLegacyId = false;
|
||||
|
||||
|
@ -56,7 +53,6 @@ class Tabber {
|
|||
$parserOutput = $parser->getOutput();
|
||||
|
||||
self::$parseTabName = $config->get( 'TabberNeueParseTabName' );
|
||||
self::$useCodex = $config->get( 'TabberNeueUseCodex' );
|
||||
self::$useLegacyId = $config->get( 'TabberNeueUseLegacyTabIds' );
|
||||
|
||||
$count = count( $parserOutput->getExtensionData( 'tabber-count' ) ?? [] );
|
||||
|
@ -65,12 +61,8 @@ class Tabber {
|
|||
|
||||
$parserOutput->appendExtensionData( 'tabber-count', ++$count );
|
||||
|
||||
if ( self::$useCodex === true ) {
|
||||
$parser->getOutput()->addModules( [ 'ext.tabberNeue.codex' ] );
|
||||
} else {
|
||||
$parser->getOutput()->addModuleStyles( [ 'ext.tabberNeue.init.styles' ] );
|
||||
$parser->getOutput()->addModules( [ 'ext.tabberNeue' ] );
|
||||
}
|
||||
$parserOutput->addModuleStyles( [ 'ext.tabberNeue.init.styles' ] );
|
||||
$parserOutput->addModules( [ 'ext.tabberNeue' ] );
|
||||
|
||||
$parser->addTrackingCategory( 'tabberneue-tabber-category' );
|
||||
return $html;
|
||||
|
@ -93,10 +85,6 @@ class Tabber {
|
|||
'array-tabs' => []
|
||||
];
|
||||
|
||||
// For Codex use only
|
||||
// TODO: Maybe we should redo the whole Codex implementation
|
||||
$tabpanels = '';
|
||||
|
||||
foreach ( $arr as $tab ) {
|
||||
$tabData = self::getTabData( $tab, $count, $parser, $frame );
|
||||
if ( $tabData === [] ) {
|
||||
|
@ -109,19 +97,6 @@ class Tabber {
|
|||
'tabId' => "tabber-tab-{$tabData['id']}",
|
||||
'tabpanelId' => self::$useLegacyId ? $tabData['id'] : "tabber-tabpanel-{$tabData['id']}"
|
||||
];
|
||||
|
||||
if ( self::$useCodex && self::$isNested ) {
|
||||
$tabpanels .= self::getCodexNestedTabJSON( $tabData );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( self::$useCodex && self::$isNested ) {
|
||||
$tabpanels = rtrim( implode( '},', explode( '}', $tabpanels ) ), ',' );
|
||||
$tabpanels = strip_tags( html_entity_decode( $tab ) );
|
||||
$tabpanels = str_replace( ',,', ',', $tabpanels );
|
||||
$tabpanels = str_replace( ',]', ']', $tabpanels );
|
||||
return sprintf( '[%s]', $tabpanels );
|
||||
}
|
||||
|
||||
$templateParser = new TemplateParser( __DIR__ . '/templates' );
|
||||
|
@ -142,7 +117,7 @@ class Tabber {
|
|||
return '';
|
||||
}
|
||||
|
||||
if ( !self::$parseTabName || self::$useCodex ) {
|
||||
if ( !self::$parseTabName ) {
|
||||
// Only plain text is needed
|
||||
// Use language converter to get variant title and also escape html
|
||||
$label = $parser->getTargetLanguageConverter()->convertHtml( $label );
|
||||
|
@ -169,26 +144,14 @@ class Tabber {
|
|||
return '';
|
||||
}
|
||||
|
||||
if ( !self::$useCodex ) {
|
||||
// Insert a new line for these characters in wikitext (#151)
|
||||
// Seems like there is no way to get rid of the mw-empty-elt paragraphs sadly
|
||||
$wikitextCharacters = [ '*', '#', ';', ':', '[' ];
|
||||
$needsNewLine = in_array( substr( $content, 0, 1 ), $wikitextCharacters );
|
||||
if ( $needsNewLine ) {
|
||||
$content = "\n$content\n";
|
||||
}
|
||||
return $parser->recursiveTagParse( $content, $frame );
|
||||
// Insert a new line for these characters in wikitext (#151)
|
||||
// Seems like there is no way to get rid of the mw-empty-elt paragraphs sadly
|
||||
$wikitextCharacters = [ '*', '#', ';', ':', '[' ];
|
||||
$needsNewLine = in_array( substr( $content, 0, 1 ), $wikitextCharacters );
|
||||
if ( $needsNewLine ) {
|
||||
$content = "\n$content\n";
|
||||
}
|
||||
|
||||
// The outermost tabber that must be parsed fully in codex for correct json
|
||||
if ( strpos( $content, '{{#tag:tabber' ) === false ) {
|
||||
return $parser->recursiveTagParseFully( $content, $frame );
|
||||
}
|
||||
|
||||
self::$isNested = true;
|
||||
$content = $parser->recursiveTagParse( $content, $frame );
|
||||
self::$isNested = false;
|
||||
return $content;
|
||||
return $parser->recursiveTagParse( $content, $frame );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -240,22 +203,4 @@ class Tabber {
|
|||
$data['id'] = $id;
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get JSON representation of a nested tab for Codex
|
||||
*
|
||||
* @param array $tabData Tab data
|
||||
*
|
||||
* @return string HTML
|
||||
* @throws JsonException
|
||||
*/
|
||||
private static function getCodexNestedTabJSON( array $tabData ): string {
|
||||
// A nested tabber which should return json in codex
|
||||
return json_encode( [
|
||||
'label' => $tabData['label'],
|
||||
'content' => $tabData['content']
|
||||
],
|
||||
JSON_THROW_ON_ERROR
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,7 +35,6 @@ class TabberParsoid extends ExtensionTagHandler implements ExtensionModule {
|
|||
/** @inheritDoc */
|
||||
public function sourceToDom( ParsoidExtensionAPI $extApi, string $src, array $extArgs ) {
|
||||
$html = self::render( $extApi, $src );
|
||||
$extApi->getMetadata()->addModules( [ 'ext.tabberNeue.codex' ] );
|
||||
return $extApi->htmlToDom( $html );
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"plugins": [
|
||||
"no-jquery"
|
||||
],
|
||||
"extends": [
|
||||
"plugin:no-jquery/all",
|
||||
"wikimedia/vue3-es6"
|
||||
]
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
<template>
|
||||
<CdxTabs v-model:active="currentTab" :framed="framed">
|
||||
<CdxTab
|
||||
v-for="( tab, index ) in tabsData"
|
||||
:key="index"
|
||||
:name="tab.name"
|
||||
:label="tab.label"
|
||||
:disabled="tab.disabled"
|
||||
>
|
||||
<TabContent
|
||||
:html="tab.content"
|
||||
></TabContent>
|
||||
</CdxTab>
|
||||
</CdxTabs>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const { defineComponent } = require( 'vue' );
|
||||
// Codex is available from ResourceLoader at runtime and is available without needing a build step.
|
||||
const { CdxTabs, CdxTab } = require( '@wikimedia/codex' );
|
||||
const TabContent = require( './TabContent.vue' );
|
||||
|
||||
// @vue/component
|
||||
module.exports = exports = defineComponent( {
|
||||
name: 'App',
|
||||
compatConfig: {
|
||||
MODE: 3
|
||||
},
|
||||
compilerOptions: {
|
||||
whitespace: 'condense'
|
||||
},
|
||||
components: {
|
||||
CdxTabs: CdxTabs,
|
||||
CdxTab: CdxTab,
|
||||
TabContent: TabContent
|
||||
},
|
||||
props: {
|
||||
tabberData: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
framed: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
tabsData: this.tabberData.tabsData,
|
||||
currentTab: this.tabberData.currentTab
|
||||
};
|
||||
},
|
||||
mounted: function () {
|
||||
this.$el.parentElement.classList.add( 'tabber--live' );
|
||||
}
|
||||
} );
|
||||
</script>
|
|
@ -1,76 +0,0 @@
|
|||
<template>
|
||||
<CdxTabs v-if="isChildTabber && tabsData.length > 0" v-model:active="currentTab">
|
||||
<CdxTab
|
||||
v-for="( tab, index ) in tabsData"
|
||||
:key="index"
|
||||
:name="escapeId( tab.label )"
|
||||
:label="tab.label"
|
||||
>
|
||||
<tab-content
|
||||
:html="tab.content"
|
||||
></tab-content>
|
||||
</CdxTab>
|
||||
</CdxTabs>
|
||||
<div
|
||||
v-else
|
||||
v-html="html"
|
||||
></div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const { defineComponent } = require( 'vue' );
|
||||
const { CdxTabs, CdxTab } = require( '@wikimedia/codex' );
|
||||
|
||||
// @vue/component
|
||||
module.exports = exports = defineComponent( {
|
||||
name: 'TabContent',
|
||||
compatConfig: {
|
||||
MODE: 3
|
||||
},
|
||||
compilerOptions: {
|
||||
whitespace: 'condense'
|
||||
},
|
||||
components: {
|
||||
CdxTabs: CdxTabs,
|
||||
CdxTab: CdxTab
|
||||
},
|
||||
props: {
|
||||
html: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabsData: [],
|
||||
|
||||
currentTab: ''
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
isChildTabber() {
|
||||
// eslint-disable-next-line es-x/no-array-prototype-includes
|
||||
return Array.isArray( this.html ) || this.html.includes( '{"label":' );
|
||||
},
|
||||
parse() {
|
||||
if ( Array.isArray( this.html ) ) {
|
||||
return this.html;
|
||||
} else {
|
||||
const tmp = document.createElement( 'div' );
|
||||
tmp.innerHTML = this.html;
|
||||
|
||||
return JSON.parse( tmp.textContent.trim() );
|
||||
}
|
||||
},
|
||||
escapeId( id ) {
|
||||
return mw.util.escapeIdForAttribute( id );
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
if ( this.isChildTabber() ) {
|
||||
this.tabsData = this.parse( this.html );
|
||||
this.currentTab = this.escapeId( this.tabsData[ 0 ].label );
|
||||
}
|
||||
}
|
||||
} );
|
||||
</script>
|
|
@ -1,58 +0,0 @@
|
|||
const
|
||||
Vue = require( 'vue' ),
|
||||
App = require( './App.vue' );
|
||||
|
||||
/**
|
||||
* @param {Element} tabber
|
||||
* @return {void}
|
||||
*/
|
||||
function initApp( tabber ) {
|
||||
const tabs = tabber.querySelectorAll( ':scope > .tabber__section > .tabber__panel' );
|
||||
|
||||
const tabberData = {
|
||||
tabsData: [],
|
||||
currentTab: ''
|
||||
};
|
||||
|
||||
tabs.forEach( ( tab ) => {
|
||||
const label = tab.getAttribute( 'data-mw-tabber-title' );
|
||||
|
||||
tabberData.tabsData.push( {
|
||||
name: mw.util.escapeIdForAttribute( label ),
|
||||
label: label,
|
||||
content: tab.innerHTML
|
||||
} );
|
||||
} );
|
||||
|
||||
tabberData.currentTab = tabberData.tabsData[ 0 ].name;
|
||||
|
||||
// @ts-ignore MediaWiki-specific function
|
||||
Vue.createMwApp(
|
||||
App, Object.assign( {
|
||||
tabberData: tabberData
|
||||
} )
|
||||
)
|
||||
.mount( tabber );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {void}
|
||||
*/
|
||||
function main() {
|
||||
const tabbers = document.querySelectorAll( '.tabber:not( .tabber--live )' );
|
||||
tabbers.forEach( initApp );
|
||||
}
|
||||
|
||||
mw.hook( 'wikipage.content' ).add( () => {
|
||||
main();
|
||||
} );
|
||||
|
||||
/*
|
||||
* Add hooks for Tabber when Visual Editor is used.
|
||||
*/
|
||||
mw.loader.using( 'ext.visualEditor.desktopArticleTarget.init', () => {
|
||||
// After saving edits
|
||||
mw.hook( 'postEdit.afterRemoval' ).add( () => {
|
||||
main();
|
||||
} );
|
||||
} );
|
|
@ -1,14 +0,0 @@
|
|||
/*
|
||||
* Override default MW styles
|
||||
* * .mw-content-ltr ul
|
||||
* * li
|
||||
*/
|
||||
/* stylelint-disable selector-class-pattern */
|
||||
.tabber .cdx-tabs__list,
|
||||
.tabber .cdx-tabs__list__item {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tabber .cdx-tabs__list__item {
|
||||
margin: 0;
|
||||
}
|
281
package-lock.json
generated
281
package-lock.json
generated
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"name": "mediawiki-extensions-TabberNeue",
|
||||
"name": "TabberNeue",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "TabberNeue",
|
||||
"devDependencies": {
|
||||
"@wikimedia/codex": "^1.16.0",
|
||||
"@wikimedia/types-wikimedia": "0.4.4",
|
||||
"eslint-config-wikimedia": "0.28.2",
|
||||
"eslint-plugin-no-jquery": "3.0.2",
|
||||
|
@ -124,19 +124,6 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.24.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz",
|
||||
"integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@csstools/css-parser-algorithms": {
|
||||
"version": "2.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz",
|
||||
|
@ -296,68 +283,6 @@
|
|||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/core": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
|
||||
"integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@floating-ui/utils": "^0.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/dom": {
|
||||
"version": "1.6.5",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz",
|
||||
"integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@floating-ui/core": "^1.0.0",
|
||||
"@floating-ui/utils": "^0.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/utils": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz",
|
||||
"integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@floating-ui/vue": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.0.6.tgz",
|
||||
"integrity": "sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@floating-ui/dom": "^1.6.1",
|
||||
"@floating-ui/utils": "^0.2.1",
|
||||
"vue-demi": ">=0.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/vue/node_modules/vue-demi": {
|
||||
"version": "0.14.7",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
|
||||
"integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^3.0.0-0 || ^2.6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
"version": "0.11.14",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
||||
|
@ -391,13 +316,6 @@
|
|||
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.4.15",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
|
||||
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@mdn/browser-compat-data": {
|
||||
"version": "5.5.29",
|
||||
"resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.29.tgz",
|
||||
|
@ -637,131 +555,6 @@
|
|||
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz",
|
||||
"integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.4",
|
||||
"@vue/shared": "3.4.27",
|
||||
"entities": "^4.5.0",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-dom": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz",
|
||||
"integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-core": "3.4.27",
|
||||
"@vue/shared": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-sfc": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz",
|
||||
"integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.4",
|
||||
"@vue/compiler-core": "3.4.27",
|
||||
"@vue/compiler-dom": "3.4.27",
|
||||
"@vue/compiler-ssr": "3.4.27",
|
||||
"@vue/shared": "3.4.27",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.30.10",
|
||||
"postcss": "^8.4.38",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-ssr": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz",
|
||||
"integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.27",
|
||||
"@vue/shared": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/reactivity": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz",
|
||||
"integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/shared": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-core": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz",
|
||||
"integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.4.27",
|
||||
"@vue/shared": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-dom": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz",
|
||||
"integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/runtime-core": "3.4.27",
|
||||
"@vue/shared": "3.4.27",
|
||||
"csstype": "^3.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/server-renderer": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz",
|
||||
"integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-ssr": "3.4.27",
|
||||
"@vue/shared": "3.4.27"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/shared": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz",
|
||||
"integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@wikimedia/codex": {
|
||||
"version": "1.16.0",
|
||||
"resolved": "https://registry.npmjs.org/@wikimedia/codex/-/codex-1.16.0.tgz",
|
||||
"integrity": "sha512-dhic5AMcVcuDsNHv/HKKyOJG059BbyucfuWJutEWNhbmAsk/eixE2Jazvp9sOel+4H5sMjP4kppjKzGt66JdbA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@floating-ui/vue": "1.0.6",
|
||||
"@wikimedia/codex-icons": "1.16.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18",
|
||||
"npm": ">=7.21.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "3.4.27"
|
||||
}
|
||||
},
|
||||
"node_modules/@wikimedia/codex-design-tokens": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/@wikimedia/codex-design-tokens/-/codex-design-tokens-1.3.5.tgz",
|
||||
|
@ -772,16 +565,6 @@
|
|||
"npm": ">=7.21.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@wikimedia/codex-icons": {
|
||||
"version": "1.16.0",
|
||||
"resolved": "https://registry.npmjs.org/@wikimedia/codex-icons/-/codex-icons-1.16.0.tgz",
|
||||
"integrity": "sha512-iMEJaETNwkFMG2VE0UNrS9Pv7JTrY184xLAd4FDPpy3icxPrVw/iDJ4tGTr1HrMVhC2JKApdLDRHyHtkMdZxNg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=18",
|
||||
"npm": ">=7.21.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@wikimedia/types-wikimedia": {
|
||||
"version": "0.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@wikimedia/types-wikimedia/-/types-wikimedia-0.4.4.tgz",
|
||||
|
@ -1174,10 +957,11 @@
|
|||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
|
@ -1231,13 +1015,6 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/csstype": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||
|
@ -2066,13 +1843,6 @@
|
|||
"node": ">=4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"dev": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/esutils": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
|
||||
|
@ -2767,16 +2537,6 @@
|
|||
"integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.10",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
|
||||
"integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.4.15"
|
||||
}
|
||||
},
|
||||
"node_modules/mathml-tag-names": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
|
||||
|
@ -2815,10 +2575,11 @@
|
|||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.7",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
|
||||
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
|
@ -4251,28 +4012,6 @@
|
|||
"spdx-license-ids": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vue": {
|
||||
"version": "3.4.27",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz",
|
||||
"integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.27",
|
||||
"@vue/compiler-sfc": "3.4.27",
|
||||
"@vue/runtime-dom": "3.4.27",
|
||||
"@vue/server-renderer": "3.4.27",
|
||||
"@vue/shared": "3.4.27"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vue-eslint-parser": {
|
||||
"version": "9.4.3",
|
||||
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
"lint:i18n": "banana-checker --requireLowerCase=0 i18n/"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@wikimedia/codex": "^1.16.0",
|
||||
"@wikimedia/types-wikimedia": "0.4.4",
|
||||
"eslint-config-wikimedia": "0.28.2",
|
||||
"eslint-plugin-no-jquery": "3.0.2",
|
||||
|
|
Loading…
Reference in a new issue