-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy pathjquery-ui-manifests.js
127 lines (113 loc) · 3.37 KB
/
jquery-ui-manifests.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
"use strict";
var categories, orderedComponents,
path = require( "node:path" );
categories = {
"Core": {
name: "Core",
description: "Various utilities and helpers",
order: 0
},
"Interactions": {
name: "Interactions",
description: "These add basic behaviors to any element and are used by many components below.",
order: 1
},
"Widgets": {
name: "Widgets",
description: "Full-featured UI Controls - each has a range of options and is fully themeable.",
order: 2
},
"Effects": {
name: "Effects",
description: "A rich effect API and ready to use effects.",
order: 3
}
};
orderedComponents = "core widget mouse position".split( " " );
function createCategories( manifests ) {
var map = {};
return manifests.reduce( function( arr, component ) {
if ( !map[ component.category ] ) {
var category = Object.assign( {
components: []
}, categories[ component.category ] );
map[ component.category ] = category;
arr.push( category );
}
map[ component.category ].components.push( component );
return arr;
}, [] ).sort( function( a, b ) {
return a.order - b.order;
} );
}
function stripExtension( string ) {
return string.replace( /\.[^.]*/, "" );
}
function flattenDependencies( tree, dependencies, ret ) {
ret = ret || [];
dependencies.filter( function( dependency ) {
return dependency !== "jquery";
} ).forEach( function( dependency ) {
if ( ret.indexOf( dependency ) === -1 ) {
ret.push( dependency );
flattenDependencies( tree, tree[ dependency ] || [], ret );
}
} );
return ret;
}
function get( data, key ) {
var match = data.match( new RegExp( "\/\/>>" + key + ": (.*)" ) );
return match && match[ 1 ];
}
function trim( string ) {
return string.trim();
}
function getDependencies( data ) {
var match = data.match( /define\(\ ?\[([^\]]*?)\]/ );
if ( match === null ) {
return [];
}
return match[ 1 ].replace( /\/\/.+/g, "" ).replace( /"/g, "" ).split( "," ).map( trim );
}
function JqueryUiManifests() {
var dependenciesTree = {};
this.manifests = this.files().componentFiles.filter( function( component ) {
return ( /ui\// ).test( component.path );
} ).map( function( component ) {
var data = component.data;
return {
name: stripExtension( path.relative( "ui", component.path ) ),
title: get( data, "label" ),
description: get( data, "description" ),
docs: get( data, "docs" ),
category: get( data, "group" ),
dependencies: getDependencies( data ).map( function( dependency ) {
return path.relative( ".", dependency );
} )
};
// Workaround to get rid of files like `form-reset-mixin.js`.
} ).filter( function( component ) {
return component.title !== null;
} ).sort( function( a, b ) {
var aOrder = orderedComponents.indexOf( a.name ),
bOrder = orderedComponents.indexOf( b.name );
// Precedence is 1st orderedComponents, 2nd alphabetical.
if ( aOrder >= 0 && bOrder >= 0 ) {
return aOrder - bOrder;
} else if ( aOrder >= 0 ) {
return -1;
} else if ( bOrder >= 0 ) {
return 1;
} else {
return a.name > b.name ? 1 : -1;
}
} );
this.manifests.forEach( function( manifest ) {
dependenciesTree[ manifest.name ] = manifest.dependencies;
} );
this.manifests.forEach( function( manifest ) {
manifest.dependencies = flattenDependencies( dependenciesTree, manifest.dependencies );
} );
this.categories = createCategories( this.manifests );
}
module.exports = JqueryUiManifests;