8000 refactoring to NOT import tns-core-modules when required from webpack · Akylas/nativescript-vue@18d377d · GitHub
[go: up one dir, main page]

Skip to content

Commit 18d377d

Browse files
committed
refactoring to NOT import tns-core-modules when required from webpack
1 parent 75da6d3 commit 18d377d

File tree

12 files changed

+311
-96
lines changed

12 files changed

+311
-96
lines changed

platform/nativescript/compiler.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export { parseComponent } from './compiler/sfc/parser'
22
export { compile, compileToFunctions } from './compiler/index'
3-
export { registerElement } from './element-registry'
3+
// register all components
4+
export { registerElement } from './compiler/element-registry'

platform/nativescript/compiler/directives/model.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
2-
import { isKnownView, getViewMeta } from '../../element-registry'
2+
import { isKnownView, getViewMeta } from '../../element-register'
33
import { addHandler, addAttr } from 'compiler/helpers'
44

55
export default function model(el, dir) {
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
import { registerElement } from '../element-register'
2+
export { registerElement }
3+
4+
registerElement(
5+
'AbsoluteLayout',
6+
() => require('tns-core-modules/ui/layouts/absolute-layout').AbsoluteLayout
7+
)
8+
registerElement(
9+
'ActivityIndicator',
10+
() => require('tns-core-modules/ui/activity-indicator').ActivityIndicator
11+
)
12+
registerElement('Border', () => require('tns-core-modules/ui/border').Border)
13+
registerElement('Button', () => require('tns-core-modules/ui/button').Button)
14+
registerElement(
15+
'ContentView',
16+
() => require('tns-core-modules/ui/content-view').ContentView
17+
)
18+
registerElement(
19+
'DatePicker',
20+
() => require('tns-core-modules/ui/date-picker').DatePicker,
21+
{
22+
model: {
23+
prop: 'date',
24+
event: 'dateChange'
25+
}
26+
}
27+
)
28+
registerElement(
29+
'DockLayout',
30+
() => require('tns-core-modules/ui/layouts/dock-layout').DockLayout
31+
)
32+
registerElement(
33+
'GridLayout',
34+
() => require('tns-core-modules/ui/layouts/grid-layout').GridLayout
35+
)
36+
registerElement(
37+
'HtmlView',
38+
() => require('tns-core-modules/ui/html-view').HtmlView
39+
)
40+
registerElement('Image', () => require('tns-core-modules/ui/image').Image)
41+
registerElement('img', () => require('tns-core-modules/ui/image').Image)
42+
registerElement('Label', () => require('tns-core-modules/ui/label').Label)
43+
registerElement(
44+
'ListPicker',
45+
() => require('tns-core-modules/ui/list-picker').ListPicker,
46+
{
47+
model: {
48+
prop: 'selectedIndex',
49+
event: 'selectedIndexChange'
50+
}
51+
}
52+
)
53+
registerElement(
54+
'NativeActionBar',
55+
() => require('tns-core-modules/ui/action-bar').ActionBar
56+
)
57+
registerElement(
58+
'NativeActionItem',
59+
() => require('tns-core-modules/ui/action-bar').ActionItem
60+
)
61+
registerElement(
62+
'NativeListView',
63+
() => require('tns-core-modules/ui/list-view').ListView
64+
)
65+
registerElement(
66+
'NativeNavigationButton',
67+
() => require('tns-core-modules/ui/action-bar').NavigationButton
68+
)
69+
registerElement('Page', () => require('tns-core-modules/ui/page').Page, {
70+
skipAddToDom: true
71+
})
72+
registerElement(
73+
'Placeholder',
74+
() => require('tns-core-modules/ui/placeholder').Placeholder
75+
)
76+
registerElement(
77+
'Progress',
78+
() => require('tns-core-modules/ui/progress').Progress
79+
)
80+
registerElement(
81+
'ProxyViewContainer',
82+
() => require('tns-core-modules/ui/proxy-view-container').ProxyViewContainer
83+
)
84+
registerElement(
85+
'Repeater',
86+
() => require('tns-core-modules/ui/repeater').Repeater
87+
)
88+
registerElement(
89+
'ScrollView',
90+
() => require('tns-core-modules/ui/scroll-view').ScrollView
91+
)
92+
registerElement(
93+
'SearchBar',
94+
() => require('tns-core-modules/ui/search-bar').SearchBar,
95+
{
96+
model: {
97+
prop: 'text',
98+
event: 'textChange'
99+
}
100+
}
101+
)
102+
registerElement(
103+
'SegmentedBar',
104+
() => require('tns-core-modules/ui/segmented-bar').SegmentedBar,
105+
{
106+
model: {
107+
prop: 'selectedIndex',
108+
event: 'selectedIndexChange'
109+
}
110+
}
111+
)
112+
registerElement(
113+
'SegmentedBarItem',
114+
() => require('tns-core-modules/ui/segmented-bar').SegmentedBarItem
115+
)
116+
registerElement('Slider', () => require('tns-core-modules/ui/slider').Slider, {
117+
model: {
118+
prop: 'value',
119+
event: 'valueChange'
120+
}
121+
})
122+
registerElement(
123+
'StackLayout',
124+
() => require('tns-core-modules/ui/layouts/stack-layout').StackLayout
125+
)
126+
registerElement(
127+
'FlexboxLayout',
128+
() => require('tns-core-modules/ui/layouts/flexbox-layout').FlexboxLayout
129+
)
130+
registerElement('Switch', () => require('tns-core-modules/ui/switch').Switch, {
131+
model: {
132+
prop: 'checked',
133+
event: 'checkedChange'
134+
}
135+
})
136+
137+
registerElement(
138+
'NativeTabView',
139+
() => require('tns-core-modules/ui/tab-view').TabView,
140+
{
141+
model: {
142+
prop: 'selectedIndex',
143+
event: 'selectedIndexChange'
144+
}
145+
}
146+
)
147+
registerElement(
148+
'NativeTabViewItem',
149+
() => require('tns-core-modules/ui/tab-view').TabViewItem,
150+
{
151+
skipAddToDom: true
152+
}
153+
)
154+
155+
registerElement(
156+
'TextField',
157+
() => require('tns-core-modules/ui/text-field').TextField
158+
)
159+
registerElement(
160+
'TextView',
161+
() => require('tns-core-modules/ui/text-view').TextView
162+
)
163+
registerElement(
164+
'TimePicker',
165+
() => require('tns-core-modules/ui/time-picker').TimePicker,
166+
{
167+
model: {
168+
prop: 'time',
169+
event: 'timeChange'
170+
}
171+
}
172+
)
173+
registerElement(
174+
'WebView',
175+
() => require('tns-core-modules/ui/web-view').WebView
176+
)
177+
registerElement(
178+
'WrapLayout',
179+
() => require('tns-core-modules/ui/layouts/wrap-layout').WrapLayout
180+
)
181+
registerElement(
182+
'FormattedString',
183+
() => require('text/formatted-string').FormattedString
184+
)
185+
registerElement('Span', () => require('text/span').Span)
186+
187+
registerElement(
188+
'DetachedContainer',
189+
() => require('tns-core-modules/ui/proxy-view-container').ProxyViewContainer,
190+
{
191+
skipAddToDom: true
192+
}
193+
)
194+
registerElement(
195+
'DetachedText',
196+
() => require('tns-core-modules/ui/placeholder').Placeholder,
197+
{
198+
skipAddToDom: true
199+
}
200+
)
201+
registerElement(
202+
'Comment',
203+
() => require('tns-core-modules/ui/placeholder').Placeholder
204+
)
205+
registerElement(
206+
'Document',
207+
() => require('tns-core-modules/ui/proxy-view-container').ProxyViewContainer,
208+
{
209+
skipAddToDom: true
210+
}
211+
)

platform/nativescript/compiler/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createCompiler } from 'compiler/index'
22
import { genStaticKeys } from 'shared/util'
3-
3+
import { registerElement } from '../element-register'
44
import modules from './modules/index'
55
import directives from './directives/index'
66

@@ -25,4 +25,4 @@ export const baseOptions = {
2525
}
2626

2727
const { compile, compileToFunctions } = createCompiler(baseOptions)
28-
export { compile, compileToFunctions }
28+
export { compile, compileToFunctions, registerElement }

platform/nativescript/compiler/modules/for.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
2-
import { normalizeElementName } from '../../element-registry'
2+
import { normalizeElementName } from '../../element-register'
33
import { parseFor } from 'compiler/parser/index'
44
import { warn } from 'core/util/debug'
55

platform/nativescript/compiler/modules/router.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { normalizeElementName } from '../../element-registry'
1+
import { normalizeElementName } from '../../element-register'
22
import { addAttr } from 'compiler/helpers'
33

44
function preTransformNode(el) {
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
2+
const elementMap = {}
3+
const nativeRegExp = /Native/gi
4+
const dashRegExp = /-/g
5+
6+
const defaultViewMeta = {
7+
skipAddToDom: false,
8+
isUnaryTag: false,
9+
tagNamespace: '',
10+
canBeLeftOpenTag: false,
11+
model: null,
12+
component: null
13+
}
14+
15+
export function normalizeElementName(elementName) {
16+
return `native${elementName
17+
.replace(nativeRegExp, '')
18+
.replace(dashRegExp, '')
19+
.toLowerCase()}`
20+
}
21+
22+
export function registerElement(elementName, resolver, meta) {
23+
const normalizedName = normalizeElementName(elementName)
24+
25+
meta = Object.assign({}, defaultViewMeta, meta)
26+
27+
if (elementMap[normalizedName]) {
28+
throw new Error(`Element for ${elementName} already registered.`)
29+
}
30+
31+
if (!meta.component) {
32+
// if no Vue component is passed, wrap the simpler vue component
33+
// which bind the events and attributes to the NS one
34+
meta.component = {
35+
functional: true,
36+
model: meta.model,
37+
render: (h, { data, children }) => {
38+
return h(normalizedName, data, children)
39+
}
40+
}
41+
}
42+
meta.component.name = elementName
43+
44+
const entry = {
45+
resolver: resolver,
46+
meta: meta
47+
}
48+
elementMap[normalizedName] = entry
49+
}
50+
51+
export function getElementMap() {
52+
return elementMap
53+
}
54+
55+
export function getViewClass(elementName) {
56+
const normalizedName = normalizeElementName(elementName)
57+
const entry = elementMap[normalizedName]
58+
59+
if (!entry) {
60+
throw new TypeError(`No known component for element ${elementName}.`)
61+
}
62+
63+
try {
64+
return entry.resolver()
65+
} catch (e) {
66+
throw new TypeError(`Could not load view for: ${elementName}. ${e}`)
67+
}
68+
}
69+
70+
export function getViewMeta(elementName) {
71+
const normalizedName = normalizeElementName(elementName)
72+
73+
let meta = defaultViewMeta
74+
const entry = elementMap[normalizedName]
75+
76+
if (entry && entry.meta) {
77+
meta = entry.meta
78+
}
79+
80+
return meta
81+
}
82+
83+
export function isKnownView(elementName) {
84+
return elementMap[normalizeElementName(elementName)]
85+
}

0 commit comments

Comments
 (0)
0