CodexModule: Add unit test for code splitting
This requires the path to the Codex modules directory to be configurable, so we can use static manifest and component files in tests. This is achieved by changing the constant storing the Codex modules dir from private to protected so it can be overridden when creating a test module. Bug: T350054 Change-Id: Icd3c6c5d2a82f5a5fb1c38b52e54893034e7375c
This commit is contained in:
parent
39f78d1ee7
commit
4baf4dd8be
16 changed files with 876 additions and 4 deletions
|
|
@ -14,6 +14,7 @@
|
|||
/vendor/
|
||||
/tests/coverage/
|
||||
/tests/phpunit/data/registration/duplicate_keys.json
|
||||
/tests/phpunit/data/resourceloader/codexModules/
|
||||
/tests/phpunit/unit/includes/Settings/Source/fixtures/bad.json
|
||||
/maintenance/benchmarks/data/
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ use MediaWiki\MainConfigNames;
|
|||
* @internal
|
||||
*/
|
||||
class CodexModule extends FileModule {
|
||||
private const CODEX_MODULE_DIR = 'resources/lib/codex/modules/';
|
||||
protected const CODEX_MODULE_DIR = 'resources/lib/codex/modules/';
|
||||
|
||||
/** @var array<string,string> */
|
||||
private array $themeMap = [];
|
||||
|
|
@ -52,6 +52,15 @@ class CodexModule extends FileModule {
|
|||
private bool $isScriptOnly = false;
|
||||
private bool $setupComplete = false;
|
||||
|
||||
/**
|
||||
* @param array $options [optional]
|
||||
* - themeStyles: array of skin- or theme-specific files
|
||||
* - codexComponents: array of Codex components to include
|
||||
* - codexStyleOnly: whether to include only style files
|
||||
* - codexScriptOnly: whether to include only script files
|
||||
* @param string|null $localBasePath [optional]
|
||||
* @param string|null $remoteBasePath [optional]
|
||||
*/
|
||||
public function __construct( array $options = [], $localBasePath = null, $remoteBasePath = null ) {
|
||||
$skinCodexThemes = ExtensionRegistry::getInstance()->getAttribute( 'SkinCodexThemes' );
|
||||
$this->themeMap = [ 'default' => 'wikimedia-ui' ] + $skinCodexThemes;
|
||||
|
|
@ -248,7 +257,7 @@ class CodexModule extends FileModule {
|
|||
|
||||
// Manifest data structure representing all Codex components in the library
|
||||
$manifest = json_decode(
|
||||
file_get_contents( MW_INSTALL_PATH . '/' . self::CODEX_MODULE_DIR . $this->getManifestFile( $context ) ),
|
||||
file_get_contents( MW_INSTALL_PATH . '/' . static::CODEX_MODULE_DIR . $this->getManifestFile( $context ) ),
|
||||
true
|
||||
);
|
||||
|
||||
|
|
@ -269,7 +278,8 @@ class CodexModule extends FileModule {
|
|||
// Add the CSS files to the module's package file (unless this is a script-only module)
|
||||
if ( !( $this->isScriptOnly ) ) {
|
||||
foreach ( $styles as $fileName ) {
|
||||
$this->styles[] = new FilePath( self::CODEX_MODULE_DIR . $fileName, MW_INSTALL_PATH, $remoteBasePath );
|
||||
$this->styles[] = new FilePath( static::CODEX_MODULE_DIR .
|
||||
$fileName, MW_INSTALL_PATH, $remoteBasePath );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -292,7 +302,7 @@ class CodexModule extends FileModule {
|
|||
foreach ( $scripts as $fileName ) {
|
||||
$this->packageFiles[] = [
|
||||
'name' => "_codex/$fileName",
|
||||
'file' => new FilePath( self::CODEX_MODULE_DIR . $fileName, MW_INSTALL_PATH, $remoteBasePath )
|
||||
'file' => new FilePath( static::CODEX_MODULE_DIR . $fileName, MW_INSTALL_PATH, $remoteBasePath )
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
"use strict";const e=require("vue"),o=require("./constants.js"),c=require("./useIconOnlyButton.js"),d=require("./_plugin-vue_export-helper.js");require("./useSlotContents.js");require("./useWarnOnce.js");const p=o.makeStringTypeValidator(o.ButtonActions),v=o.makeStringTypeValidator(o.ButtonWeights),y=o.makeStringTypeValidator(o.ButtonSizes),f=e.defineComponent({name:"CdxButton",props:{action:{type:String,default:"default",validator:p},weight:{type:String,default:"normal",validator:v},size:{type:String,default:"medium",validator:y}},emits:["click"],setup(t,{emit:n,slots:r,attrs:a}){const l=c.useIconOnlyButton(r.default,a,"CdxButton"),s=e.ref(!1);return{rootClasses:e.computed(()=>({["cdx-button--action-".concat(t.action)]:!0,["cdx-button--weight-".concat(t.weight)]:!0,["cdx-button--size-".concat(t.size)]:!0,"cdx-button--framed":t.weight!=="quiet","cdx-button--icon-only":l.value,"cdx-button--is-active":s.value})),onClick:u=>{n("click",u)},setActive:u=>{s.value=u}}}});function g(t,n,r,a,l,s){return e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["cdx-button",t.rootClasses]),onClick:n[0]||(n[0]=(...i)=>t.onClick&&t.onClick(...i)),onKeydown:n[1]||(n[1]=e.withKeys(i=>t.setActive(!0),["space","enter"])),onKeyup:n[2]||(n[2]=e.withKeys(i=>t.setActive(!1),["space","enter"]))},[e.renderSlot(t.$slots,"default")],34)}const m=d._export_sfc(f,[["render",g]]);module.exports=m;
|
||||
|
|
@ -0,0 +1 @@
|
|||
.cdx-icon{color:#202122;display:inline-flex;align-items:center;justify-content:center;vertical-align:text-bottom}.cdx-icon svg{fill:currentcolor;width:100%;height:100%}.cdx-icon--x-small{min-width:12px;min-height:12px;width:.75em;height:.75em}.cdx-icon--small{min-width:16px;min-height:16px;width:1em;height:1em}.cdx-icon--medium{min-width:20px;min-height:20px;width:1.25em;height:1.25em}.cdx-icon--flipped svg{transform:scaleX(-1)}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.cdx-message{background-color:#eaecf0;color:#202122;display:flex;align-items:flex-start;position:relative;border:1px solid #54595d;padding:16px}@media screen and (min-width: 640px){.cdx-message{padding-right:24px;padding-left:24px}}.cdx-message .cdx-message__icon{background-position:center;background-repeat:no-repeat;background-size:max(1.25em,20px);min-width:20px;min-height:20px;width:1.25em;height:1.25em;display:inline-block;vertical-align:text-bottom;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="%23202122"><path d="M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zM9 5h2v2H9zm0 4h2v6H9z"/></svg>')}.cdx-message .cdx-message__icon:lang(ar){background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="%23202122"><path d="M8 19a1 1 0 001 1h2a1 1 0 001-1v-1H8zm9-12a7 7 0 10-12 4.9S7 14 7 15v1a1 1 0 001 1h4a1 1 0 001-1v-1c0-1 2-3.1 2-3.1A7 7 0 0017 7z"/></svg>')}.cdx-message--warning{background-color:#fef6e7;border-color:#ac6600}.cdx-message--warning .cdx-message__icon{background-position:center;background-repeat:no-repeat;background-size:max(1.25em,20px);min-width:20px;min-height:20px;width:1.25em;height:1.25em;display:inline-block;vertical-align:text-bottom;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="%23edab00"><path d="M11.53 2.3A1.85 1.85 0 0010 1.21 1.85 1.85 0 008.48 2.3L.36 16.36C-.48 17.81.21 19 1.88 19h16.24c1.67 0 2.36-1.19 1.52-2.64zM11 16H9v-2h2zm0-4H9V6h2z"/></svg>')}.cdx-message--warning .cdx-message__icon--vue{color:#edab00}.cdx-message--error{background-color:#fee7e6;border-color:#b32424}.cdx-message--error .cdx-message__icon{background-position:center;background-repeat:no-repeat;background-size:max(1.25em,20px);min-width:20px;min-height:20px;width:1.25em;height:1.25em;display:inline-block;vertical-align:text-bottom;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="%23d73333"><path d="M13.728 1H6.272L1 6.272v7.456L6.272 19h7.456L19 13.728V6.272zM11 15H9v-2h2zm0-4H9V5h2z"/></svg>')}.cdx-message--error .cdx-message__icon--vue{color:#d73333}.cdx-message--success{background-color:#d5fdf4;border-color:#096450}.cdx-message--success .cdx-message__icon{background-position:center;background-repeat:no-repeat;background-size:max(1.25em,20px);min-width:20px;min-height:20px;width:1.25em;height:1.25em;display:inline-block;vertical-align:text-bottom;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20" viewBox="0 0 20 20" fill="%2314866d"><path d="M10 20a10 10 0 010-20 10 10 0 110 20Zm-2-5 9-8.5L15.5 5 8 12 4.5 8.5 3 10l5 5Z"/></svg>')}.cdx-message--success .cdx-message__icon--vue{color:#14866d}.cdx-message--user-dismissable{padding-right:48px}@media screen and (min-width: 640px){.cdx-message--user-dismissable{padding-right:56px}}.cdx-message--inline{background-color:rgba(255,255,255,0);border:0;padding:0;font-weight:700}.cdx-message--inline.cdx-message--error{color:#d73333}.cdx-message--inline.cdx-message--success{color:#14866d}.cdx-message .cdx-message__icon,.cdx-message .cdx-message__icon--vue{height:1.5em}.cdx-message__content{word-wrap:break-word;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;align-self:center;flex-grow:1;margin-left:8px}.cdx-message__content,.cdx-message__content>*{line-height:1.6}.cdx-message__content>*:first-child{margin-top:0;padding-top:0}.cdx-message__content>*:last-child{margin-bottom:0;padding-bottom:0}.cdx-message__dismiss-button{position:absolute;top:12px;right:16px;padding:5px;line-height:0}@media screen and (min-width: 640px){.cdx-message__dismiss-button{right:8px}}.cdx-message+.cdx-message{margin-top:8px}.cdx-message-enter-active,.cdx-message-leave-active-system{transition-property:opacity;transition-duration:.25s;transition-timing-function:ease}.cdx-message-leave-active-user{transition-property:opacity;transition-duration:.25s;transition-timing-function:ease-out}.cdx-message-enter-from,.cdx-message-leave-to{opacity:0}
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const s=require("vue"),t=require("./Icon.js"),m=require("./CdxButton.js"),f=require("./constants.js"),v=require("./_plugin-vue_export-helper.js");require("./useIconOnlyButton.js");require("./useSlotContents.js");require("./useWarnOnce.js");const p={notice:t.K3,error:t.e3,warning:t.m5,success:t.D7},y=s.defineComponent({name:"CdxMessage",components:{CdxButton:m,CdxIcon:t.CdxIcon},props:{type:{type:String,default:"notice",validator:f.statusTypeValidator},inline:{type:Boolean,default:!1},icon:{type:[String,Object],default:null},fadeIn:{type:Boolean,default:!1},dismissButtonLabel:{type:String,default:""},autoDismiss:{type:[Boolean,Number],default:!1,validator:e=>typeof e=="boolean"||typeof e=="number"&&e>0}},emits:["user-dismissed","auto-dismissed"],setup(e,{emit:o}){const n=s.ref(!1),l=s.computed(()=>e.inline===!1&&e.dismissButtonLabel.length>0),c=s.computed(()=>e.autoDismiss===!1||e.type==="error"?!1:e.autoDismiss===!0?4e3:e.autoDismiss),u=s.computed(()=>({"cdx-message--inline":e.inline,"cdx-message--block":!e.inline,"cdx-message--user-dismissable":l.value,["cdx-message--".concat(e.type)]:!0})),i=s.computed(()=>e.icon&&e.type==="notice"?e.icon:p[e.type]),a=s.ref("");function r(d){n.value||(a.value=d==="user-dismissed"?"cdx-message-leave-active-user":"cdx-message-leave-active-system",n.value=!0,o(d))}return s.onMounted(()=>{e.type==="error"&&e.autoDismiss!==!1?s.warn('CdxMessage: Message with type="error" cannot use auto-dismiss'):c.value&&setTimeout(()=>r("auto-dismissed"),c.value)}),{dismissed:n,userDismissable:l,rootClasses:u,leaveActiveClass:a,computedIcon:i,onDismiss:r,cdxIconClose:t.Q5}}});const g=["aria-live","role"],C={class:"cdx-message__content"};function b(e,o,n,l,c,u){const i=s.resolveComponent("cdx-icon"),a=s.resolveComponent("cdx-button");return s.openBlock(),s.createBlock(s.Transition,{name:"cdx-message",appear:e.fadeIn,"leave-active-class":e.leaveActiveClass},{default:s.withCtx(()=>[e.dismissed?s.createCommentVNode("",!0):(s.openBlock(),s.createElementBlock("div",{key:0,class:s.normalizeClass(["cdx-message",e.rootClasses]),"aria-live":e.type!=="error"?"polite":void 0,role:e.type==="error"?"alert":void 0},[s.createVNode(i,{class:"cdx-message__icon--vue",icon:e.computedIcon},null,8,["icon"]),s.createElementVNode("div",C,[s.renderSlot(e.$slots,"default")]),e.userDismissable?(s.openBlock(),s.createBlock(a,{key:0,class:"cdx-message__dismiss-button",weight:"quiet",type:"button","aria-label":e.dismissButtonLabel,onClick:o[0]||(o[0]=r=>e.onDismiss("user-dismissed"))},{default:s.withCtx(()=>[s.createVNode(i,{icon:e.cdxIconClose,"icon-label":e.dismissButtonLabel},null,8,["icon","icon-label"])]),_:1},8,["aria-label"])):s.createCommentVNode("",!0)],10,g))]),_:3},8,["appear","leave-active-class"])}const _=v._export_sfc(y,[["render",b]]);module.exports=_;
|
||||
1
tests/phpunit/data/resourceloader/codexModules/Icon.js
Normal file
1
tests/phpunit/data/resourceloader/codexModules/Icon.js
Normal file
|
|
@ -0,0 +1 @@
|
|||
"use strict";const t=require("vue"),d=require("./constants.js"),h=require("./_plugin-vue_export-helper.js"),m='<path d="M11.53 2.3A1.85 1.85 0 0010 1.21 1.85 1.85 0 008.48 2.3L.36 16.36C-.48 17.81.21 19 1.88 19h16.24c1.67 0 2.36-1.19 1.52-2.64zM11 16H9v-2h2zm0-4H9V6h2z"/>',v='<path d="M12.43 14.34A5 5 0 0110 15a5 5 0 113.95-2L17 16.09V3a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h10a2 2 0 001.45-.63z"/><circle cx="10" cy="10" r="3"/>',g='<path d="M10 0a10 10 0 1010 10A10 10 0 0010 0zm5.66 14.24-1.41 1.41L10 11.41l-4.24 4.25-1.42-1.42L8.59 10 4.34 5.76l1.42-1.42L10 8.59l4.24-4.24 1.41 1.41L11.41 10z"/>',f='<path d="m4.34 2.93 12.73 12.73-1.41 1.41L2.93 4.35z"/><path d="M17.07 4.34 4.34 17.07l-1.41-1.41L15.66 2.93z"/>',z='<path d="M13.728 1H6.272L1 6.272v7.456L6.272 19h7.456L19 13.728V6.272zM11 15H9v-2h2zm0-4H9V5h2z"/>',M='<path d="m17.5 4.75-7.5 7.5-7.5-7.5L1 6.25l9 9 9-9z"/>',L='<path d="M19 3H1v14h18zM3 14l3.5-4.5 2.5 3L12.5 8l4.5 6z"/><path d="M19 5H1V3h18zm0 12H1v-2h18z"/>',y='<path d="M8 19a1 1 0 001 1h2a1 1 0 001-1v-1H8zm9-12a7 7 0 10-12 4.9S7 14 7 15v1a1 1 0 001 1h4a1 1 0 001-1v-1c0-1 2-3.1 2-3.1A7 7 0 0017 7z"/>',C='<path d="M10 0C4.477 0 0 4.477 0 10s4.477 10 10 10 10-4.477 10-10S15.523 0 10 0zM9 5h2v2H9zm0 4h2v6H9z"/>',k='<path d="M7 1 5.6 2.5 13 10l-7.4 7.5L7 19l9-9z"/>',_='<path d="m4 10 9 9 1.4-1.5L7 10l7.4-7.5L13 1z"/>',H='<path d="M12.2 13.6a7 7 0 111.4-1.4l5.4 5.4-1.4 1.4zM3 8a5 5 0 1010 0A5 5 0 003 8z"/>',S='<path d="M10 20a10 10 0 010-20 10 10 0 110 20Zm-2-5 9-8.5L15.5 5 8 12 4.5 8.5 3 10l5 5Z"/>',w=m,x=v,B=g,E=f,V=z,D=M,F=L,A={langCodeMap:{ar:y},default:C},I={ltr:k,shouldFlip:!0},$={ltr:_,shouldFlip:!0},b=H,K=S;function q(e,o,n){if(typeof e=="string"||"path"in e)return e;if("shouldFlip"in e)return e.ltr;if("rtl"in e)return n==="rtl"?e.rtl:e.ltr;const l=o in e.langCodeMap?e.langCodeMap[o]:e.default;return typeof l=="string"||"path"in l?l:l.ltr}function T(e,o){if(typeof e=="string")return!1;if("langCodeMap"in e){const n=o in e.langCodeMap?e.langCodeMap[o]:e.default;if(typeof n=="string")return!1;e=n}if("shouldFlipExceptions"in e&&Array.isArray(e.shouldFlipExceptions)){const n=e.shouldFlipExceptions.indexOf(o);return n===void 0||n===-1}return"shouldFlip"in e?e.shouldFlip:!1}function u(e){const o=t.ref(null);return t.onMounted(()=>{const n=window.getComputedStyle(e.value).direction;o.value=n==="ltr"||n==="rtl"?n:null}),o}function Z(e){const o=t.ref("");return t.onMounted(()=>{let n=e.value;for(;n&&n.lang==="";)n=n.parentElement;o.value=n?n.lang:null}),o}const J=d.makeStringTypeValidator(d.IconSizes),O=t.defineComponent({name:"CdxIcon",props:{icon:{type:[String,Object],required:!0},iconLabel:{type:String,default:""},lang:{type:String,default:null},dir:{type:String,default:null},size:{type:String,default:"medium",validator:J}},setup(e){const o=t.ref(),n=u(o),l=Z(o),r=t.computed(()=>e.dir||n.value),i=t.computed(()=>e.lang||l.value),s=t.computed(()=>({"cdx-icon--flipped":r.value==="rtl"&&i.value!==null&&T(e.icon,i.value),["cdx-icon--".concat(e.size)]:!0})),a=t.computed(()=>q(e.icon,i.value||"",r.value||"ltr")),c=t.computed(()=>typeof a.value=="string"?a.value:""),p=t.computed(()=>typeof a.value!="string"?a.value.path:"");return{rootElement:o,rootClasses:s,iconSvg:c,iconPath:p}}});const P=["aria-hidden"],Q={key:0},j=["innerHTML"],N=["d"];function R(e,o,n,l,r,i){return t.openBlock(),t.createElementBlock("span",{ref:"rootElement",class:t.normalizeClass(["cdx-icon",e.rootClasses])},[(t.openBlock(),t.createElementBlock("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",width:"20",height:"20",viewBox:"0 0 20 20","aria-hidden":e.iconLabel?void 0:!0},[e.iconLabel?(t.openBlock(),t.createElementBlock("title",Q,t.toDisplayString(e.iconLabel),1)):t.createCommentVNode("",!0),e.iconSvg?(t.openBlock(),t.createElementBlock("g",{key:1,innerHTML:e.iconSvg},null,8,j)):(t.openBlock(),t.createElementBlock("path",{key:2,d:e.iconPath},null,8,N))],8,P))],2)}const U=h._export_sfc(O,[["render",R]]);exports.CdxIcon=U;exports.D3=F;exports.D7=K;exports.J6=I;exports.K3=A;exports.K5=B;exports.Q5=E;exports.V7=b;exports.e3=V;exports.k5=x;exports.m5=w;exports.s7=$;exports.useComputedDirection=u;exports.z3=D;
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const e=(t,o)=>{const c=t.__vccOpts||t;for(const[r,s]of o)c[r]=s;return c};exports._export_sfc=e;
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";function t(n){return e=>typeof e=="string"&&n.indexOf(e)!==-1}const s="cdx",o=["default","progressive","destructive"],i=["normal","primary","quiet"],a=["medium","large"],l=["x-small","small","medium"],r=["notice","warning","error","success"],d=t(r),c=["text","search","number","email","month","password","tel","url","week","date","datetime-local","time"],u=["default","error"],y=120,m=500,p="cdx-menu-footer-item",b=Symbol("CdxTabs"),S=Symbol("CdxActiveTab"),I=Symbol("CdxFieldInputId"),T=Symbol("CdxFieldDescriptionId"),x=Symbol("CdxFieldStatus"),K=Symbol("CdxDisabled"),F="".concat(s,"-no-invert");exports.ActiveTabKey=S;exports.ButtonActions=o;exports.ButtonSizes=a;exports.ButtonWeights=i;exports.DebounceInterval=y;exports.DisabledKey=K;exports.FieldDescriptionIdKey=T;exports.FieldInputIdKey=I;exports.FieldStatusKey=x;exports.IconSizes=l;exports.LibraryPrefix=s;exports.MenuFooterValue=p;exports.NoInvertClass=F;exports.PendingDelay=m;exports.TabsKey=b;exports.TextInputTypes=c;exports.ValidationStatusTypes=u;exports.makeStringTypeValidator=t;exports.statusTypeValidator=d;
|
||||
748
tests/phpunit/data/resourceloader/codexModules/manifest.json
Normal file
748
tests/phpunit/data/resourceloader/codexModules/manifest.json
Normal file
|
|
@ -0,0 +1,748 @@
|
|||
{
|
||||
"Icon.css": {
|
||||
"file": "CdxIcon.css",
|
||||
"src": "Icon.css"
|
||||
},
|
||||
"_Icon.js": {
|
||||
"css": [
|
||||
"CdxIcon.css"
|
||||
],
|
||||
"file": "Icon.js",
|
||||
"imports": [
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
]
|
||||
},
|
||||
"__plugin-vue_export-helper.js": {
|
||||
"file": "_plugin-vue_export-helper.js"
|
||||
},
|
||||
"_buttonHelpers.js": {
|
||||
"file": "buttonHelpers.js"
|
||||
},
|
||||
"_constants.js": {
|
||||
"file": "constants.js"
|
||||
},
|
||||
"_useFieldData.js": {
|
||||
"file": "useFieldData.js",
|
||||
"imports": [
|
||||
"_constants.js"
|
||||
]
|
||||
},
|
||||
"_useFloatingMenu.js": {
|
||||
"file": "useFloatingMenu.js"
|
||||
},
|
||||
"_useGeneratedId.js": {
|
||||
"file": "useGeneratedId.js",
|
||||
"imports": [
|
||||
"_constants.js"
|
||||
]
|
||||
},
|
||||
"_useIconOnlyButton.js": {
|
||||
"file": "useIconOnlyButton.js",
|
||||
"imports": [
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
]
|
||||
},
|
||||
"_useIntersectionObserver.js": {
|
||||
"file": "useIntersectionObserver.js"
|
||||
},
|
||||
"_useLabelChecker.js": {
|
||||
"file": "useLabelChecker.js",
|
||||
"imports": [
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
]
|
||||
},
|
||||
"_useModelWrapper.js": {
|
||||
"file": "useModelWrapper.js"
|
||||
},
|
||||
"_useSlotContents.js": {
|
||||
"file": "useSlotContents.js"
|
||||
},
|
||||
"_useSplitAttributes.js": {
|
||||
"file": "useSplitAttributes.js"
|
||||
},
|
||||
"_useWarnOnce.js": {
|
||||
"file": "useWarnOnce.js"
|
||||
},
|
||||
"src/components/accordion/Accordion.css": {
|
||||
"file": "CdxAccordion.css",
|
||||
"src": "src/components/accordion/Accordion.css"
|
||||
},
|
||||
"src/components/accordion/Accordion.vue": {
|
||||
"css": [
|
||||
"CdxAccordion.css"
|
||||
],
|
||||
"file": "CdxAccordion.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_useGeneratedId.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/accordion/Accordion.vue"
|
||||
},
|
||||
"src/components/button-group/ButtonGroup.css": {
|
||||
"file": "CdxButtonGroup.css",
|
||||
"src": "src/components/button-group/ButtonGroup.css"
|
||||
},
|
||||
"src/components/button-group/ButtonGroup.vue": {
|
||||
"css": [
|
||||
"CdxButtonGroup.css"
|
||||
],
|
||||
"file": "CdxButtonGroup.js",
|
||||
"imports": [
|
||||
"_buttonHelpers.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_Icon.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/button-group/ButtonGroup.vue"
|
||||
},
|
||||
"src/components/button/Button.css": {
|
||||
"file": "CdxButton.css",
|
||||
"src": "src/components/button/Button.css"
|
||||
},
|
||||
"src/components/button/Button.vue": {
|
||||
"css": [
|
||||
"CdxButton.css"
|
||||
],
|
||||
"file": "CdxButton.js",
|
||||
"imports": [
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/button/Button.vue"
|
||||
},
|
||||
"src/components/card/Card.css": {
|
||||
"file": "CdxCard.css",
|
||||
"src": "src/components/card/Card.css"
|
||||
},
|
||||
"src/components/card/Card.vue": {
|
||||
"css": [
|
||||
"CdxCard.css"
|
||||
],
|
||||
"file": "CdxCard.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/card/Card.vue"
|
||||
},
|
||||
"src/components/checkbox/Checkbox.css": {
|
||||
"file": "CdxCheckbox.css",
|
||||
"src": "src/components/checkbox/Checkbox.css"
|
||||
},
|
||||
"src/components/checkbox/Checkbox.vue": {
|
||||
"css": [
|
||||
"CdxCheckbox.css"
|
||||
],
|
||||
"file": "CdxCheckbox.js",
|
||||
"imports": [
|
||||
"src/components/label/Label.vue",
|
||||
"_useLabelChecker.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useGeneratedId.js",
|
||||
"_useFieldData.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_Icon.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/checkbox/Checkbox.vue"
|
||||
},
|
||||
"src/components/chip-input/ChipInput.css": {
|
||||
"file": "CdxChipInput.css",
|
||||
"src": "src/components/chip-input/ChipInput.css"
|
||||
},
|
||||
"src/components/chip-input/ChipInput.vue": {
|
||||
"css": [
|
||||
"CdxChipInput.css"
|
||||
],
|
||||
"file": "CdxChipInput.js",
|
||||
"imports": [
|
||||
"src/components/input-chip/InputChip.vue",
|
||||
"_constants.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"_Icon.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/chip-input/ChipInput.vue"
|
||||
},
|
||||
"src/components/combobox/Combobox.css": {
|
||||
"file": "CdxCombobox.css",
|
||||
"src": "src/components/combobox/Combobox.css"
|
||||
},
|
||||
"src/components/combobox/Combobox.vue": {
|
||||
"css": [
|
||||
"CdxCombobox.css"
|
||||
],
|
||||
"file": "CdxCombobox.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/button/Button.vue",
|
||||
"src/components/menu/Menu.vue",
|
||||
"src/components/text-input/TextInput.vue",
|
||||
"_useModelWrapper.js",
|
||||
"_useGeneratedId.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"_useFloatingMenu.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js",
|
||||
"src/components/menu-item/MenuItem.vue",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"src/components/progress-bar/ProgressBar.vue",
|
||||
"_useIntersectionObserver.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/combobox/Combobox.vue"
|
||||
},
|
||||
"src/components/dialog/Dialog.css": {
|
||||
"file": "CdxDialog.css",
|
||||
"src": "src/components/dialog/Dialog.css"
|
||||
},
|
||||
"src/components/dialog/Dialog.vue": {
|
||||
"css": [
|
||||
"CdxDialog.css"
|
||||
],
|
||||
"file": "CdxDialog.js",
|
||||
"imports": [
|
||||
"src/components/button/Button.vue",
|
||||
"_Icon.js",
|
||||
"_useGeneratedId.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/dialog/Dialog.vue"
|
||||
},
|
||||
"src/components/field/Field.css": {
|
||||
"file": "CdxField.css",
|
||||
"src": "src/components/field/Field.css"
|
||||
},
|
||||
"src/components/field/Field.vue": {
|
||||
"css": [
|
||||
"CdxField.css"
|
||||
],
|
||||
"file": "CdxField.js",
|
||||
"imports": [
|
||||
"src/components/label/Label.vue",
|
||||
"src/components/message/Message.vue",
|
||||
"_constants.js",
|
||||
"_useGeneratedId.js",
|
||||
"_useFieldData.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_Icon.js",
|
||||
"_useSplitAttributes.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/field/Field.vue"
|
||||
},
|
||||
"src/components/icon/Icon.vue": {
|
||||
"file": "CdxIcon.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/icon/Icon.vue"
|
||||
},
|
||||
"src/components/info-chip/InfoChip.css": {
|
||||
"file": "CdxInfoChip.css",
|
||||
"src": "src/components/info-chip/InfoChip.css"
|
||||
},
|
||||
"src/components/info-chip/InfoChip.vue": {
|
||||
"css": [
|
||||
"CdxInfoChip.css"
|
||||
],
|
||||
"file": "CdxInfoChip.js",
|
||||
"imports": [
|
||||
"_constants.js",
|
||||
"_Icon.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/info-chip/InfoChip.vue"
|
||||
},
|
||||
"src/components/input-chip/InputChip.css": {
|
||||
"file": "CdxInputChip.css",
|
||||
"src": "src/components/input-chip/InputChip.css"
|
||||
},
|
||||
"src/components/input-chip/InputChip.vue": {
|
||||
"css": [
|
||||
"CdxInputChip.css"
|
||||
],
|
||||
"file": "CdxInputChip.js",
|
||||
"imports": [
|
||||
"src/components/button/Button.vue",
|
||||
"_Icon.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/input-chip/InputChip.vue"
|
||||
},
|
||||
"src/components/label/Label.css": {
|
||||
"file": "CdxLabel.css",
|
||||
"src": "src/components/label/Label.css"
|
||||
},
|
||||
"src/components/label/Label.vue": {
|
||||
"css": [
|
||||
"CdxLabel.css"
|
||||
],
|
||||
"file": "CdxLabel.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"_useFieldData.js",
|
||||
"_useSplitAttributes.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/label/Label.vue"
|
||||
},
|
||||
"src/components/lookup/Lookup.css": {
|
||||
"file": "CdxLookup.css",
|
||||
"src": "src/components/lookup/Lookup.css"
|
||||
},
|
||||
"src/components/lookup/Lookup.vue": {
|
||||
"css": [
|
||||
"CdxLookup.css"
|
||||
],
|
||||
"file": "CdxLookup.js",
|
||||
"imports": [
|
||||
"src/components/menu/Menu.vue",
|
||||
"src/components/text-input/TextInput.vue",
|
||||
"_useGeneratedId.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"_useFloatingMenu.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"src/components/menu-item/MenuItem.vue",
|
||||
"_Icon.js",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"src/components/progress-bar/ProgressBar.vue",
|
||||
"_useWarnOnce.js",
|
||||
"_useIntersectionObserver.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/lookup/Lookup.vue"
|
||||
},
|
||||
"src/components/menu-item/MenuItem.css": {
|
||||
"file": "CdxMenuItem.css",
|
||||
"src": "src/components/menu-item/MenuItem.css"
|
||||
},
|
||||
"src/components/menu-item/MenuItem.vue": {
|
||||
"css": [
|
||||
"CdxMenuItem.css"
|
||||
],
|
||||
"file": "CdxMenuItem.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/menu-item/MenuItem.vue"
|
||||
},
|
||||
"src/components/menu/Menu.css": {
|
||||
"file": "CdxMenu.css",
|
||||
"src": "src/components/menu/Menu.css"
|
||||
},
|
||||
"src/components/menu/Menu.vue": {
|
||||
"css": [
|
||||
"CdxMenu.css"
|
||||
],
|
||||
"file": "CdxMenu.js",
|
||||
"imports": [
|
||||
"src/components/menu-item/MenuItem.vue",
|
||||
"src/components/progress-bar/ProgressBar.vue",
|
||||
"_useGeneratedId.js",
|
||||
"_useIntersectionObserver.js",
|
||||
"_useSplitAttributes.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_Icon.js",
|
||||
"_constants.js",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/menu/Menu.vue"
|
||||
},
|
||||
"src/components/message/Message.css": {
|
||||
"file": "CdxMessage.css",
|
||||
"src": "src/components/message/Message.css"
|
||||
},
|
||||
"src/components/message/Message.vue": {
|
||||
"css": [
|
||||
"CdxMessage.css"
|
||||
],
|
||||
"file": "CdxMessage.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/message/Message.vue"
|
||||
},
|
||||
"src/components/progress-bar/ProgressBar.css": {
|
||||
"file": "CdxProgressBar.css",
|
||||
"src": "src/components/progress-bar/ProgressBar.css"
|
||||
},
|
||||
"src/components/progress-bar/ProgressBar.vue": {
|
||||
"css": [
|
||||
"CdxProgressBar.css"
|
||||
],
|
||||
"file": "CdxProgressBar.js",
|
||||
"imports": [
|
||||
"_useWarnOnce.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/progress-bar/ProgressBar.vue"
|
||||
},
|
||||
"src/components/radio/Radio.css": {
|
||||
"file": "CdxRadio.css",
|
||||
"src": "src/components/radio/Radio.css"
|
||||
},
|
||||
"src/components/radio/Radio.vue": {
|
||||
"css": [
|
||||
"CdxRadio.css"
|
||||
],
|
||||
"file": "CdxRadio.js",
|
||||
"imports": [
|
||||
"src/components/label/Label.vue",
|
||||
"_useLabelChecker.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useGeneratedId.js",
|
||||
"_useFieldData.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_Icon.js",
|
||||
"_constants.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/radio/Radio.vue"
|
||||
},
|
||||
"src/components/search-input/SearchInput.css": {
|
||||
"file": "CdxSearchInput.css",
|
||||
"src": "src/components/search-input/SearchInput.css"
|
||||
},
|
||||
"src/components/search-input/SearchInput.vue": {
|
||||
"css": [
|
||||
"CdxSearchInput.css"
|
||||
],
|
||||
"file": "CdxSearchInput.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/button/Button.vue",
|
||||
"src/components/text-input/TextInput.vue",
|
||||
"_useModelWrapper.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/search-input/SearchInput.vue"
|
||||
},
|
||||
"src/components/search-result-title/SearchResultTitle.css": {
|
||||
"file": "CdxSearchResultTitle.css",
|
||||
"src": "src/components/search-result-title/SearchResultTitle.css"
|
||||
},
|
||||
"src/components/search-result-title/SearchResultTitle.vue": {
|
||||
"css": [
|
||||
"CdxSearchResultTitle.css"
|
||||
],
|
||||
"file": "CdxSearchResultTitle.js",
|
||||
"imports": [
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/search-result-title/SearchResultTitle.vue"
|
||||
},
|
||||
"src/components/select/Select.css": {
|
||||
"file": "CdxSelect.css",
|
||||
"src": "src/components/select/Select.css"
|
||||
},
|
||||
"src/components/select/Select.vue": {
|
||||
"css": [
|
||||
"CdxSelect.css"
|
||||
],
|
||||
"file": "CdxSelect.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/menu/Menu.vue",
|
||||
"_useGeneratedId.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useFieldData.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFloatingMenu.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"src/components/menu-item/MenuItem.vue",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"src/components/progress-bar/ProgressBar.vue",
|
||||
"_useWarnOnce.js",
|
||||
"_useIntersectionObserver.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/select/Select.vue"
|
||||
},
|
||||
"src/components/tab/Tab.css": {
|
||||
"file": "CdxTab.css",
|
||||
"src": "src/components/tab/Tab.css"
|
||||
},
|
||||
"src/components/tab/Tab.vue": {
|
||||
"css": [
|
||||
"CdxTab.css"
|
||||
],
|
||||
"file": "CdxTab.js",
|
||||
"imports": [
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/tab/Tab.vue"
|
||||
},
|
||||
"src/components/tabs/Tabs.css": {
|
||||
"file": "CdxTabs.css",
|
||||
"src": "src/components/tabs/Tabs.css"
|
||||
},
|
||||
"src/components/tabs/Tabs.vue": {
|
||||
"css": [
|
||||
"CdxTabs.css"
|
||||
],
|
||||
"file": "CdxTabs.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/button/Button.vue",
|
||||
"src/components/tab/Tab.vue",
|
||||
"_useGeneratedId.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useIntersectionObserver.js",
|
||||
"_useSlotContents.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/tabs/Tabs.vue"
|
||||
},
|
||||
"src/components/text-area/TextArea.css": {
|
||||
"file": "CdxTextArea.css",
|
||||
"src": "src/components/text-area/TextArea.css"
|
||||
},
|
||||
"src/components/text-area/TextArea.vue": {
|
||||
"css": [
|
||||
"CdxTextArea.css"
|
||||
],
|
||||
"file": "CdxTextArea.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useFieldData.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/text-area/TextArea.vue"
|
||||
},
|
||||
"src/components/text-input/TextInput.css": {
|
||||
"file": "CdxTextInput.css",
|
||||
"src": "src/components/text-input/TextInput.css"
|
||||
},
|
||||
"src/components/text-input/TextInput.vue": {
|
||||
"css": [
|
||||
"CdxTextInput.css"
|
||||
],
|
||||
"file": "CdxTextInput.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"_constants.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/text-input/TextInput.vue"
|
||||
},
|
||||
"src/components/thumbnail/Thumbnail.css": {
|
||||
"file": "CdxThumbnail.css",
|
||||
"src": "src/components/thumbnail/Thumbnail.css"
|
||||
},
|
||||
"src/components/thumbnail/Thumbnail.vue": {
|
||||
"css": [
|
||||
"CdxThumbnail.css"
|
||||
],
|
||||
"file": "CdxThumbnail.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/thumbnail/Thumbnail.vue"
|
||||
},
|
||||
"src/components/toggle-button-group/ToggleButtonGroup.css": {
|
||||
"file": "CdxToggleButtonGroup.css",
|
||||
"src": "src/components/toggle-button-group/ToggleButtonGroup.css"
|
||||
},
|
||||
"src/components/toggle-button-group/ToggleButtonGroup.vue": {
|
||||
"css": [
|
||||
"CdxToggleButtonGroup.css"
|
||||
],
|
||||
"file": "CdxToggleButtonGroup.js",
|
||||
"imports": [
|
||||
"_buttonHelpers.js",
|
||||
"_Icon.js",
|
||||
"src/components/toggle-button/ToggleButton.vue",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_constants.js",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/toggle-button-group/ToggleButtonGroup.vue"
|
||||
},
|
||||
"src/components/toggle-button/ToggleButton.css": {
|
||||
"file": "CdxToggleButton.css",
|
||||
"src": "src/components/toggle-button/ToggleButton.css"
|
||||
},
|
||||
"src/components/toggle-button/ToggleButton.vue": {
|
||||
"css": [
|
||||
"CdxToggleButton.css"
|
||||
],
|
||||
"file": "CdxToggleButton.js",
|
||||
"imports": [
|
||||
"_useIconOnlyButton.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/toggle-button/ToggleButton.vue"
|
||||
},
|
||||
"src/components/toggle-switch/ToggleSwitch.css": {
|
||||
"file": "CdxToggleSwitch.css",
|
||||
"src": "src/components/toggle-switch/ToggleSwitch.css"
|
||||
},
|
||||
"src/components/toggle-switch/ToggleSwitch.vue": {
|
||||
"css": [
|
||||
"CdxToggleSwitch.css"
|
||||
],
|
||||
"file": "CdxToggleSwitch.js",
|
||||
"imports": [
|
||||
"src/components/label/Label.vue",
|
||||
"_useLabelChecker.js",
|
||||
"_useModelWrapper.js",
|
||||
"_useGeneratedId.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_useFieldData.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"_Icon.js",
|
||||
"_constants.js",
|
||||
"_useSlotContents.js",
|
||||
"_useWarnOnce.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/toggle-switch/ToggleSwitch.vue"
|
||||
},
|
||||
"src/components/typeahead-search/TypeaheadSearch.css": {
|
||||
"file": "CdxTypeaheadSearch.css",
|
||||
"src": "src/components/typeahead-search/TypeaheadSearch.css"
|
||||
},
|
||||
"src/components/typeahead-search/TypeaheadSearch.vue": {
|
||||
"css": [
|
||||
"CdxTypeaheadSearch.css"
|
||||
],
|
||||
"file": "CdxTypeaheadSearch.js",
|
||||
"imports": [
|
||||
"_Icon.js",
|
||||
"src/components/menu/Menu.vue",
|
||||
"src/components/search-input/SearchInput.vue",
|
||||
"_useGeneratedId.js",
|
||||
"_useSplitAttributes.js",
|
||||
"_constants.js",
|
||||
"__plugin-vue_export-helper.js",
|
||||
"src/components/menu-item/MenuItem.vue",
|
||||
"src/components/thumbnail/Thumbnail.vue",
|
||||
"src/components/search-result-title/SearchResultTitle.vue",
|
||||
"src/components/progress-bar/ProgressBar.vue",
|
||||
"_useWarnOnce.js",
|
||||
"_useIntersectionObserver.js",
|
||||
"src/components/button/Button.vue",
|
||||
"_useIconOnlyButton.js",
|
||||
"_useSlotContents.js",
|
||||
"src/components/text-input/TextInput.vue",
|
||||
"_useModelWrapper.js",
|
||||
"_useFieldData.js"
|
||||
],
|
||||
"isEntry": true,
|
||||
"src": "src/components/typeahead-search/TypeaheadSearch.vue"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const i=require("vue"),n=require("./useSlotContents.js"),c=require("./useWarnOnce.js");function l(u,t,r){const o=i.computed(()=>{const s=n.useSlotContents(u);if(s.length!==1)return!1;const e=s[0];return!!(typeof e=="object"&&(n.isComponentVNode(e,"CdxIcon")||n.isTagVNode(e,"svg")))});return c.useWarnOnce(()=>o.value&&!t["aria-label"]&&!t["aria-hidden"],"".concat(r,": Icon-only buttons require one of the following attributes: aria-label or aria-hidden. See documentation at https://doc.wikimedia.org/codex/latest/components/demos/button.html#icon-only-button")),o}exports.useIconOnlyButton=l;
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const o=require("vue");function p(e,u,r){return o.computed({get:()=>e.value,set:t=>u(r||"update:modelValue",t)})}exports.useModelWrapper=p;
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const o=require("vue");function r(e){const t=[];for(const n of e)typeof n.type=="string"||typeof n.type=="object"?t.push(n):n.type!==o.Comment&&(typeof n.children=="string"&&n.children.trim()!==""?t.push(n.children):Array.isArray(n.children)&&t.push(...r(n.children)));return t}function i(e,t){return typeof e.type=="object"&&"name"in e.type?t!==void 0?e.type.name===t:!0:!1}function s(e,t){return typeof e.type=="string"?t!==void 0?e.type===t.toLowerCase():!0:!1}function f(e){const t=typeof e=="function"?e():e;return t?r(t):[]}exports.isComponentVNode=i;exports.isTagVNode=s;exports.useSlotContents=f;
|
||||
|
|
@ -0,0 +1 @@
|
|||
"use strict";const n=require("vue");function u(r,t){if(r()){n.warn(t);return}const c=n.watch(r,e=>{e&&(n.warn(t),c())})}exports.useWarnOnce=u;
|
||||
101
tests/phpunit/includes/ResourceLoader/CodexModuleTest.php
Normal file
101
tests/phpunit/includes/ResourceLoader/CodexModuleTest.php
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
|
||||
namespace MediaWiki\Tests\ResourceLoader;
|
||||
|
||||
use MediaWiki\ResourceLoader\CodexModule;
|
||||
use ResourceLoaderTestCase;
|
||||
|
||||
/**
|
||||
* @group ResourceLoader
|
||||
* @covers \MediaWiki\ResourceLoader\CodexModule
|
||||
*/
|
||||
class CodexModuleTest extends ResourceLoaderTestCase {
|
||||
|
||||
public static function provideModuleConfig() {
|
||||
return [
|
||||
[ 'Codex subset',
|
||||
[
|
||||
'codexComponents' => [ 'CdxButton', 'CdxMessage', 'useModelWrapper' ],
|
||||
'codexStyleOnly' => false,
|
||||
'codexScriptOnly' => false
|
||||
],
|
||||
[
|
||||
'packageFiles' => [
|
||||
'codex.js',
|
||||
'_codex/useModelWrapper.js',
|
||||
'_codex/constants.js',
|
||||
'_codex/useSlotContents.js',
|
||||
'_codex/useWarnOnce.js',
|
||||
'_codex/useIconOnlyButton.js',
|
||||
'_codex/_plugin-vue_export-helper.js',
|
||||
'_codex/CdxButton.js',
|
||||
'_codex/Icon.js',
|
||||
'_codex/CdxMessage.js'
|
||||
],
|
||||
'styles' => [ 'CdxButton.css', 'CdxIcon.css', 'CdxMessage.css' ]
|
||||
]
|
||||
],
|
||||
[ 'Codex subset, style only',
|
||||
[
|
||||
'codexComponents' => [ 'CdxButton', 'CdxMessage' ],
|
||||
'codexStyleOnly' => true,
|
||||
'codexScriptOnly' => false
|
||||
],
|
||||
[
|
||||
'packageFiles' => [],
|
||||
'styles' => [ 'CdxButton.css', 'CdxIcon.css', 'CdxMessage.css' ]
|
||||
]
|
||||
],
|
||||
[ 'Codex subset, script only',
|
||||
[
|
||||
'codexComponents' => [ 'CdxButton', 'CdxMessage', 'useModelWrapper' ],
|
||||
'codexStyleOnly' => false,
|
||||
'codexScriptOnly' => true
|
||||
],
|
||||
[
|
||||
'packageFiles' => [
|
||||
'codex.js',
|
||||
'_codex/useModelWrapper.js',
|
||||
'_codex/constants.js',
|
||||
'_codex/useSlotContents.js',
|
||||
'_codex/useWarnOnce.js',
|
||||
'_codex/useIconOnlyButton.js',
|
||||
'_codex/_plugin-vue_export-helper.js',
|
||||
'_codex/CdxButton.js',
|
||||
'_codex/Icon.js',
|
||||
'_codex/CdxMessage.js'
|
||||
],
|
||||
'styles' => []
|
||||
]
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideModuleConfig
|
||||
*/
|
||||
public function testCodexSubset( $testCase, $moduleDefinition, $expected ) {
|
||||
$testModule = new class( $moduleDefinition ) extends CodexModule {
|
||||
public const CODEX_MODULE_DIR = 'tests/phpunit/data/resourceloader/codexModules/';
|
||||
};
|
||||
|
||||
$context = $this->getResourceLoaderContext();
|
||||
$config = $context->getResourceLoader()->getConfig();
|
||||
$testModule->setConfig( $config );
|
||||
|
||||
$packageFiles = $testModule->getPackageFiles( $context );
|
||||
// Style-only module will not have any packageFiles.
|
||||
$packageFilenames = isset( $packageFiles ) ? array_keys( $packageFiles[ 'files' ] ) : [];
|
||||
$this->assertEquals( $expected[ 'packageFiles' ], $packageFilenames, 'Correct packageFiles added for ' . $testCase );
|
||||
|
||||
$styleFiles = $testModule->getStyleFiles( $context );
|
||||
// Script-only module will not have any styleFiles.
|
||||
$styleFilenames = [];
|
||||
if ( count( $styleFiles ) > 0 ) {
|
||||
$styleFilenames = array_map( static function ( $filepath ) use ( $testModule ) {
|
||||
return str_replace( $testModule::CODEX_MODULE_DIR, '', $filepath->getPath() );
|
||||
}, $styleFiles[ 'all' ] );
|
||||
}
|
||||
$this->assertEquals( $expected[ 'styles' ], $styleFilenames, 'Correct styleFiles added for ' . $testCase );
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue