neo.mjs 6.8.3 → 6.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/learnneo/view/home/MainContainer.mjs +4 -3
  3. package/apps/learnneo/view/home/MainContainerController.mjs +24 -2
  4. package/apps/route/app.mjs +6 -0
  5. package/apps/route/index.html +11 -0
  6. package/apps/route/neo-config.json +6 -0
  7. package/apps/route/view/ButtonBar.mjs +57 -0
  8. package/apps/route/view/CenterContainer.mjs +37 -0
  9. package/apps/route/view/FooterContainer.mjs +47 -0
  10. package/apps/route/view/HeaderContainer.mjs +47 -0
  11. package/apps/route/view/MainView.mjs +66 -0
  12. package/apps/route/view/MainViewController.mjs +210 -0
  13. package/apps/route/view/MetaContainer.mjs +52 -0
  14. package/apps/route/view/Viewport.mjs +15 -0
  15. package/apps/route/view/center/CardAdministration.mjs +36 -0
  16. package/apps/route/view/center/CardAdministrationDenied.mjs +26 -0
  17. package/apps/route/view/center/CardContact.mjs +29 -0
  18. package/apps/route/view/center/CardHome.mjs +26 -0
  19. package/apps/route/view/center/CardSection1.mjs +26 -0
  20. package/apps/route/view/center/CardSection2.mjs +27 -0
  21. package/examples/ConfigurationViewport.mjs +1 -1
  22. package/examples/ServiceWorker.mjs +2 -2
  23. package/examples/form/field/select/MainContainer.mjs +1 -2
  24. package/examples/table/container/MainContainer.mjs +4 -2
  25. package/examples/table/container/MainModel.mjs +3 -0
  26. package/examples/table/container/MainStore.mjs +10 -10
  27. package/examples/toolbar/paging/view/MainContainer.mjs +31 -3
  28. package/package.json +1 -1
  29. package/resources/data/learnneo/content.json +9 -9
  30. package/resources/data/learnneo/pages/whyneo.md +76 -0
  31. package/resources/scss/src/apps/route/CenterContainer.scss +29 -0
  32. package/resources/scss/src/apps/route/HeaderContainer.scss +122 -0
  33. package/resources/scss/src/apps/route/MainView.scss +3 -0
  34. package/resources/scss/src/apps/route/MetaContainer.scss +44 -0
  35. package/resources/scss/src/apps/route/_all.scss +1 -0
  36. package/src/DefaultConfig.mjs +2 -2
  37. package/src/Neo.mjs +15 -14
  38. package/src/button/Base.mjs +2 -2
  39. package/src/component/Base.mjs +41 -50
  40. package/src/container/Base.mjs +59 -2
  41. package/src/controller/Base.mjs +84 -4
  42. package/src/controller/Component.mjs +22 -7
  43. package/src/core/Observable.mjs +50 -9
  44. package/src/form/field/Range.mjs +8 -0
  45. package/src/main/DomEvents.mjs +9 -3
  46. package/src/manager/DomEvent.mjs +3 -0
  47. package/src/menu/List.mjs +1 -1
  48. package/src/table/View.mjs +78 -53
  49. package/src/toolbar/Paging.mjs +68 -76
  50. package/src/tooltip/Base.mjs +111 -11
@@ -0,0 +1,29 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import Label from '../../../../src/component/Label.mjs';
3
+
4
+ /**
5
+ * @class Route.view.center.CardContact
6
+ * @extends Neo.container.Base
7
+ */
8
+ class CardContact extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Route.view.center.CardContact'
12
+ * @protected
13
+ */
14
+ className: 'Route.view.center.CardContact',
15
+ baseCls: ['route_card_simple_page', 'neo-container'],
16
+
17
+ items: [
18
+ { cls : ['route_card_simple_page'], vdom: { cn: [
19
+ {tag: 'h1',innerHTML: 'Contact' },
20
+ {tag: 'a', href: 'https://github.com/neomjs/neo', target: '_blank', innerHTML: 'please visit https://github.com/neomjs/neo'}
21
+ ] } }
22
+ ]
23
+ }
24
+
25
+ }
26
+
27
+ Neo.applyClassConfig(CardContact);
28
+
29
+ export default CardContact;
@@ -0,0 +1,26 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import Label from '../../../../src/component/Label.mjs';
3
+
4
+ /**
5
+ * @class Route.view.center.CardHome
6
+ * @extends Neo.container.Base
7
+ */
8
+ class CardHome extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Route.view.center.CardHome'
12
+ * @protected
13
+ */
14
+ className: 'Route.view.center.CardHome',
15
+ baseCls: ['route_card_simple_page','neo-container'],
16
+
17
+ vdom: {
18
+ tag: 'h1',
19
+ innerHTML: 'This is the landing page of the example.'
20
+ }
21
+ }
22
+ }
23
+
24
+ Neo.applyClassConfig(CardHome);
25
+
26
+ export default CardHome;
@@ -0,0 +1,26 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import Label from '../../../../src/component/Label.mjs';
3
+
4
+ /**
5
+ * @class Route.view.center.CardSection1
6
+ * @extends Neo.container.Base
7
+ */
8
+ class CardSection1 extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Route.view.center.CardSection1'
12
+ * @protected
13
+ */
14
+ className: 'Route.view.center.CardSection1',
15
+ baseCls: ['route_card_simple_page','neo-container'],
16
+
17
+ vdom: {
18
+ tag: 'h1',
19
+ innerHTML: 'This is section 1 of the example.'
20
+ }
21
+ }
22
+ }
23
+
24
+ Neo.applyClassConfig(CardSection1);
25
+
26
+ export default CardSection1;
@@ -0,0 +1,27 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import Label from '../../../../src/component/Label.mjs';
3
+
4
+ /**
5
+ * @class Route.view.center.CardSection2
6
+ * @extends Neo.container.Base
7
+ */
8
+ class CardSection2 extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Route.view.center.CardSection2'
12
+ * @protected
13
+ */
14
+ className: 'Route.view.center.CardSection2',
15
+ baseCls: ['route_card_simple_page','neo-container'],
16
+
17
+ vdom: {
18
+ tag: 'h1',
19
+ innerHTML: 'This is section 2 of the example.'
20
+ }
21
+
22
+ }
23
+ }
24
+
25
+ Neo.applyClassConfig(CardSection2);
26
+
27
+ export default CardSection2;
@@ -107,7 +107,7 @@ class ConfigurationViewport extends Viewport {
107
107
 
108
108
  items: [{
109
109
  module: Container,
110
- layout: {ntype: 'vbox'},
110
+ layout: {ntype: 'vbox', align: null},
111
111
  style : {overflowY: 'auto', padding: '10px'},
112
112
  cls : ['neo-configuration-panel-body'],
113
113
  itemDefaults: {
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.8.3'
23
+ * @member {String} version='6.9.0'
24
24
  */
25
- version: '6.8.3'
25
+ version: '6.9.0'
26
26
  }
27
27
 
28
28
  /**
@@ -15,8 +15,7 @@ class MainContainer extends ConfigurationViewport {
15
15
  className : 'Neo.examples.form.field.select.MainContainer',
16
16
  autoMount : true,
17
17
  configItemLabelWidth : 160,
18
- exampleContainerConfig: {style: {position: 'relative'}},
19
- layout : {ntype: 'hbox', align: 'stretch'}
18
+ exampleContainerConfig: {style: {position: 'relative'}}
20
19
  }
21
20
 
22
21
  createConfigurationComponents() {
@@ -122,7 +122,8 @@ class MainContainer extends ConfigurationViewport {
122
122
  {dataField: 'githubId', text: 'Github Id'},
123
123
  {dataField: 'country', text: 'Country'},
124
124
  {
125
- text: 'Edit Action',
125
+ dataField: 'edit',
126
+ text : 'Edit Action',
126
127
  renderer: ({ column, index }) => {
127
128
  const
128
129
  widgetId = `${column.id}-widget-${index}`,
@@ -138,7 +139,8 @@ class MainContainer extends ConfigurationViewport {
138
139
  }
139
140
  },
140
141
  {
141
- text : 'Menu',
142
+ dataField: 'menu',
143
+ text : 'Menu',
142
144
  renderer({ column, record, index }) {
143
145
  const
144
146
  widgetId = `${column.id}-widget-${index}`,
@@ -9,6 +9,9 @@ class MainModel extends Model {
9
9
  className: 'Neo.examples.table.container.MainModel',
10
10
 
11
11
  fields: [{
12
+ name: 'colspan',
13
+ type: 'Object'
14
+ }, {
12
15
  name: 'country',
13
16
  type: 'String'
14
17
  }, {
@@ -16,36 +16,36 @@ class MainStore extends Store {
16
16
  firstname: 'Tobias',
17
17
  githubId : 'tobiu',
18
18
  lastname : 'Uhlig'
19
- },
20
- {
19
+ }, {
21
20
  country : 'USA',
22
21
  firstname: 'Rich',
23
22
  githubId : 'rwaters',
24
23
  lastname : 'Waters'
25
- },
26
- {
24
+ }, {
27
25
  country : 'Germany',
28
26
  firstname: 'Nils',
29
27
  githubId : 'mrsunshine',
30
28
  lastname : 'Dehl'
31
- },
32
- {
29
+ }, {
33
30
  country : 'USA',
34
31
  firstname: 'Gerard',
35
32
  githubId : 'camtnbikerrwc',
36
33
  lastname : 'Horan'
37
- },
38
- {
34
+ }, {
39
35
  country : 'Slovakia',
40
36
  firstname: 'Jozef',
41
37
  githubId : 'jsakalos',
42
38
  lastname : 'Sakalos'
43
- },
44
- {
39
+ }, {
45
40
  country : 'Germany',
46
41
  firstname: 'Bastian',
47
42
  githubId : 'bhaustein',
48
43
  lastname : 'Haustein'
44
+ }, {
45
+ colspan : {firstname: 3},
46
+ country : 'Germany',
47
+ firstname: 'Colspan 3',
48
+ githubId : 'random'
49
49
  }]
50
50
  }
51
51
  }
@@ -28,12 +28,14 @@ class MainContainer extends Viewport {
28
28
  items: ['->', {
29
29
  handler: 'onAddUserButtonClick',
30
30
  iconCls: 'fa fa-circle-plus',
31
- text : 'Add User'
31
+ text : 'Add User',
32
+ tooltip: 'Open a dialog and edit a new user'
32
33
  }, {
33
34
  handler: 'onShowFiltersButtonClick',
34
35
  iconCls: 'fa fa-filter',
35
36
  style : {marginLeft: '2px'},
36
- text : 'Show Filters'
37
+ text : 'Show Filters',
38
+ tooltip: 'Show filters for the user'
37
39
  }]
38
40
  }, {
39
41
  module : UserTableContainer,
@@ -44,7 +46,33 @@ class MainContainer extends Viewport {
44
46
  }, {
45
47
  module: PagingToolbar,
46
48
  bind : {store: 'stores.users'},
47
- flex : 'none'
49
+ flex : 'none',
50
+
51
+ // We want to apply custom configs to the provided item references
52
+ items: {
53
+ 'nav-button-first': {
54
+ tooltip: 'Go to first page'
55
+ },
56
+ 'nav-button-prev' : {
57
+ tooltip: 'Go to previous page'
58
+ },
59
+ 'nav-button-next' : {
60
+ tooltip: 'Go to next page'
61
+ },
62
+ 'nav-button-last' : {
63
+ tooltip: 'Go to last page'
64
+ },
65
+
66
+ // These two have been moved to the start of the Toolbar by their weights
67
+ label: {
68
+ style : {marginLeft: 0},
69
+ weight: -10000
70
+ },
71
+ rowsPerPage: {
72
+ tooltip: 'Set the number of rows to display in a page',
73
+ weight : -999
74
+ }
75
+ }
48
76
  }],
49
77
  /**
50
78
  * @member {Object} layout={ntype:'vbox',align:'stretch'}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "6.8.3",
3
+ "version": "6.9.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "data": [{
3
3
  "id" : 1,
4
- "isLeaf" : false,
5
- "name" : "Hello",
4
+ "isLeaf" : true,
5
+ "name" : "Why neo.mjs",
6
6
  "parentId": null,
7
- "path" : null
7
+ "path" : "whyneo.md"
8
8
  }, {
9
9
  "id" : 2,
10
- "isLeaf" : true,
11
- "name" : "Max",
12
- "parentId": 1,
10
+ "isLeaf" : false,
11
+ "name" : "Class Definitions and Config",
12
+ "parentId": null,
13
13
  "path" : null
14
14
  }, {
15
15
  "id" : 3,
16
16
  "isLeaf" : false,
17
- "name" : "Hello",
18
- "parentId": null,
17
+ "name" : "Class Basics",
18
+ "parentId": 2,
19
19
  "path" : null
20
20
  }, {
21
21
  "id" : 4,
22
22
  "isLeaf" : true,
23
- "name" : "Torsten",
23
+ "name" : "Classes, Properties, and Methods",
24
24
  "parentId": 3,
25
25
  "path" : null
26
26
  }]
@@ -0,0 +1,76 @@
1
+ Neo.mjs is a framework used to create browser-based applications.
2
+
3
+ Some key features and benefits of Neo.mjs are:
4
+
5
+ <div type="expander" caption="Multi-Threaded">
6
+ <p>
7
+ When a Neo.mjs application starts, the framework spawns three web-workers.
8
+ Web-workers are each run in their own thread. As a result, a typical Neo.mjs application
9
+ has four threads:
10
+ <ol>
11
+ <li>The _main_ thread, where DOM updates are applied
12
+ <li>An _application_ web-worker where normal application locic is run
13
+ <li>A _data_ web-worker were HTTP and socket calls are run
14
+ <li>A _view_ web-worker that manages delta updates
15
+ </ol>
16
+ </div>
17
+
18
+ <div type="expander" caption="Extreme Speed">
19
+ <p>
20
+ The Neo.mjs web-worker proccesses are automatically run in parallel, on separate CPU cores.
21
+ </p>
22
+ <p>
23
+ By contrast, other JavaScript frameworks run in a single thread. That means
24
+ in a typical framework all business logic, data handling, and DOM rendering compete for
25
+ CPU reasources.
26
+ </p>
27
+ <p>
28
+ This means Neo.mjs applications run and render faster. This is
29
+ particularly beneficial for processor- and data-intensive applications,
30
+ and applications that need to rapidly update what's viewed. In testing, Neo.mjs applications
31
+ easily apply over 20,000 DOM updates per second.
32
+ </p>
33
+ <p>
34
+ If the default four threads aren't enough, you're free to launch additional web-worker threads
35
+ to run other specialized logic.
36
+ </p>
37
+ </div>
38
+
39
+ <div type="expander" caption="Quick Application Development">
40
+ <p>
41
+ Neo.js classes let you specify properties in a way that allows code to detect "before" and "after"
42
+ changes. This makes it easy to handle value validation and transformation, and react to changes.
43
+ </p>
44
+ <p>
45
+ Neo.mjs also has elegant yet powerful state management features that make it easy to create shared,
46
+ bindable data. For example, if two components are bound to the same propery, a change to the
47
+ property will automatically be applied to both components.
48
+ </p>
49
+ </div>
50
+
51
+ <div type="expander" caption="Multi-Window Applications">
52
+ <p>
53
+ Neo.mjs applications can also launch as _shared web workers_, which allows you to have a single
54
+ application run in multiple browser windows; those windows could be moved to multiple monitors.
55
+ </p>
56
+ <p>
57
+ For example, you can have a data analysis application with a control panel on one monitor,
58
+ tabular data in another, and charts on another &mdash; all sharing the same data, handling events
59
+ across windows, running seamlessly as a single application.
60
+ </p>
61
+ </div>
62
+
63
+ <div type="expander" caption="Open-Source and Standards-Based">
64
+ <p>
65
+ Neo.mjs is an open-source library. Features needed for the community can be added to the
66
+ library via pull-requests. And since Neo.mjs uses the standard JavaScript class system,
67
+ all Neo.mjs classes can be extended.
68
+ </p>
69
+ <p>
70
+ Neo.mjs uses standard modular JavaScript, so developers don't need to learn non-standard language
71
+ syntax, and there's no need for special pre-compilers or WebPack modules.
72
+ That means fewer dependencies and easier configuration. Furthermore, the use of
73
+ standard JavaScript makes debugging easier: any statement you write while developing your
74
+ applcation can also be run in the debugging console.
75
+ </p>
76
+ </div>
@@ -0,0 +1,29 @@
1
+ .route {
2
+
3
+ background-color: white;
4
+
5
+ .route_center {
6
+
7
+ max-width: 95%;
8
+
9
+ margin-left: 20px;
10
+ margin-right: 20px;
11
+ margin-top: 0px;
12
+ margin-bottom: 10px;
13
+
14
+ border-top-width: .5px;
15
+ border-top-color: #757575;
16
+ border-top-style: solid;
17
+
18
+ border-bottom-width: .5px;
19
+ border-bottom-color: #757575;
20
+ border-bottom-style: solid;
21
+
22
+ .route_card_simple_page {
23
+ text-align: center;
24
+ }
25
+
26
+ }
27
+
28
+
29
+ }
@@ -0,0 +1,122 @@
1
+ .route {
2
+ .route_header {
3
+ height: 242px;
4
+ }
5
+
6
+ .center {
7
+ display: inline-block;
8
+ margin-left: auto;
9
+ margin-right: auto;
10
+ width: 50%;
11
+ }
12
+
13
+ .centerPanel {
14
+ margin-left: auto;
15
+ margin-right: auto;
16
+ width: auto;
17
+ min-height: 50px;
18
+ }
19
+
20
+ .headline-caption {
21
+ color: #535353;
22
+ font-family: 'Georgia', 'Times New Roman', serif;
23
+ font-size: 32px;
24
+ font-weight: normal;
25
+ text-align: center;
26
+ margin-top: 32px;
27
+ max-height: 70px;
28
+ }
29
+
30
+ .route_buttonbar {
31
+ min-height: 70px;
32
+ }
33
+
34
+ .route_button {
35
+ height: 50px;
36
+ min-width: 150px;
37
+ border: none;
38
+ margin-left: 10px;
39
+ float: left;
40
+
41
+ .neo-button-text {
42
+ color: #535353;
43
+ font-family: 'Georgia', 'Times New Roman', serif !important;
44
+ font-weight: normal;
45
+ font-size: 14px;
46
+ text-align: center;
47
+ text-transform: none;
48
+
49
+ }
50
+ }
51
+
52
+ .route_button_selected {
53
+ border-bottom: 1px;
54
+ border-bottom-style: solid;
55
+ border-bottom-left-radius: 0;
56
+ border-bottom-right-radius: 0;
57
+ }
58
+
59
+
60
+ .iconTischtennis {
61
+ background: url('../../../../../../resources/images/route/tischtennis_40.png');
62
+ background-position: 0 0;
63
+ background-repeat: no-repeat;
64
+ width: 32px;
65
+ height: 32px;
66
+
67
+ }
68
+
69
+ .iconFussball {
70
+ margin-top: 4px !important;
71
+ background: url('../../../../../../resources/images/route/fussball_38.png');
72
+ background-position: 0 0;
73
+ background-repeat: no-repeat;
74
+ background-size: 26px;
75
+ width: 32px;
76
+ height: 32px;
77
+
78
+ }
79
+
80
+ .iconLeichtathletik {
81
+ margin-top: 2px !important;
82
+ background: url('../../../../../../resources/images/route/leichtathletik_37.png');
83
+ background-position: 0 0;
84
+ background-repeat: no-repeat;
85
+ background-size: 30px;
86
+ width: 32px;
87
+ height: 32px;
88
+
89
+ }
90
+
91
+ .iconSchach {
92
+ background: url('../../../../../../resources/images/route/schach_17.png');
93
+ background-position: 0 0;
94
+ background-repeat: no-repeat;
95
+ width: 17px;
96
+ height: 28px;
97
+
98
+ }
99
+
100
+ .iconLogo {
101
+ margin-top: 2px !important;
102
+ background: url('../../../../../../resources/images/route/logo.jpg');
103
+ background-position: 0 0;
104
+ background-repeat: no-repeat;
105
+ background-size: 30px;
106
+ width: 32px;
107
+ height: 32px;
108
+
109
+ }
110
+
111
+ .iconBogen {
112
+ margin-top: 2px !important;
113
+ background: url('../../../../../../resources/images/route/bogen.png');
114
+ background-position: 0 0;
115
+ background-repeat: no-repeat;
116
+ background-size: 30px;
117
+ width: 32px;
118
+ height: 32px;
119
+
120
+ }
121
+
122
+ }
@@ -0,0 +1,3 @@
1
+ .route{
2
+ background-color: yellow;
3
+ }
@@ -0,0 +1,44 @@
1
+ .route {
2
+ .route_meta {
3
+ height: 100px !important;
4
+ margin: 5px;
5
+ padding: 25px;
6
+ border-style: solid;
7
+ }
8
+ .route_meta_center {
9
+ display: inline-block;
10
+ margin-left: auto;
11
+ margin-right: auto;
12
+ width: 50%;
13
+ }
14
+
15
+ .route_meta_color {
16
+ background-color: lightblue;
17
+ }
18
+
19
+ .route_meta_button_grant{
20
+ height: 50px;
21
+ min-width: 150px;
22
+ margin: 0px;
23
+ border: 0px;
24
+ float: left;
25
+ background-color: lightgreen;
26
+ margin-left: 5px;
27
+
28
+ }
29
+
30
+ .route_meta_button_grant_selected{
31
+ background-color: greenyellow !important;
32
+ }
33
+
34
+ .route_meta_button_remove{
35
+ height: 50px;
36
+ min-width: 150px;
37
+ margin: 0px;
38
+ border: 0px;
39
+ float: left;
40
+ background-color: lightcoral;
41
+ margin-left: 50px;
42
+ }
43
+
44
+ }
@@ -236,12 +236,12 @@ const DefaultConfig = {
236
236
  useVdomWorker: true,
237
237
  /**
238
238
  * buildScripts/injectPackageVersion.mjs will update this value
239
- * @default '6.8.3'
239
+ * @default '6.9.0'
240
240
  * @memberOf! module:Neo
241
241
  * @name config.version
242
242
  * @type String
243
243
  */
244
- version: '6.8.3'
244
+ version: '6.9.0'
245
245
  };
246
246
 
247
247
  Object.assign(DefaultConfig, {
package/src/Neo.mjs CHANGED
@@ -1,7 +1,19 @@
1
1
  import DefaultConfig from './DefaultConfig.mjs';
2
2
 
3
3
  const configSymbol = Symbol.for('configSymbol'),
4
- getSetCache = Symbol('getSetCache');
4
+ getSetCache = Symbol('getSetCache'),
5
+ typeDetector = {
6
+ function: (item) => {
7
+ if (item.prototype?.constructor.isClass) {
8
+ return 'NeoClass'
9
+ }
10
+ },
11
+ object: (item) => {
12
+ if (item.constructor.isClass && item instanceof Neo.core.Base) {
13
+ return 'NeoInstance'
14
+ }
15
+ }
16
+ };
5
17
 
6
18
  /**
7
19
  * The base module to enhance classes, create instances and the Neo namespace
@@ -375,7 +387,7 @@ Neo = globalThis.Neo = Object.assign({
375
387
  const value = source[key];
376
388
 
377
389
  if (Neo.typeOf(value) === 'Object') {
378
- target[key] = Neo.merge(target[key], value);
390
+ target[key] = Neo.merge(target[key] || {}, value);
379
391
  } else {
380
392
  target[key] = value;
381
393
  }
@@ -492,18 +504,7 @@ Neo = globalThis.Neo = Object.assign({
492
504
  return null
493
505
  }
494
506
 
495
- return {
496
- function: () => {
497
- if (item.prototype?.constructor.isClass) {
498
- return 'NeoClass'
499
- }
500
- },
501
- object: () => {
502
- if (item.constructor.isClass && item instanceof Neo.core.Base) {
503
- return 'NeoInstance'
504
- }
505
- }
506
- }[typeof item]?.() || item.constructor.name
507
+ return typeDetector[typeof item]?.(item) || item.constructor.name
507
508
  }
508
509
  }, Neo);
509
510