fluentd-ui 0.1.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.

Potentially problematic release.


This version of fluentd-ui might be problematic. Click here for more details.

Files changed (320) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +31 -0
  4. data/.rspec +1 -0
  5. data/ChangeLog +3 -0
  6. data/Gemfile +21 -0
  7. data/Gemfile.lock +247 -0
  8. data/Gemfile.production +3 -0
  9. data/README.md +53 -0
  10. data/Rakefile +8 -0
  11. data/app/assets/images/.keep +0 -0
  12. data/app/assets/javascripts/alert.js +51 -0
  13. data/app/assets/javascripts/application.js +22 -0
  14. data/app/assets/javascripts/nested_setting.js +41 -0
  15. data/app/assets/javascripts/setting_format.js +15 -0
  16. data/app/assets/javascripts/tutorial.js +58 -0
  17. data/app/assets/javascripts/vue/fluent_log.js +64 -0
  18. data/app/assets/javascripts/vue/in_tail_format.js +153 -0
  19. data/app/assets/javascripts/vue/treeview.js +97 -0
  20. data/app/assets/javascripts/vue_common.js +4 -0
  21. data/app/assets/stylesheets/application.css +18 -0
  22. data/app/assets/stylesheets/common.css.scss +152 -0
  23. data/app/controllers/api_controller.rb +37 -0
  24. data/app/controllers/application_controller.rb +110 -0
  25. data/app/controllers/concerns/.keep +0 -0
  26. data/app/controllers/fluentd/agents_controller.rb +35 -0
  27. data/app/controllers/fluentd/settings/in_syslog_controller.rb +34 -0
  28. data/app/controllers/fluentd/settings/in_tail_controller.rb +57 -0
  29. data/app/controllers/fluentd/settings/out_forward_controller.rb +42 -0
  30. data/app/controllers/fluentd/settings/out_mongo_controller.rb +36 -0
  31. data/app/controllers/fluentd/settings/out_s3_controller.rb +36 -0
  32. data/app/controllers/fluentd/settings/out_td_controller.rb +36 -0
  33. data/app/controllers/fluentd/settings_controller.rb +18 -0
  34. data/app/controllers/fluentd_controller.rb +62 -0
  35. data/app/controllers/misc_controller.rb +69 -0
  36. data/app/controllers/plugins_controller.rb +44 -0
  37. data/app/controllers/polling_controller.rb +20 -0
  38. data/app/controllers/sessions_controller.rb +45 -0
  39. data/app/controllers/tutorials_controller.rb +40 -0
  40. data/app/controllers/users_controller.rb +28 -0
  41. data/app/controllers/welcome_controller.rb +5 -0
  42. data/app/helpers/application_helper.rb +55 -0
  43. data/app/helpers/fluentd/settings_helper.rb +2 -0
  44. data/app/helpers/miscs_helper.rb +2 -0
  45. data/app/helpers/settings_helper.rb +43 -0
  46. data/app/mailers/.keep +0 -0
  47. data/app/models/.keep +0 -0
  48. data/app/models/concerns/.keep +0 -0
  49. data/app/models/fluentd.rb +178 -0
  50. data/app/models/fluentd/agent.rb +28 -0
  51. data/app/models/fluentd/agent/common.rb +76 -0
  52. data/app/models/fluentd/agent/configuration.rb +35 -0
  53. data/app/models/fluentd/agent/fluentd_gem.rb +104 -0
  54. data/app/models/fluentd/agent/local_common.rb +101 -0
  55. data/app/models/fluentd/agent/remote.rb +7 -0
  56. data/app/models/fluentd/agent/td_agent.rb +44 -0
  57. data/app/models/fluentd/api.rb +6 -0
  58. data/app/models/fluentd/api/http.rb +26 -0
  59. data/app/models/fluentd/setting.rb +4 -0
  60. data/app/models/fluentd/setting/common.rb +185 -0
  61. data/app/models/fluentd/setting/in_syslog.rb +16 -0
  62. data/app/models/fluentd/setting/in_tail.rb +107 -0
  63. data/app/models/fluentd/setting/out_forward.rb +70 -0
  64. data/app/models/fluentd/setting/out_mongo.rb +35 -0
  65. data/app/models/fluentd/setting/out_s3.rb +29 -0
  66. data/app/models/fluentd/setting/out_td.rb +26 -0
  67. data/app/models/plugin.rb +193 -0
  68. data/app/models/settings.rb +4 -0
  69. data/app/models/user.rb +52 -0
  70. data/app/views/fluentd/_form.html.haml +31 -0
  71. data/app/views/fluentd/edit.html.haml +3 -0
  72. data/app/views/fluentd/errors.html.haml +19 -0
  73. data/app/views/fluentd/log.html.haml +9 -0
  74. data/app/views/fluentd/new.html.haml +3 -0
  75. data/app/views/fluentd/settings/_form.html.haml +43 -0
  76. data/app/views/fluentd/settings/edit.html.haml +7 -0
  77. data/app/views/fluentd/settings/in_syslog/_form.html.haml +9 -0
  78. data/app/views/fluentd/settings/in_syslog/show.html.haml +6 -0
  79. data/app/views/fluentd/settings/in_tail/_form.html.haml +42 -0
  80. data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +19 -0
  81. data/app/views/fluentd/settings/in_tail/after_format.html.haml +10 -0
  82. data/app/views/fluentd/settings/in_tail/confirm.html.haml +13 -0
  83. data/app/views/fluentd/settings/in_tail/show.html.haml +5 -0
  84. data/app/views/fluentd/settings/out_forward/_form.html.haml +22 -0
  85. data/app/views/fluentd/settings/out_forward/show.html.haml +6 -0
  86. data/app/views/fluentd/settings/out_mongo/_form.html.haml +30 -0
  87. data/app/views/fluentd/settings/out_mongo/finish.html.haml +4 -0
  88. data/app/views/fluentd/settings/out_mongo/show.html.haml +6 -0
  89. data/app/views/fluentd/settings/out_s3/_form.html.haml +39 -0
  90. data/app/views/fluentd/settings/out_s3/show.html.haml +6 -0
  91. data/app/views/fluentd/settings/out_td/_form.html.haml +18 -0
  92. data/app/views/fluentd/settings/out_td/show.html.haml +6 -0
  93. data/app/views/fluentd/settings/show.html.haml +10 -0
  94. data/app/views/fluentd/settings/source_and_output.html.haml +45 -0
  95. data/app/views/fluentd/show.html.haml +60 -0
  96. data/app/views/layouts/application.html.erb +102 -0
  97. data/app/views/layouts/sign_in.html.erb +28 -0
  98. data/app/views/misc/information.html.haml +75 -0
  99. data/app/views/misc/update_fluentd_ui.html.haml +45 -0
  100. data/app/views/plugins/installed.html.haml +67 -0
  101. data/app/views/plugins/recommended.html.haml +59 -0
  102. data/app/views/plugins/updated.html.haml +29 -0
  103. data/app/views/sessions/new.html.haml +13 -0
  104. data/app/views/shared/_error.html.haml +3 -0
  105. data/app/views/shared/_flash.html.haml +10 -0
  106. data/app/views/shared/_fluentd_nav.html.haml +12 -0
  107. data/app/views/shared/_global_nav.html.erb +80 -0
  108. data/app/views/shared/_initial_setup.html.haml +13 -0
  109. data/app/views/shared/_modal.html.erb +25 -0
  110. data/app/views/shared/_setting_errors.html.haml +5 -0
  111. data/app/views/shared/vue/_fluent_log.html.erb +25 -0
  112. data/app/views/shared/vue/_in_tail_format.html.erb +53 -0
  113. data/app/views/shared/vue/_treeview.html.erb +30 -0
  114. data/app/views/tutorials/chapter1.html.erb +31 -0
  115. data/app/views/tutorials/chapter2.html.haml +12 -0
  116. data/app/views/tutorials/chapter3.html.haml +12 -0
  117. data/app/views/tutorials/chapter4.html.haml +12 -0
  118. data/app/views/tutorials/chapter5.html.haml +10 -0
  119. data/app/views/tutorials/index.html.haml +26 -0
  120. data/app/views/users/show.html.haml +22 -0
  121. data/app/workers/all_plugin_check_update.rb +14 -0
  122. data/app/workers/fluentd_ui_restart.rb +41 -0
  123. data/app/workers/fluentd_ui_update_check.rb +15 -0
  124. data/app/workers/gem_installer.rb +17 -0
  125. data/app/workers/gem_uninstaller.rb +15 -0
  126. data/app/workers/gem_update_check.rb +10 -0
  127. data/bin/bundle +3 -0
  128. data/bin/fluentd-ui +13 -0
  129. data/bin/fluentd-ui-restart +12 -0
  130. data/bin/rails +8 -0
  131. data/bin/rake +8 -0
  132. data/bin/spring +18 -0
  133. data/bower.json +10 -0
  134. data/circle.yml +8 -0
  135. data/config.ru +4 -0
  136. data/config/application.rb +48 -0
  137. data/config/application.yml +211 -0
  138. data/config/boot.rb +4 -0
  139. data/config/environment.rb +5 -0
  140. data/config/environments/development.rb +36 -0
  141. data/config/environments/production.rb +69 -0
  142. data/config/environments/test.rb +40 -0
  143. data/config/initializers/backtrace_silencers.rb +7 -0
  144. data/config/initializers/cookies_serializer.rb +3 -0
  145. data/config/initializers/filter_parameter_logging.rb +4 -0
  146. data/config/initializers/inflections.rb +16 -0
  147. data/config/initializers/mime_types.rb +4 -0
  148. data/config/initializers/prefetch_gem_updates.rb +1 -0
  149. data/config/initializers/session_store.rb +3 -0
  150. data/config/initializers/wrap_parameters.rb +14 -0
  151. data/config/locales/en.yml +204 -0
  152. data/config/locales/ja.yml +194 -0
  153. data/config/locales/translation_en.yml +255 -0
  154. data/config/locales/translation_ja.yml +255 -0
  155. data/config/locales/tutorial_en.yml +117 -0
  156. data/config/locales/tutorial_ja.yml +120 -0
  157. data/config/routes.rb +93 -0
  158. data/config/secrets.yml +22 -0
  159. data/db/schema.rb +0 -0
  160. data/db/seeds.rb +11 -0
  161. data/fluentd-ui-ss01.png +0 -0
  162. data/fluentd-ui-ss02.png +0 -0
  163. data/fluentd-ui-ss03.png +0 -0
  164. data/fluentd-ui-ss04.png +0 -0
  165. data/fluentd-ui-ss05.png +0 -0
  166. data/fluentd-ui.gemspec +46 -0
  167. data/lib/assets/.keep +0 -0
  168. data/lib/file_reverse_reader.rb +56 -0
  169. data/lib/fluentd-ui.rb +22 -0
  170. data/lib/fluentd-ui/command.rb +52 -0
  171. data/lib/fluentd-ui/version.rb +3 -0
  172. data/lib/grok_converter.rb +39 -0
  173. data/lib/regexp_preview.rb +48 -0
  174. data/lib/tasks/.keep +0 -0
  175. data/lib/treeview.rb +45 -0
  176. data/log/.keep +0 -0
  177. data/public/404.html +67 -0
  178. data/public/422.html +67 -0
  179. data/public/500.html +66 -0
  180. data/public/favicon.ico +0 -0
  181. data/public/fluentd-logo-right-text.png +0 -0
  182. data/public/fluentd-logo.png +0 -0
  183. data/public/fluentd.png +0 -0
  184. data/public/robots.txt +5 -0
  185. data/spec/controllers/plugins_controller_spec.rb +5 -0
  186. data/spec/controllers/polling_controller_spec.rb +5 -0
  187. data/spec/controllers/sessions_controller_spec.rb +5 -0
  188. data/spec/controllers/tutorials_controller_spec.rb +5 -0
  189. data/spec/factories/fluentd.rb +11 -0
  190. data/spec/factories/plugins.rb +8 -0
  191. data/spec/factories/user.rb +6 -0
  192. data/spec/features/fluentd/setting/out_forward_spec.rb +45 -0
  193. data/spec/features/fluentd/setting/out_td_spec.rb +35 -0
  194. data/spec/features/sessions_spec.rb +55 -0
  195. data/spec/features/shared_examples/login_required.rb +4 -0
  196. data/spec/features/users_spec.rb +9 -0
  197. data/spec/grok_converter_spec.rb +50 -0
  198. data/spec/lib/file_reverse_reader_spec.rb +73 -0
  199. data/spec/lib/fluentd-ui_spec.rb +35 -0
  200. data/spec/models/fluentd/agent_spec.rb +91 -0
  201. data/spec/models/fluentd/setting/common_spec.rb +178 -0
  202. data/spec/models/fluentd/setting/in_syslog_spec.rb +35 -0
  203. data/spec/models/fluentd/setting/out_mongo_spec.rb +40 -0
  204. data/spec/models/fluentd/setting/out_td_spec.rb +38 -0
  205. data/spec/models/fluentd_spec.rb +166 -0
  206. data/spec/models/plugin_spec.rb +191 -0
  207. data/spec/models/user_spec.rb +15 -0
  208. data/spec/spec_helper.rb +58 -0
  209. data/spec/support/fixtures/error0.log +12 -0
  210. data/spec/support/fixtures/error2.log +130 -0
  211. data/spec/support/fluentd_agent_common_behavior.rb +114 -0
  212. data/spec/support/fluentd_agent_restart_strategy.rb +94 -0
  213. data/tmp/.gitkeep +0 -0
  214. data/vendor/assets/javascripts/.keep +0 -0
  215. data/vendor/assets/javascripts/bower/es6-promise/.bower.json +15 -0
  216. data/vendor/assets/javascripts/bower/es6-promise/bower.json +5 -0
  217. data/vendor/assets/javascripts/bower/es6-promise/promise.js +684 -0
  218. data/vendor/assets/javascripts/bower/es6-promise/promise.min.js +1 -0
  219. data/vendor/assets/javascripts/bower/lodash/.bower.json +33 -0
  220. data/vendor/assets/javascripts/bower/lodash/LICENSE.txt +22 -0
  221. data/vendor/assets/javascripts/bower/lodash/bower.json +23 -0
  222. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.js +7157 -0
  223. data/vendor/assets/javascripts/bower/lodash/dist/lodash.compat.min.js +61 -0
  224. data/vendor/assets/javascripts/bower/lodash/dist/lodash.js +6785 -0
  225. data/vendor/assets/javascripts/bower/lodash/dist/lodash.min.js +56 -0
  226. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.js +4979 -0
  227. data/vendor/assets/javascripts/bower/lodash/dist/lodash.underscore.min.js +39 -0
  228. data/vendor/assets/javascripts/bower/vue/.bower.json +29 -0
  229. data/vendor/assets/javascripts/bower/vue/LICENSE +21 -0
  230. data/vendor/assets/javascripts/bower/vue/dist/vue.js +4713 -0
  231. data/vendor/assets/javascripts/bower/vue/dist/vue.min.js +7 -0
  232. data/vendor/assets/javascripts/bower/vue/src/batcher.js +45 -0
  233. data/vendor/assets/javascripts/bower/vue/src/binding.js +103 -0
  234. data/vendor/assets/javascripts/bower/vue/src/compiler.js +1037 -0
  235. data/vendor/assets/javascripts/bower/vue/src/config.js +19 -0
  236. data/vendor/assets/javascripts/bower/vue/src/deps-parser.js +65 -0
  237. data/vendor/assets/javascripts/bower/vue/src/directive.js +258 -0
  238. data/vendor/assets/javascripts/bower/vue/src/directives/html.js +41 -0
  239. data/vendor/assets/javascripts/bower/vue/src/directives/if.js +56 -0
  240. data/vendor/assets/javascripts/bower/vue/src/directives/index.js +129 -0
  241. data/vendor/assets/javascripts/bower/vue/src/directives/model.js +174 -0
  242. data/vendor/assets/javascripts/bower/vue/src/directives/on.js +56 -0
  243. data/vendor/assets/javascripts/bower/vue/src/directives/partial.js +50 -0
  244. data/vendor/assets/javascripts/bower/vue/src/directives/repeat.js +246 -0
  245. data/vendor/assets/javascripts/bower/vue/src/directives/style.js +40 -0
  246. data/vendor/assets/javascripts/bower/vue/src/directives/view.js +56 -0
  247. data/vendor/assets/javascripts/bower/vue/src/directives/with.js +50 -0
  248. data/vendor/assets/javascripts/bower/vue/src/emitter.js +97 -0
  249. data/vendor/assets/javascripts/bower/vue/src/exp-parser.js +190 -0
  250. data/vendor/assets/javascripts/bower/vue/src/filters.js +190 -0
  251. data/vendor/assets/javascripts/bower/vue/src/fragment.js +84 -0
  252. data/vendor/assets/javascripts/bower/vue/src/main.js +186 -0
  253. data/vendor/assets/javascripts/bower/vue/src/observer.js +446 -0
  254. data/vendor/assets/javascripts/bower/vue/src/text-parser.js +96 -0
  255. data/vendor/assets/javascripts/bower/vue/src/transition.js +228 -0
  256. data/vendor/assets/javascripts/bower/vue/src/utils.js +321 -0
  257. data/vendor/assets/javascripts/bower/vue/src/viewmodel.js +180 -0
  258. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.js +1951 -0
  259. data/vendor/assets/javascripts/sb-admin-v2/bootstrap.min.js +6 -0
  260. data/vendor/assets/javascripts/sb-admin-v2/demo/dashboard-demo.js +117 -0
  261. data/vendor/assets/javascripts/sb-admin-v2/demo/flot-demo.js +1242 -0
  262. data/vendor/assets/javascripts/sb-admin-v2/demo/morris-demo.js +155 -0
  263. data/vendor/assets/javascripts/sb-admin-v2/jquery-1.10.2.js +6 -0
  264. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.js +245 -0
  265. data/vendor/assets/javascripts/sb-admin-v2/plugins/dataTables/jquery.dataTables.js +14013 -0
  266. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/excanvas.min.js +1 -0
  267. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.js +2599 -0
  268. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.pie.js +750 -0
  269. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.resize.js +60 -0
  270. data/vendor/assets/javascripts/sb-admin-v2/plugins/flot/jquery.flot.tooltip.min.js +12 -0
  271. data/vendor/assets/javascripts/sb-admin-v2/plugins/metisMenu/jquery.metisMenu.js +45 -0
  272. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/morris.js +1888 -0
  273. data/vendor/assets/javascripts/sb-admin-v2/plugins/morris/raphael-2.1.0.min.js +10 -0
  274. data/vendor/assets/javascripts/sb-admin-v2/sb-admin.js +18 -0
  275. data/vendor/assets/stylesheets/.keep +0 -0
  276. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.css +5830 -0
  277. data/vendor/assets/stylesheets/sb-admin-v2/bootstrap.min.css +7 -0
  278. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.css +1338 -0
  279. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/css/font-awesome.min.css +4 -0
  280. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/FontAwesome.otf +0 -0
  281. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  282. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.svg +414 -0
  283. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  284. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  285. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_bordered-pulled.scss +16 -0
  286. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_core.scss +12 -0
  287. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_fixed-width.scss +6 -0
  288. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_icons.scss +412 -0
  289. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_larger.scss +13 -0
  290. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_list.scss +19 -0
  291. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_mixins.scss +20 -0
  292. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_path.scss +14 -0
  293. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_rotated-flipped.scss +9 -0
  294. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_spinning.scss +30 -0
  295. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_stacked.scss +20 -0
  296. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/_variables.scss +381 -0
  297. data/vendor/assets/stylesheets/sb-admin-v2/font-awesome/scss/font-awesome.scss +17 -0
  298. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.eot +0 -0
  299. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.svg +229 -0
  300. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.ttf +0 -0
  301. data/vendor/assets/stylesheets/sb-admin-v2/fonts/glyphicons-halflings-regular.woff +0 -0
  302. data/vendor/assets/stylesheets/sb-admin-v2/plugins/dataTables/dataTables.bootstrap.css +233 -0
  303. data/vendor/assets/stylesheets/sb-admin-v2/plugins/morris/morris-0.4.3.min.css +2 -0
  304. data/vendor/assets/stylesheets/sb-admin-v2/plugins/social-buttons/social-buttons.css +68 -0
  305. data/vendor/assets/stylesheets/sb-admin-v2/plugins/timeline/timeline.css +144 -0
  306. data/vendor/assets/stylesheets/sb-admin-v2/sb-admin.css +329 -0
  307. data/vendor/patterns/firewalls +60 -0
  308. data/vendor/patterns/grok-patterns +94 -0
  309. data/vendor/patterns/haproxy +37 -0
  310. data/vendor/patterns/java +3 -0
  311. data/vendor/patterns/junos +9 -0
  312. data/vendor/patterns/linux-syslog +16 -0
  313. data/vendor/patterns/mcollective +1 -0
  314. data/vendor/patterns/mcollective-patterns +4 -0
  315. data/vendor/patterns/mongodb +4 -0
  316. data/vendor/patterns/nagios +108 -0
  317. data/vendor/patterns/postgresql +3 -0
  318. data/vendor/patterns/redis +3 -0
  319. data/vendor/patterns/ruby +2 -0
  320. metadata +659 -0
@@ -0,0 +1,84 @@
1
+ // string -> DOM conversion
2
+ // wrappers originally from jQuery, scooped from component/domify
3
+ var map = {
4
+ legend : [1, '<fieldset>', '</fieldset>'],
5
+ tr : [2, '<table><tbody>', '</tbody></table>'],
6
+ col : [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
7
+ _default : [0, '', '']
8
+ }
9
+
10
+ map.td =
11
+ map.th = [3, '<table><tbody><tr>', '</tr></tbody></table>']
12
+
13
+ map.option =
14
+ map.optgroup = [1, '<select multiple="multiple">', '</select>']
15
+
16
+ map.thead =
17
+ map.tbody =
18
+ map.colgroup =
19
+ map.caption =
20
+ map.tfoot = [1, '<table>', '</table>']
21
+
22
+ map.text =
23
+ map.circle =
24
+ map.ellipse =
25
+ map.line =
26
+ map.path =
27
+ map.polygon =
28
+ map.polyline =
29
+ map.rect = [1, '<svg xmlns="http://www.w3.org/2000/svg" version="1.1">','</svg>']
30
+
31
+ var TAG_RE = /<([\w:]+)/
32
+
33
+ module.exports = function (template) {
34
+
35
+ if (typeof template !== 'string') {
36
+ return template
37
+ }
38
+
39
+ // template by ID
40
+ if (template.charAt(0) === '#') {
41
+ var templateNode = document.getElementById(template.slice(1))
42
+ if (!templateNode) return
43
+ // if its a template tag and the browser supports it,
44
+ // its content is already a document fragment!
45
+ if (templateNode.tagName === 'TEMPLATE' && templateNode.content) {
46
+ return templateNode.content
47
+ }
48
+ template = templateNode.innerHTML
49
+ }
50
+
51
+ var frag = document.createDocumentFragment(),
52
+ m = TAG_RE.exec(template)
53
+ // text only
54
+ if (!m) {
55
+ frag.appendChild(document.createTextNode(template))
56
+ return frag
57
+ }
58
+
59
+ var tag = m[1],
60
+ wrap = map[tag] || map._default,
61
+ depth = wrap[0],
62
+ prefix = wrap[1],
63
+ suffix = wrap[2],
64
+ node = document.createElement('div')
65
+
66
+ node.innerHTML = prefix + template.trim() + suffix
67
+ while (depth--) node = node.lastChild
68
+
69
+ // one element
70
+ if (node.firstChild === node.lastChild) {
71
+ frag.appendChild(node.firstChild)
72
+ return frag
73
+ }
74
+
75
+ // multiple nodes, return a fragment
76
+ var child
77
+ /* jshint boss: true */
78
+ while (child = node.firstChild) {
79
+ if (node.nodeType === 1) {
80
+ frag.appendChild(child)
81
+ }
82
+ }
83
+ return frag
84
+ }
@@ -0,0 +1,186 @@
1
+ var config = require('./config'),
2
+ ViewModel = require('./viewmodel'),
3
+ utils = require('./utils'),
4
+ makeHash = utils.hash,
5
+ assetTypes = ['directive', 'filter', 'partial', 'effect', 'component']
6
+
7
+ // require these so Browserify can catch them
8
+ // so they can be used in Vue.require
9
+ require('./observer')
10
+ require('./transition')
11
+
12
+ ViewModel.options = config.globalAssets = {
13
+ directives : require('./directives'),
14
+ filters : require('./filters'),
15
+ partials : makeHash(),
16
+ effects : makeHash(),
17
+ components : makeHash()
18
+ }
19
+
20
+ /**
21
+ * Expose asset registration methods
22
+ */
23
+ assetTypes.forEach(function (type) {
24
+ ViewModel[type] = function (id, value) {
25
+ var hash = this.options[type + 's']
26
+ if (!hash) {
27
+ hash = this.options[type + 's'] = makeHash()
28
+ }
29
+ if (!value) return hash[id]
30
+ if (type === 'partial') {
31
+ value = utils.toFragment(value)
32
+ } else if (type === 'component') {
33
+ value = utils.toConstructor(value)
34
+ } else if (type === 'filter') {
35
+ utils.checkFilter(value)
36
+ }
37
+ hash[id] = value
38
+ return this
39
+ }
40
+ })
41
+
42
+ /**
43
+ * Set config options
44
+ */
45
+ ViewModel.config = function (opts, val) {
46
+ if (typeof opts === 'string') {
47
+ if (val === undefined) {
48
+ return config[opts]
49
+ } else {
50
+ config[opts] = val
51
+ }
52
+ } else {
53
+ utils.extend(config, opts)
54
+ }
55
+ return this
56
+ }
57
+
58
+ /**
59
+ * Expose an interface for plugins
60
+ */
61
+ ViewModel.use = function (plugin) {
62
+ if (typeof plugin === 'string') {
63
+ try {
64
+ plugin = require(plugin)
65
+ } catch (e) {
66
+ utils.warn('Cannot find plugin: ' + plugin)
67
+ return
68
+ }
69
+ }
70
+
71
+ // additional parameters
72
+ var args = [].slice.call(arguments, 1)
73
+ args.unshift(this)
74
+
75
+ if (typeof plugin.install === 'function') {
76
+ plugin.install.apply(plugin, args)
77
+ } else {
78
+ plugin.apply(null, args)
79
+ }
80
+ return this
81
+ }
82
+
83
+ /**
84
+ * Expose internal modules for plugins
85
+ */
86
+ ViewModel.require = function (path) {
87
+ return require('./' + path)
88
+ }
89
+
90
+ ViewModel.extend = extend
91
+ ViewModel.nextTick = utils.nextTick
92
+
93
+ /**
94
+ * Expose the main ViewModel class
95
+ * and add extend method
96
+ */
97
+ function extend (options) {
98
+
99
+ var ParentVM = this
100
+
101
+ // extend data options need to be copied
102
+ // on instantiation
103
+ if (options.data) {
104
+ options.defaultData = options.data
105
+ delete options.data
106
+ }
107
+
108
+ // inherit options
109
+ // but only when the super class is not the native Vue.
110
+ if (ParentVM !== ViewModel) {
111
+ options = inheritOptions(options, ParentVM.options, true)
112
+ }
113
+ utils.processOptions(options)
114
+
115
+ var ExtendedVM = function (opts, asParent) {
116
+ if (!asParent) {
117
+ opts = inheritOptions(opts, options, true)
118
+ }
119
+ ParentVM.call(this, opts, true)
120
+ }
121
+
122
+ // inherit prototype props
123
+ var proto = ExtendedVM.prototype = Object.create(ParentVM.prototype)
124
+ utils.defProtected(proto, 'constructor', ExtendedVM)
125
+
126
+ // allow extended VM to be further extended
127
+ ExtendedVM.extend = extend
128
+ ExtendedVM.super = ParentVM
129
+ ExtendedVM.options = options
130
+
131
+ // allow extended VM to add its own assets
132
+ assetTypes.forEach(function (type) {
133
+ ExtendedVM[type] = ViewModel[type]
134
+ })
135
+
136
+ // allow extended VM to use plugins
137
+ ExtendedVM.use = ViewModel.use
138
+ ExtendedVM.require = ViewModel.require
139
+
140
+ return ExtendedVM
141
+ }
142
+
143
+ /**
144
+ * Inherit options
145
+ *
146
+ * For options such as `data`, `vms`, `directives`, 'partials',
147
+ * they should be further extended. However extending should only
148
+ * be done at top level.
149
+ *
150
+ * `proto` is an exception because it's handled directly on the
151
+ * prototype.
152
+ *
153
+ * `el` is an exception because it's not allowed as an
154
+ * extension option, but only as an instance option.
155
+ */
156
+ function inheritOptions (child, parent, topLevel) {
157
+ child = child || {}
158
+ if (!parent) return child
159
+ for (var key in parent) {
160
+ if (key === 'el') continue
161
+ var val = child[key],
162
+ parentVal = parent[key]
163
+ if (topLevel && typeof val === 'function' && parentVal) {
164
+ // merge hook functions into an array
165
+ child[key] = [val]
166
+ if (Array.isArray(parentVal)) {
167
+ child[key] = child[key].concat(parentVal)
168
+ } else {
169
+ child[key].push(parentVal)
170
+ }
171
+ } else if (
172
+ topLevel &&
173
+ (utils.isTrueObject(val) || utils.isTrueObject(parentVal))
174
+ && !(parentVal instanceof ViewModel)
175
+ ) {
176
+ // merge toplevel object options
177
+ child[key] = inheritOptions(val, parentVal)
178
+ } else if (val === undefined) {
179
+ // inherit if child doesn't override
180
+ child[key] = parentVal
181
+ }
182
+ }
183
+ return child
184
+ }
185
+
186
+ module.exports = ViewModel
@@ -0,0 +1,446 @@
1
+ /* jshint proto:true */
2
+
3
+ var Emitter = require('./emitter'),
4
+ utils = require('./utils'),
5
+ // cache methods
6
+ def = utils.defProtected,
7
+ isObject = utils.isObject,
8
+ isArray = Array.isArray,
9
+ hasOwn = ({}).hasOwnProperty,
10
+ oDef = Object.defineProperty,
11
+ slice = [].slice,
12
+ // fix for IE + __proto__ problem
13
+ // define methods as inenumerable if __proto__ is present,
14
+ // otherwise enumerable so we can loop through and manually
15
+ // attach to array instances
16
+ hasProto = ({}).__proto__
17
+
18
+ // Array Mutation Handlers & Augmentations ------------------------------------
19
+
20
+ // The proxy prototype to replace the __proto__ of
21
+ // an observed array
22
+ var ArrayProxy = Object.create(Array.prototype)
23
+
24
+ // intercept mutation methods
25
+ ;[
26
+ 'push',
27
+ 'pop',
28
+ 'shift',
29
+ 'unshift',
30
+ 'splice',
31
+ 'sort',
32
+ 'reverse'
33
+ ].forEach(watchMutation)
34
+
35
+ // Augment the ArrayProxy with convenience methods
36
+ def(ArrayProxy, '$set', function (index, data) {
37
+ return this.splice(index, 1, data)[0]
38
+ }, !hasProto)
39
+
40
+ def(ArrayProxy, '$remove', function (index) {
41
+ if (typeof index !== 'number') {
42
+ index = this.indexOf(index)
43
+ }
44
+ if (index > -1) {
45
+ return this.splice(index, 1)[0]
46
+ }
47
+ }, !hasProto)
48
+
49
+ /**
50
+ * Intercep a mutation event so we can emit the mutation info.
51
+ * we also analyze what elements are added/removed and link/unlink
52
+ * them with the parent Array.
53
+ */
54
+ function watchMutation (method) {
55
+ def(ArrayProxy, method, function () {
56
+
57
+ var args = slice.call(arguments),
58
+ result = Array.prototype[method].apply(this, args),
59
+ inserted, removed
60
+
61
+ // determine new / removed elements
62
+ if (method === 'push' || method === 'unshift') {
63
+ inserted = args
64
+ } else if (method === 'pop' || method === 'shift') {
65
+ removed = [result]
66
+ } else if (method === 'splice') {
67
+ inserted = args.slice(2)
68
+ removed = result
69
+ }
70
+
71
+ // link & unlink
72
+ linkArrayElements(this, inserted)
73
+ unlinkArrayElements(this, removed)
74
+
75
+ // emit the mutation event
76
+ this.__emitter__.emit('mutate', '', this, {
77
+ method : method,
78
+ args : args,
79
+ result : result,
80
+ inserted : inserted,
81
+ removed : removed
82
+ })
83
+
84
+ return result
85
+
86
+ }, !hasProto)
87
+ }
88
+
89
+ /**
90
+ * Link new elements to an Array, so when they change
91
+ * and emit events, the owner Array can be notified.
92
+ */
93
+ function linkArrayElements (arr, items) {
94
+ if (items) {
95
+ var i = items.length, item, owners
96
+ while (i--) {
97
+ item = items[i]
98
+ if (isWatchable(item)) {
99
+ // if object is not converted for observing
100
+ // convert it...
101
+ if (!item.__emitter__) {
102
+ convert(item)
103
+ watch(item)
104
+ }
105
+ owners = item.__emitter__.owners
106
+ if (owners.indexOf(arr) < 0) {
107
+ owners.push(arr)
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Unlink removed elements from the ex-owner Array.
116
+ */
117
+ function unlinkArrayElements (arr, items) {
118
+ if (items) {
119
+ var i = items.length, item
120
+ while (i--) {
121
+ item = items[i]
122
+ if (item && item.__emitter__) {
123
+ var owners = item.__emitter__.owners
124
+ if (owners) owners.splice(owners.indexOf(arr))
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ // Object add/delete key augmentation -----------------------------------------
131
+
132
+ var ObjProxy = Object.create(Object.prototype)
133
+
134
+ def(ObjProxy, '$add', function (key, val) {
135
+ if (hasOwn.call(this, key)) return
136
+ this[key] = val
137
+ convertKey(this, key, true)
138
+ }, !hasProto)
139
+
140
+ def(ObjProxy, '$delete', function (key) {
141
+ if (!(hasOwn.call(this, key))) return
142
+ // trigger set events
143
+ this[key] = undefined
144
+ delete this[key]
145
+ this.__emitter__.emit('delete', key)
146
+ }, !hasProto)
147
+
148
+ // Watch Helpers --------------------------------------------------------------
149
+
150
+ /**
151
+ * Check if a value is watchable
152
+ */
153
+ function isWatchable (obj) {
154
+ return typeof obj === 'object' && obj && !obj.$compiler
155
+ }
156
+
157
+ /**
158
+ * Convert an Object/Array to give it a change emitter.
159
+ */
160
+ function convert (obj) {
161
+ if (obj.__emitter__) return true
162
+ var emitter = new Emitter()
163
+ def(obj, '__emitter__', emitter)
164
+ emitter
165
+ .on('set', function (key, val, propagate) {
166
+ if (propagate) propagateChange(obj)
167
+ })
168
+ .on('mutate', function () {
169
+ propagateChange(obj)
170
+ })
171
+ emitter.values = utils.hash()
172
+ emitter.owners = []
173
+ return false
174
+ }
175
+
176
+ /**
177
+ * Propagate an array element's change to its owner arrays
178
+ */
179
+ function propagateChange (obj) {
180
+ var owners = obj.__emitter__.owners,
181
+ i = owners.length
182
+ while (i--) {
183
+ owners[i].__emitter__.emit('set', '', '', true)
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Watch target based on its type
189
+ */
190
+ function watch (obj) {
191
+ if (isArray(obj)) {
192
+ watchArray(obj)
193
+ } else {
194
+ watchObject(obj)
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Augment target objects with modified
200
+ * methods
201
+ */
202
+ function augment (target, src) {
203
+ if (hasProto) {
204
+ target.__proto__ = src
205
+ } else {
206
+ for (var key in src) {
207
+ def(target, key, src[key])
208
+ }
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Watch an Object, recursive.
214
+ */
215
+ function watchObject (obj) {
216
+ augment(obj, ObjProxy)
217
+ for (var key in obj) {
218
+ convertKey(obj, key)
219
+ }
220
+ }
221
+
222
+ /**
223
+ * Watch an Array, overload mutation methods
224
+ * and add augmentations by intercepting the prototype chain
225
+ */
226
+ function watchArray (arr) {
227
+ augment(arr, ArrayProxy)
228
+ linkArrayElements(arr, arr)
229
+ }
230
+
231
+ /**
232
+ * Define accessors for a property on an Object
233
+ * so it emits get/set events.
234
+ * Then watch the value itself.
235
+ */
236
+ function convertKey (obj, key, propagate) {
237
+ var keyPrefix = key.charAt(0)
238
+ if (keyPrefix === '$' || keyPrefix === '_') {
239
+ return
240
+ }
241
+ // emit set on bind
242
+ // this means when an object is observed it will emit
243
+ // a first batch of set events.
244
+ var emitter = obj.__emitter__,
245
+ values = emitter.values
246
+
247
+ init(obj[key], propagate)
248
+
249
+ oDef(obj, key, {
250
+ enumerable: true,
251
+ configurable: true,
252
+ get: function () {
253
+ var value = values[key]
254
+ // only emit get on tip values
255
+ if (pub.shouldGet) {
256
+ emitter.emit('get', key)
257
+ }
258
+ return value
259
+ },
260
+ set: function (newVal) {
261
+ var oldVal = values[key]
262
+ unobserve(oldVal, key, emitter)
263
+ copyPaths(newVal, oldVal)
264
+ // an immediate property should notify its parent
265
+ // to emit set for itself too
266
+ init(newVal, true)
267
+ }
268
+ })
269
+
270
+ function init (val, propagate) {
271
+ values[key] = val
272
+ emitter.emit('set', key, val, propagate)
273
+ if (isArray(val)) {
274
+ emitter.emit('set', key + '.length', val.length, propagate)
275
+ }
276
+ observe(val, key, emitter)
277
+ }
278
+ }
279
+
280
+ /**
281
+ * When a value that is already converted is
282
+ * observed again by another observer, we can skip
283
+ * the watch conversion and simply emit set event for
284
+ * all of its properties.
285
+ */
286
+ function emitSet (obj) {
287
+ var emitter = obj && obj.__emitter__
288
+ if (!emitter) return
289
+ if (isArray(obj)) {
290
+ emitter.emit('set', 'length', obj.length)
291
+ } else {
292
+ var key, val
293
+ for (key in obj) {
294
+ val = obj[key]
295
+ emitter.emit('set', key, val)
296
+ emitSet(val)
297
+ }
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Make sure all the paths in an old object exists
303
+ * in a new object.
304
+ * So when an object changes, all missing keys will
305
+ * emit a set event with undefined value.
306
+ */
307
+ function copyPaths (newObj, oldObj) {
308
+ if (!isObject(newObj) || !isObject(oldObj)) {
309
+ return
310
+ }
311
+ var path, oldVal, newVal
312
+ for (path in oldObj) {
313
+ if (!(hasOwn.call(newObj, path))) {
314
+ oldVal = oldObj[path]
315
+ if (isArray(oldVal)) {
316
+ newObj[path] = []
317
+ } else if (isObject(oldVal)) {
318
+ newVal = newObj[path] = {}
319
+ copyPaths(newVal, oldVal)
320
+ } else {
321
+ newObj[path] = undefined
322
+ }
323
+ }
324
+ }
325
+ }
326
+
327
+ /**
328
+ * walk along a path and make sure it can be accessed
329
+ * and enumerated in that object
330
+ */
331
+ function ensurePath (obj, key) {
332
+ var path = key.split('.'), sec
333
+ for (var i = 0, d = path.length - 1; i < d; i++) {
334
+ sec = path[i]
335
+ if (!obj[sec]) {
336
+ obj[sec] = {}
337
+ if (obj.__emitter__) convertKey(obj, sec)
338
+ }
339
+ obj = obj[sec]
340
+ }
341
+ if (isObject(obj)) {
342
+ sec = path[i]
343
+ if (!(hasOwn.call(obj, sec))) {
344
+ obj[sec] = undefined
345
+ if (obj.__emitter__) convertKey(obj, sec)
346
+ }
347
+ }
348
+ }
349
+
350
+ // Main API Methods -----------------------------------------------------------
351
+
352
+ /**
353
+ * Observe an object with a given path,
354
+ * and proxy get/set/mutate events to the provided observer.
355
+ */
356
+ function observe (obj, rawPath, observer) {
357
+
358
+ if (!isWatchable(obj)) return
359
+
360
+ var path = rawPath ? rawPath + '.' : '',
361
+ alreadyConverted = convert(obj),
362
+ emitter = obj.__emitter__
363
+
364
+ // setup proxy listeners on the parent observer.
365
+ // we need to keep reference to them so that they
366
+ // can be removed when the object is un-observed.
367
+ observer.proxies = observer.proxies || {}
368
+ var proxies = observer.proxies[path] = {
369
+ get: function (key) {
370
+ observer.emit('get', path + key)
371
+ },
372
+ set: function (key, val, propagate) {
373
+ if (key) observer.emit('set', path + key, val)
374
+ // also notify observer that the object itself changed
375
+ // but only do so when it's a immediate property. this
376
+ // avoids duplicate event firing.
377
+ if (rawPath && propagate) {
378
+ observer.emit('set', rawPath, obj, true)
379
+ }
380
+ },
381
+ mutate: function (key, val, mutation) {
382
+ // if the Array is a root value
383
+ // the key will be null
384
+ var fixedPath = key ? path + key : rawPath
385
+ observer.emit('mutate', fixedPath, val, mutation)
386
+ // also emit set for Array's length when it mutates
387
+ var m = mutation.method
388
+ if (m !== 'sort' && m !== 'reverse') {
389
+ observer.emit('set', fixedPath + '.length', val.length)
390
+ }
391
+ }
392
+ }
393
+
394
+ // attach the listeners to the child observer.
395
+ // now all the events will propagate upwards.
396
+ emitter
397
+ .on('get', proxies.get)
398
+ .on('set', proxies.set)
399
+ .on('mutate', proxies.mutate)
400
+
401
+ if (alreadyConverted) {
402
+ // for objects that have already been converted,
403
+ // emit set events for everything inside
404
+ emitSet(obj)
405
+ } else {
406
+ watch(obj)
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Cancel observation, turn off the listeners.
412
+ */
413
+ function unobserve (obj, path, observer) {
414
+
415
+ if (!obj || !obj.__emitter__) return
416
+
417
+ path = path ? path + '.' : ''
418
+ var proxies = observer.proxies[path]
419
+ if (!proxies) return
420
+
421
+ // turn off listeners
422
+ obj.__emitter__
423
+ .off('get', proxies.get)
424
+ .off('set', proxies.set)
425
+ .off('mutate', proxies.mutate)
426
+
427
+ // remove reference
428
+ observer.proxies[path] = null
429
+ }
430
+
431
+ // Expose API -----------------------------------------------------------------
432
+
433
+ var pub = module.exports = {
434
+
435
+ // whether to emit get events
436
+ // only enabled during dependency parsing
437
+ shouldGet : false,
438
+
439
+ observe : observe,
440
+ unobserve : unobserve,
441
+ ensurePath : ensurePath,
442
+ copyPaths : copyPaths,
443
+ watch : watch,
444
+ convert : convert,
445
+ convertKey : convertKey
446
+ }