fluid_cli 0.1.2

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 (329) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/dev.yml +5 -0
  4. data/exe/fluid +24 -0
  5. data/lib/fluid_cli/api.rb +135 -0
  6. data/lib/fluid_cli/assets/post_auth_page/index.html.erb +34 -0
  7. data/lib/fluid_cli/assets/post_auth_page/style.css +58 -0
  8. data/lib/fluid_cli/command.rb +55 -0
  9. data/lib/fluid_cli/commands/help.rb +21 -0
  10. data/lib/fluid_cli/commands/login.rb +30 -0
  11. data/lib/fluid_cli/commands/logout.rb +38 -0
  12. data/lib/fluid_cli/commands/switch.rb +23 -0
  13. data/lib/fluid_cli/commands/theme/common/company_helper.rb +15 -0
  14. data/lib/fluid_cli/commands/theme/common/root_helper.rb +95 -0
  15. data/lib/fluid_cli/commands/theme/dev.rb +61 -0
  16. data/lib/fluid_cli/commands/theme/help.rb +21 -0
  17. data/lib/fluid_cli/commands/theme/init.rb +46 -0
  18. data/lib/fluid_cli/commands/theme/pull.rb +68 -0
  19. data/lib/fluid_cli/commands/theme/push.rb +132 -0
  20. data/lib/fluid_cli/commands/theme.rb +23 -0
  21. data/lib/fluid_cli/commands/whoami.rb +23 -0
  22. data/lib/fluid_cli/commands.rb +19 -0
  23. data/lib/fluid_cli/company_switcher.rb +69 -0
  24. data/lib/fluid_cli/context.rb +691 -0
  25. data/lib/fluid_cli/db.rb +114 -0
  26. data/lib/fluid_cli/entry_point.rb +10 -0
  27. data/lib/fluid_cli/environment.rb +32 -0
  28. data/lib/fluid_cli/file_system_listener.rb +29 -0
  29. data/lib/fluid_cli/form.rb +42 -0
  30. data/lib/fluid_cli/git.rb +319 -0
  31. data/lib/fluid_cli/http_request.rb +54 -0
  32. data/lib/fluid_cli/identity_auth/servlet.rb +39 -0
  33. data/lib/fluid_cli/identity_auth.rb +126 -0
  34. data/lib/fluid_cli/options.rb +38 -0
  35. data/lib/fluid_cli/theme/dev_server/certificate_manager.rb +79 -0
  36. data/lib/fluid_cli/theme/dev_server/errors.rb +9 -0
  37. data/lib/fluid_cli/theme/dev_server/header_hash.rb +98 -0
  38. data/lib/fluid_cli/theme/dev_server/hooks/file_change_hook.rb +39 -0
  39. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot-reload-no-script.html +27 -0
  40. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/hot_reload.js +28 -0
  41. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/sse_client.js +43 -0
  42. data/lib/fluid_cli/theme/dev_server/hot_reload/resources/theme.js +16 -0
  43. data/lib/fluid_cli/theme/dev_server/hot_reload/script_injector.rb +54 -0
  44. data/lib/fluid_cli/theme/dev_server/hot_reload.rb +75 -0
  45. data/lib/fluid_cli/theme/dev_server/local_assets.rb +92 -0
  46. data/lib/fluid_cli/theme/dev_server/proxy.rb +235 -0
  47. data/lib/fluid_cli/theme/dev_server/proxy_param_builder.rb +82 -0
  48. data/lib/fluid_cli/theme/dev_server/reload_mode.rb +34 -0
  49. data/lib/fluid_cli/theme/dev_server/sse.rb +75 -0
  50. data/lib/fluid_cli/theme/dev_server/watcher.rb +57 -0
  51. data/lib/fluid_cli/theme/dev_server/web_server.rb +140 -0
  52. data/lib/fluid_cli/theme/dev_server.rb +289 -0
  53. data/lib/fluid_cli/theme/development_theme.rb +101 -0
  54. data/lib/fluid_cli/theme/file.rb +105 -0
  55. data/lib/fluid_cli/theme/forms/select.rb +33 -0
  56. data/lib/fluid_cli/theme/mime_type.rb +34 -0
  57. data/lib/fluid_cli/theme/presenters/theme_presenter.rb +49 -0
  58. data/lib/fluid_cli/theme/presenters/themes_presenter.rb +31 -0
  59. data/lib/fluid_cli/theme/root.rb +62 -0
  60. data/lib/fluid_cli/theme/syncer/checksums.rb +66 -0
  61. data/lib/fluid_cli/theme/syncer/downloader.rb +54 -0
  62. data/lib/fluid_cli/theme/syncer/error_reporter.rb +45 -0
  63. data/lib/fluid_cli/theme/syncer/merger.rb +53 -0
  64. data/lib/fluid_cli/theme/syncer/operation.rb +58 -0
  65. data/lib/fluid_cli/theme/syncer/standard_reporter.rb +32 -0
  66. data/lib/fluid_cli/theme/syncer/unsupported_script_warning.rb +90 -0
  67. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all.rb +41 -0
  68. data/lib/fluid_cli/theme/syncer/uploader/forms/apply_to_all_form.rb +37 -0
  69. data/lib/fluid_cli/theme/syncer/uploader/forms/base_strategy_form.rb +64 -0
  70. data/lib/fluid_cli/theme/syncer/uploader/forms/select_delete_strategy.rb +29 -0
  71. data/lib/fluid_cli/theme/syncer/uploader/forms/select_update_strategy.rb +30 -0
  72. data/lib/fluid_cli/theme/syncer/uploader/json_delete_handler.rb +49 -0
  73. data/lib/fluid_cli/theme/syncer/uploader/json_update_handler.rb +71 -0
  74. data/lib/fluid_cli/theme/syncer/uploader.rb +105 -0
  75. data/lib/fluid_cli/theme/syncer.rb +412 -0
  76. data/lib/fluid_cli/theme/theme.rb +186 -0
  77. data/lib/fluid_cli/theme/ui/sync_progress_bar.rb +22 -0
  78. data/lib/fluid_cli/thread_pool/job.rb +35 -0
  79. data/lib/fluid_cli/thread_pool.rb +49 -0
  80. data/lib/fluid_cli/version.rb +3 -0
  81. data/lib/fluid_cli.rb +59 -0
  82. data/vendor/deps/base64/.document +5 -0
  83. data/vendor/deps/base64/.gitignore +9 -0
  84. data/vendor/deps/base64/BSDL +22 -0
  85. data/vendor/deps/base64/COPYING +56 -0
  86. data/vendor/deps/base64/Gemfile +9 -0
  87. data/vendor/deps/base64/LEGAL +60 -0
  88. data/vendor/deps/base64/README.md +48 -0
  89. data/vendor/deps/base64/Rakefile +31 -0
  90. data/vendor/deps/base64/base64.gemspec +28 -0
  91. data/vendor/deps/base64/bin/console +14 -0
  92. data/vendor/deps/base64/bin/setup +8 -0
  93. data/vendor/deps/base64/lib/base64.rb +382 -0
  94. data/vendor/deps/base64/sig/base64.rbs +358 -0
  95. data/vendor/deps/base64/test/base64/test_base64.rb +115 -0
  96. data/vendor/deps/base64/test_sig/test_base64.rb +44 -0
  97. data/vendor/deps/cli-kit/REVISION +1 -0
  98. data/vendor/deps/cli-kit/lib/cli/kit/args/definition.rb +286 -0
  99. data/vendor/deps/cli-kit/lib/cli/kit/args/evaluation.rb +215 -0
  100. data/vendor/deps/cli-kit/lib/cli/kit/args/parser/node.rb +128 -0
  101. data/vendor/deps/cli-kit/lib/cli/kit/args/parser.rb +125 -0
  102. data/vendor/deps/cli-kit/lib/cli/kit/args/tokenizer.rb +130 -0
  103. data/vendor/deps/cli-kit/lib/cli/kit/args.rb +16 -0
  104. data/vendor/deps/cli-kit/lib/cli/kit/base_command.rb +30 -0
  105. data/vendor/deps/cli-kit/lib/cli/kit/command_help.rb +268 -0
  106. data/vendor/deps/cli-kit/lib/cli/kit/command_registry.rb +150 -0
  107. data/vendor/deps/cli-kit/lib/cli/kit/config.rb +137 -0
  108. data/vendor/deps/cli-kit/lib/cli/kit/core_ext.rb +28 -0
  109. data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +166 -0
  110. data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +92 -0
  111. data/vendor/deps/cli-kit/lib/cli/kit/ini.rb +91 -0
  112. data/vendor/deps/cli-kit/lib/cli/kit/levenshtein.rb +92 -0
  113. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +94 -0
  114. data/vendor/deps/cli-kit/lib/cli/kit/opts.rb +248 -0
  115. data/vendor/deps/cli-kit/lib/cli/kit/parse_args.rb +55 -0
  116. data/vendor/deps/cli-kit/lib/cli/kit/resolver.rb +66 -0
  117. data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +260 -0
  118. data/vendor/deps/cli-kit/lib/cli/kit/support.rb +11 -0
  119. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +290 -0
  120. data/vendor/deps/cli-kit/lib/cli/kit/util.rb +118 -0
  121. data/vendor/deps/cli-kit/lib/cli/kit/version.rb +7 -0
  122. data/vendor/deps/cli-kit/lib/cli/kit.rb +139 -0
  123. data/vendor/deps/cli-ui/REVISION +1 -0
  124. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +218 -0
  125. data/vendor/deps/cli-ui/lib/cli/ui/color.rb +101 -0
  126. data/vendor/deps/cli-ui/lib/cli/ui/formatter.rb +219 -0
  127. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +67 -0
  128. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +179 -0
  129. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +152 -0
  130. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +127 -0
  131. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +286 -0
  132. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +92 -0
  133. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
  134. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +64 -0
  135. data/vendor/deps/cli-ui/lib/cli/ui/progress.rb +132 -0
  136. data/vendor/deps/cli-ui/lib/cli/ui/progress_reporter.rb +209 -0
  137. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +583 -0
  138. data/vendor/deps/cli-ui/lib/cli/ui/prompt/options_handler.rb +36 -0
  139. data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +381 -0
  140. data/vendor/deps/cli-ui/lib/cli/ui/spinner/async.rb +48 -0
  141. data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +602 -0
  142. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +79 -0
  143. data/vendor/deps/cli-ui/lib/cli/ui/stdout_router.rb +399 -0
  144. data/vendor/deps/cli-ui/lib/cli/ui/table.rb +83 -0
  145. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +55 -0
  146. data/vendor/deps/cli-ui/lib/cli/ui/truncater.rb +106 -0
  147. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +8 -0
  148. data/vendor/deps/cli-ui/lib/cli/ui/widgets/base.rb +46 -0
  149. data/vendor/deps/cli-ui/lib/cli/ui/widgets/status.rb +79 -0
  150. data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +89 -0
  151. data/vendor/deps/cli-ui/lib/cli/ui/work_queue.rb +142 -0
  152. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +61 -0
  153. data/vendor/deps/cli-ui/lib/cli/ui.rb +359 -0
  154. data/vendor/deps/cli-ui/vendor/reentrant_mutex.rb +78 -0
  155. data/vendor/deps/debug/CONTRIBUTING.md +573 -0
  156. data/vendor/deps/debug/Gemfile +10 -0
  157. data/vendor/deps/debug/LICENSE.txt +22 -0
  158. data/vendor/deps/debug/README.md +996 -0
  159. data/vendor/deps/debug/Rakefile +57 -0
  160. data/vendor/deps/debug/TODO.md +23 -0
  161. data/vendor/deps/debug/debug.gemspec +33 -0
  162. data/vendor/deps/debug/exe/rdbg +53 -0
  163. data/vendor/deps/debug/ext/debug/Makefile +273 -0
  164. data/vendor/deps/debug/ext/debug/debug.c +228 -0
  165. data/vendor/deps/debug/ext/debug/debug_version.h +1 -0
  166. data/vendor/deps/debug/ext/debug/extconf.rb +27 -0
  167. data/vendor/deps/debug/ext/debug/iseq_collector.c +93 -0
  168. data/vendor/deps/debug/lib/debug/abbrev_command.rb +77 -0
  169. data/vendor/deps/debug/lib/debug/breakpoint.rb +556 -0
  170. data/vendor/deps/debug/lib/debug/client.rb +263 -0
  171. data/vendor/deps/debug/lib/debug/color.rb +123 -0
  172. data/vendor/deps/debug/lib/debug/config.rb +592 -0
  173. data/vendor/deps/debug/lib/debug/console.rb +224 -0
  174. data/vendor/deps/debug/lib/debug/dap_custom/traceInspector.rb +336 -0
  175. data/vendor/deps/debug/lib/debug/debug.bundle +0 -0
  176. data/vendor/deps/debug/lib/debug/frame_info.rb +190 -0
  177. data/vendor/deps/debug/lib/debug/irb_integration.rb +37 -0
  178. data/vendor/deps/debug/lib/debug/local.rb +115 -0
  179. data/vendor/deps/debug/lib/debug/open.rb +13 -0
  180. data/vendor/deps/debug/lib/debug/open_nonstop.rb +15 -0
  181. data/vendor/deps/debug/lib/debug/prelude.rb +50 -0
  182. data/vendor/deps/debug/lib/debug/server.rb +534 -0
  183. data/vendor/deps/debug/lib/debug/server_cdp.rb +1348 -0
  184. data/vendor/deps/debug/lib/debug/server_dap.rb +1108 -0
  185. data/vendor/deps/debug/lib/debug/session.rb +2667 -0
  186. data/vendor/deps/debug/lib/debug/source_repository.rb +150 -0
  187. data/vendor/deps/debug/lib/debug/start.rb +5 -0
  188. data/vendor/deps/debug/lib/debug/thread_client.rb +1457 -0
  189. data/vendor/deps/debug/lib/debug/tracer.rb +241 -0
  190. data/vendor/deps/debug/lib/debug/version.rb +5 -0
  191. data/vendor/deps/debug/lib/debug.rb +9 -0
  192. data/vendor/deps/debug/misc/README.md.erb +660 -0
  193. data/vendor/deps/listen/.github/release-drafter.yml +17 -0
  194. data/vendor/deps/listen/.github/workflows/development.yml +67 -0
  195. data/vendor/deps/listen/.github/workflows/push.yml +12 -0
  196. data/vendor/deps/listen/.gitignore +28 -0
  197. data/vendor/deps/listen/.rspec +3 -0
  198. data/vendor/deps/listen/.rubocop.yml +283 -0
  199. data/vendor/deps/listen/.yardopts +11 -0
  200. data/vendor/deps/listen/CHANGELOG.md +1 -0
  201. data/vendor/deps/listen/CONTRIBUTING.md +45 -0
  202. data/vendor/deps/listen/Gemfile +33 -0
  203. data/vendor/deps/listen/Guardfile +26 -0
  204. data/vendor/deps/listen/LICENSE.txt +22 -0
  205. data/vendor/deps/listen/README.md +490 -0
  206. data/vendor/deps/listen/Rakefile +154 -0
  207. data/vendor/deps/listen/bin/listen +11 -0
  208. data/vendor/deps/listen/lib/listen/adapter/base.rb +129 -0
  209. data/vendor/deps/listen/lib/listen/adapter/bsd.rb +104 -0
  210. data/vendor/deps/listen/lib/listen/adapter/config.rb +31 -0
  211. data/vendor/deps/listen/lib/listen/adapter/darwin.rb +77 -0
  212. data/vendor/deps/listen/lib/listen/adapter/linux.rb +108 -0
  213. data/vendor/deps/listen/lib/listen/adapter/polling.rb +40 -0
  214. data/vendor/deps/listen/lib/listen/adapter/windows.rb +96 -0
  215. data/vendor/deps/listen/lib/listen/adapter.rb +43 -0
  216. data/vendor/deps/listen/lib/listen/backend.rb +40 -0
  217. data/vendor/deps/listen/lib/listen/change.rb +69 -0
  218. data/vendor/deps/listen/lib/listen/cli.rb +65 -0
  219. data/vendor/deps/listen/lib/listen/directory.rb +93 -0
  220. data/vendor/deps/listen/lib/listen/error.rb +11 -0
  221. data/vendor/deps/listen/lib/listen/event/config.rb +39 -0
  222. data/vendor/deps/listen/lib/listen/event/loop.rb +92 -0
  223. data/vendor/deps/listen/lib/listen/event/processor.rb +128 -0
  224. data/vendor/deps/listen/lib/listen/event/queue.rb +52 -0
  225. data/vendor/deps/listen/lib/listen/file.rb +95 -0
  226. data/vendor/deps/listen/lib/listen/fsm.rb +131 -0
  227. data/vendor/deps/listen/lib/listen/listener/config.rb +41 -0
  228. data/vendor/deps/listen/lib/listen/listener.rb +136 -0
  229. data/vendor/deps/listen/lib/listen/logger.rb +65 -0
  230. data/vendor/deps/listen/lib/listen/monotonic_time.rb +27 -0
  231. data/vendor/deps/listen/lib/listen/options.rb +24 -0
  232. data/vendor/deps/listen/lib/listen/queue_optimizer.rb +129 -0
  233. data/vendor/deps/listen/lib/listen/record/entry.rb +66 -0
  234. data/vendor/deps/listen/lib/listen/record/symlink_detector.rb +47 -0
  235. data/vendor/deps/listen/lib/listen/record.rb +122 -0
  236. data/vendor/deps/listen/lib/listen/silencer/controller.rb +50 -0
  237. data/vendor/deps/listen/lib/listen/silencer.rb +106 -0
  238. data/vendor/deps/listen/lib/listen/thread.rb +54 -0
  239. data/vendor/deps/listen/lib/listen/version.rb +5 -0
  240. data/vendor/deps/listen/lib/listen.rb +47 -0
  241. data/vendor/deps/listen/listen.gemspec +40 -0
  242. data/vendor/deps/listen/spec/acceptance/listen_spec.rb +320 -0
  243. data/vendor/deps/listen/spec/lib/listen/adapter/base_spec.rb +101 -0
  244. data/vendor/deps/listen/spec/lib/listen/adapter/bsd_spec.rb +13 -0
  245. data/vendor/deps/listen/spec/lib/listen/adapter/config_spec.rb +122 -0
  246. data/vendor/deps/listen/spec/lib/listen/adapter/darwin_spec.rb +82 -0
  247. data/vendor/deps/listen/spec/lib/listen/adapter/linux_spec.rb +199 -0
  248. data/vendor/deps/listen/spec/lib/listen/adapter/polling_spec.rb +83 -0
  249. data/vendor/deps/listen/spec/lib/listen/adapter/windows_spec.rb +13 -0
  250. data/vendor/deps/listen/spec/lib/listen/adapter_spec.rb +69 -0
  251. data/vendor/deps/listen/spec/lib/listen/backend_spec.rb +82 -0
  252. data/vendor/deps/listen/spec/lib/listen/change_spec.rb +102 -0
  253. data/vendor/deps/listen/spec/lib/listen/cli_spec.rb +116 -0
  254. data/vendor/deps/listen/spec/lib/listen/directory_spec.rb +284 -0
  255. data/vendor/deps/listen/spec/lib/listen/event/config_spec.rb +33 -0
  256. data/vendor/deps/listen/spec/lib/listen/event/loop_spec.rb +118 -0
  257. data/vendor/deps/listen/spec/lib/listen/event/processor_spec.rb +250 -0
  258. data/vendor/deps/listen/spec/lib/listen/event/queue_spec.rb +118 -0
  259. data/vendor/deps/listen/spec/lib/listen/file_spec.rb +254 -0
  260. data/vendor/deps/listen/spec/lib/listen/fsm_spec.rb +147 -0
  261. data/vendor/deps/listen/spec/lib/listen/listener/config_spec.rb +29 -0
  262. data/vendor/deps/listen/spec/lib/listen/listener_spec.rb +321 -0
  263. data/vendor/deps/listen/spec/lib/listen/logger_spec.rb +212 -0
  264. data/vendor/deps/listen/spec/lib/listen/monotonic_time_spec.rb +58 -0
  265. data/vendor/deps/listen/spec/lib/listen/queue_optimizer_spec.rb +111 -0
  266. data/vendor/deps/listen/spec/lib/listen/record_spec.rb +424 -0
  267. data/vendor/deps/listen/spec/lib/listen/silencer/controller_spec.rb +97 -0
  268. data/vendor/deps/listen/spec/lib/listen/silencer_spec.rb +109 -0
  269. data/vendor/deps/listen/spec/lib/listen/thread_spec.rb +133 -0
  270. data/vendor/deps/listen/spec/lib/listen_spec.rb +25 -0
  271. data/vendor/deps/listen/spec/spec_helper.rb +49 -0
  272. data/vendor/deps/listen/spec/support/acceptance_helper.rb +260 -0
  273. data/vendor/deps/listen/spec/support/fixtures_helper.rb +32 -0
  274. data/vendor/deps/listen/spec/support/platform_helper.rb +17 -0
  275. data/vendor/deps/observer/.github/dependabot.yml +6 -0
  276. data/vendor/deps/observer/.github/workflows/test.yml +33 -0
  277. data/vendor/deps/observer/.gitignore +8 -0
  278. data/vendor/deps/observer/BSDL +22 -0
  279. data/vendor/deps/observer/COPYING +56 -0
  280. data/vendor/deps/observer/Gemfile +9 -0
  281. data/vendor/deps/observer/README.md +139 -0
  282. data/vendor/deps/observer/Rakefile +10 -0
  283. data/vendor/deps/observer/bin/console +14 -0
  284. data/vendor/deps/observer/bin/setup +8 -0
  285. data/vendor/deps/observer/lib/observer.rb +229 -0
  286. data/vendor/deps/observer/observer.gemspec +32 -0
  287. data/vendor/deps/observer/test/test_observer.rb +66 -0
  288. data/vendor/deps/webrick/.gitignore +9 -0
  289. data/vendor/deps/webrick/Gemfile +3 -0
  290. data/vendor/deps/webrick/LICENSE.txt +22 -0
  291. data/vendor/deps/webrick/README.md +61 -0
  292. data/vendor/deps/webrick/Rakefile +10 -0
  293. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  294. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  295. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  296. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  297. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  298. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  299. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  300. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  301. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  302. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  303. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  304. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  305. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  306. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  307. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  308. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  309. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  310. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  311. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  312. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  313. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  314. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  315. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  316. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  317. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  318. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  319. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  320. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  321. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  322. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  323. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  324. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  325. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  326. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  327. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  328. data/vendor/deps/webrick/webrick.gemspec +74 -0
  329. metadata +412 -0
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "webrick"
4
+ require "stringio"
5
+
6
+ module FluidCLI
7
+ module Theme
8
+ class DevServer
9
+ # WEBrick will sometimes cause a fatal deadlock error on shutdown.
10
+ # The error happens because `Thread#join` is called without a timeout argument.
11
+ # We monkey-patch WEBrick to call `Thread#join(timeout)` before the existing
12
+ # `Thread#join`.
13
+ module WEBrickGenericServerThreadJoinWithTimeout
14
+ # Hook into a method called right before the threads are shutdown.
15
+ def cleanup_listener
16
+ # Force a Thread#join with a timeout to prevent any deadlock error on stop
17
+ Thread.list.each do |thread|
18
+ next unless thread[:WEBrickThread]
19
+ thread.join(2)
20
+ # Prevent the `join` call without a timeout inside WEBrick.
21
+ thread[:WEBrickThread] = false
22
+ end
23
+ super
24
+ end
25
+ end
26
+
27
+ # Base on Rack::Handler::WEBrick
28
+ class WebServer < ::WEBrick::HTTPServlet::AbstractServlet
29
+ def self.run(app, **options)
30
+ environment = ENV["RACK_ENV"] || "development"
31
+ default_host = environment == "development" ? "localhost" : nil
32
+
33
+ if !options[:BindAddress] || options[:Host]
34
+ options[:BindAddress] = options.delete(:Host) || default_host
35
+ end
36
+ options[:Port] ||= 8080
37
+ if options[:SSLEnable]
38
+ require "webrick/https"
39
+ end
40
+
41
+ @server = ::WEBrick::HTTPServer.new(options)
42
+ @server.extend(WEBrickGenericServerThreadJoinWithTimeout)
43
+ @server.mount("/", WebServer, app)
44
+ yield @server if block_given?
45
+ @server.start
46
+ end
47
+
48
+ def self.valid_options
49
+ environment = ENV["RACK_ENV"] || "development"
50
+ default_host = environment == "development" ? "localhost" : "0.0.0.0"
51
+
52
+ {
53
+ "Host=HOST" => "Hostname to listen on (default: #{default_host})",
54
+ "Port=PORT" => "Port to listen on (default: 8080)",
55
+ }
56
+ end
57
+
58
+ def self.shutdown
59
+ if @server
60
+ @server.shutdown
61
+ @server = nil
62
+ end
63
+ end
64
+
65
+ def initialize(server, app)
66
+ super(server)
67
+ @app = app
68
+ end
69
+
70
+ def service(req, res)
71
+ # res.rack = true
72
+ env = req.meta_vars
73
+ env.delete_if { |_k, v| v.nil? }
74
+
75
+ rack_input = StringIO.new(req.body.to_s)
76
+ rack_input.set_encoding(Encoding::BINARY)
77
+
78
+ env.update(
79
+ "rack.version" => [1, 3],
80
+ "rack.input" => rack_input,
81
+ "rack.errors" => $stderr,
82
+ "rack.multithread" => true,
83
+ "rack.multiprocess" => false,
84
+ "rack.run_once" => false,
85
+ "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http",
86
+ "rack.hijack?" => true,
87
+ "rack.hijack" => lambda { raise NotImplementedError, "only partial hijack is supported." },
88
+ "rack.hijack_io" => nil
89
+ )
90
+
91
+ env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
92
+ env["QUERY_STRING"] ||= ""
93
+ unless env["PATH_INFO"] == ""
94
+ path = req.request_uri.path
95
+ n = env["SCRIPT_NAME"].length
96
+ env["PATH_INFO"] = path[n, path.length - n]
97
+ end
98
+ env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env["PATH_INFO"]].join
99
+
100
+ status, headers, body = @app.call(env)
101
+
102
+ res.status = status.to_i
103
+ io_lambda = nil
104
+ headers.each do |k, vs|
105
+ if k == "rack.hijack"
106
+ io_lambda = vs
107
+ elsif k == "webrick.chunked"
108
+ res.chunked = true
109
+ elsif k.downcase == "set-cookie"
110
+ res.cookies.concat(vs.split("\n"))
111
+ else
112
+ # Since WEBrick won't accept repeated headers,
113
+ # merge the values per RFC 1945 section 4.2.
114
+ res[k] = vs.split("\n").join(", ")
115
+ end
116
+ end
117
+
118
+ if io_lambda
119
+ rd, wr = IO.pipe
120
+ res.body = rd
121
+ res.chunked = true
122
+ io_lambda.call(wr)
123
+ body.close if body.respond_to?(:close)
124
+ elsif body.respond_to?(:to_path)
125
+ res.body = ::File.open(body.to_path, "rb")
126
+ body.close if body.respond_to?(:close)
127
+ else
128
+ res.body = lambda do |out|
129
+ out.set_encoding(Encoding::BINARY) if out.respond_to?(:set_encoding)
130
+ body.each do |part|
131
+ out.write(part)
132
+ end
133
+ body.close if body.respond_to?(:close)
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,289 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "singleton"
5
+
6
+ # require_relative "dev_server/cdn_fonts"
7
+ require_relative "dev_server/certificate_manager"
8
+ require_relative "dev_server/errors"
9
+ require_relative "dev_server/header_hash"
10
+
11
+ require_relative "dev_server/hot_reload"
12
+ require_relative "dev_server/hot_reload/script_injector"
13
+ require_relative "dev_server/local_assets"
14
+ require_relative "dev_server/proxy_param_builder"
15
+ require_relative "dev_server/proxy"
16
+ require_relative "dev_server/reload_mode"
17
+ require_relative "dev_server/sse"
18
+ require_relative "dev_server/watcher"
19
+
20
+ require_relative "dev_server/web_server"
21
+ require "fluid_cli/theme/dev_server/hooks/file_change_hook"
22
+
23
+ require_relative "development_theme"
24
+ require_relative "syncer"
25
+
26
+ module FluidCLI
27
+ module Theme
28
+ class DevServer
29
+ include Singleton
30
+
31
+ attr_reader :app, :stopped, :ctx, :root, :host, :theme_identifier, :port, :poll, :editor_sync, :mode,
32
+ :block, :includes, :ignores
33
+
34
+ class << self
35
+ def start(
36
+ ctx,
37
+ root,
38
+ host: "127.0.0.1",
39
+ theme: nil,
40
+ port: 9292,
41
+ poll: false,
42
+ editor_sync: false,
43
+ overwrite_json: false,
44
+ mode: ReloadMode.default,
45
+ includes: nil,
46
+ ignores: nil,
47
+ &block
48
+ )
49
+ instance.setup(
50
+ ctx,
51
+ root,
52
+ host,
53
+ theme,
54
+ port,
55
+ poll,
56
+ editor_sync,
57
+ overwrite_json,
58
+ mode,
59
+ includes,
60
+ ignores,
61
+ &block
62
+ )
63
+ instance.start
64
+ end
65
+
66
+ def stop
67
+ instance.stop
68
+ end
69
+ end
70
+
71
+ # rubocop:disable Metrics/ParameterLists
72
+ def setup(
73
+ ctx,
74
+ root,
75
+ host,
76
+ theme_identifier,
77
+ port,
78
+ poll,
79
+ editor_sync,
80
+ overwrite_json,
81
+ mode,
82
+ includes,
83
+ ignores,
84
+ &block
85
+ )
86
+ @ctx = ctx
87
+ @root = root
88
+ @host = host
89
+ @theme_identifier = theme_identifier
90
+ @port = port
91
+ @poll = poll
92
+ @editor_sync = editor_sync
93
+ @overwrite_json = overwrite_json
94
+ @mode = mode
95
+ @includes = includes
96
+ @ignores = ignores
97
+ @block = block
98
+ end
99
+
100
+ def start
101
+ sync_theme
102
+
103
+ # Handle process stop
104
+ trap("INT") { stop("SIGINT") }
105
+ trap("TERM") { stop("SIGTERM") }
106
+
107
+ # Setup the middleware stack. Mimics Rack::Builder / config.ru, but in reverse order
108
+ @app = middleware_stack
109
+
110
+ # Start development server
111
+ setup_server
112
+ start_server
113
+ teardown_server
114
+
115
+ rescue FluidCLI::API::APIRequestForbiddenError,
116
+ FluidCLI::API::APIRequestUnauthorizedError
117
+ ctx.abort(ensure_user_message)
118
+ rescue Errno::EADDRINUSE
119
+ ctx.abort(port_error_message, port_error_help_message)
120
+ rescue Errno::EADDRNOTAVAIL
121
+ ctx.abort(binding_error_message)
122
+ end
123
+
124
+ def stop(signal = nil)
125
+ ctx.debug(stop_signal(signal)) unless signal.nil?
126
+
127
+ @stopped = true
128
+
129
+ ctx.puts(stopping_message)
130
+ app.close
131
+ WebServer.shutdown
132
+ end
133
+
134
+ private
135
+
136
+ def setup_server
137
+ watcher.start
138
+ end
139
+
140
+ def teardown_server
141
+ # Use instance variables, so we don't build components
142
+ # at the teardown phase.
143
+ @watcher&.stop
144
+ @syncer&.shutdown
145
+ end
146
+
147
+ def start_server
148
+ WebServer.run(
149
+ app,
150
+ BindAddress: host,
151
+ Port: port,
152
+ Logger: logger,
153
+ AccessLog: [],
154
+ )
155
+ end
156
+
157
+ def middleware_stack
158
+ @app = Proxy.new(ctx, theme, param_builder)
159
+ # @app = LocalAssets.new(ctx, @app, theme)
160
+ @app = HotReload.new(ctx, @app, broadcast_hooks: broadcast_hooks, watcher: watcher, mode: mode,
161
+ script_injector: script_injector)
162
+ end
163
+
164
+ def sync_theme
165
+ CLI::UI::Frame.open(viewing_theme_message) do
166
+ ctx.print_task(syncing_theme_message)
167
+ syncer.start_threads
168
+
169
+ if block
170
+ block.call(syncer)
171
+ else
172
+ syncer.upload_theme!(delay_low_priority_files: true)
173
+ end
174
+
175
+ return if stopped
176
+
177
+ ctx.puts(serving_theme_message)
178
+
179
+ ctx.open_url!(address)
180
+ end
181
+ end
182
+
183
+ def theme
184
+ @theme ||= if theme_identifier
185
+ theme = FluidCLI::Theme::Theme.find_by_identifier(ctx, root: root, identifier: theme_identifier)
186
+ theme || ctx.abort(not_found_error_message)
187
+ else
188
+ DevelopmentTheme.find_or_create!(ctx, root: root)
189
+ end
190
+ end
191
+
192
+ def syncer
193
+ @syncer ||= Syncer.new(
194
+ ctx,
195
+ theme: theme,
196
+ overwrite_json: !editor_sync || @overwrite_json
197
+ )
198
+ end
199
+
200
+ def watcher
201
+ @watcher ||= Watcher.new(
202
+ ctx,
203
+ theme: theme,
204
+ syncer: syncer,
205
+ poll: poll
206
+ )
207
+ end
208
+
209
+ def param_builder
210
+ @param_builder ||= ProxyParamBuilder
211
+ .new
212
+ .with_theme(theme)
213
+ .with_syncer(syncer)
214
+ end
215
+
216
+ def logger
217
+ @logger ||= if ctx.debug?
218
+ WEBrick::Log.new(nil, WEBrick::BasicLog::INFO)
219
+ else
220
+ WEBrick::Log.new(nil, WEBrick::BasicLog::FATAL)
221
+ end
222
+ end
223
+
224
+ # Hooks
225
+
226
+ def broadcast_hooks
227
+ file_handler = Hooks::FileChangeHook.new(ctx, theme: theme)
228
+ [file_handler]
229
+ end
230
+
231
+ def script_injector
232
+ HotReload::ScriptInjector.new(ctx, theme: theme)
233
+ end
234
+
235
+ def address
236
+ @address ||= "http://#{host}:#{port}"
237
+ end
238
+
239
+ # Messages
240
+
241
+ def ensure_user_message
242
+ shop = FluidCLI::AdminAPI.get_shop_or_abort(ctx)
243
+ "Please ensure you are logged in to #{shop}"
244
+ end
245
+
246
+ def port_error_message
247
+ "The address #{address} is already in use."
248
+ end
249
+
250
+ def port_error_help_message
251
+ "Please try a different port."
252
+ end
253
+
254
+ def binding_error_message
255
+ "There was a binding error in #{FluidCLI::TOOL_NAME}."
256
+ end
257
+
258
+ def viewing_theme_message
259
+ "Viewing theme #{theme.id} (#{theme.company})"
260
+ end
261
+
262
+ def syncing_theme_message
263
+ "Syncing theme #{theme.id} (#{theme.company})"
264
+ end
265
+
266
+ def serving_theme_message
267
+ "Serving theme #{theme.id} (#{theme.company})"
268
+ end
269
+
270
+ def stopping_message
271
+ "Stopping theme #{theme.id} (#{theme.company})"
272
+ end
273
+
274
+ def stop_signal(signal)
275
+ "Received stop signal: #{signal}"
276
+ end
277
+
278
+ def not_found_error_message
279
+ "Theme not found: #{theme_identifier}"
280
+ end
281
+
282
+ def preview_message
283
+ preview_suffix = editor_sync ? "" : "Please download changes"
284
+
285
+ "To customize or preview your theme, visit #{theme.editor_url} or #{theme.preview_url}. #{preview_suffix}"
286
+ end
287
+ end
288
+ end
289
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+ require_relative "theme"
3
+
4
+ require "socket"
5
+ require "securerandom"
6
+
7
+ module FluidCLI
8
+ module Theme
9
+ API_NAME_LIMIT = 50
10
+
11
+ class DevelopmentTheme < Theme
12
+ def id
13
+ FluidCLI::DB.get(:development_theme_id)
14
+ end
15
+
16
+ def name
17
+ existing_name = FluidCLI::DB.get(:development_theme_name)
18
+ # Up to version 2.3.0 (included) generated names stored locally
19
+ # could have more than 50 characters and the API rejected them.
20
+ # This code ensures we update the name for those users to ensure
21
+ # the name stays under the limit.
22
+ if existing_name.nil? || existing_name.length > API_NAME_LIMIT
23
+ generate_theme_name
24
+ else
25
+ existing_name
26
+ end
27
+ end
28
+
29
+ def role
30
+ "development"
31
+ end
32
+
33
+ def ensure_exists!
34
+ if exists?
35
+ @ctx.debug("Using temporary development theme: ##{id} #{name}")
36
+ else
37
+ create
38
+ @ctx.debug("Created temporary development theme: #{@id}")
39
+ FluidCLI::DB.set(development_theme_id: @id)
40
+ end
41
+
42
+ self
43
+ end
44
+
45
+ def exists?
46
+ return false unless id
47
+
48
+ _status, resp = api_client.get(
49
+ path: "application_themes/#{id}"
50
+ )
51
+ rescue FluidCLI::API::APIRequestNotFoundError
52
+ false
53
+ end
54
+
55
+ def delete
56
+ super if exists?
57
+ FluidCLI::DB.del(:development_theme_id) if FluidCLI::DB.exists?(:development_theme_id)
58
+ FluidCLI::DB.del(:development_theme_name) if FluidCLI::DB.exists?(:development_theme_name)
59
+ end
60
+
61
+ def self.delete(ctx)
62
+ new(ctx).delete
63
+ end
64
+
65
+ def self.find(ctx, root: nil)
66
+ dev_theme = new(ctx, root: root)
67
+ dev_theme.exists? ? dev_theme : nil
68
+ end
69
+
70
+ def self.find_or_create!(ctx, root: nil)
71
+ new(ctx, root: root).ensure_exists!
72
+ end
73
+
74
+ private
75
+
76
+ def generate_theme_name
77
+ hostname = Socket.gethostname.split(".").shift
78
+ hash = SecureRandom.hex(3)
79
+
80
+ theme_name = "Development ()"
81
+ hostname_character_limit = API_NAME_LIMIT - theme_name.length - hash.length - 1
82
+ identifier = encode_identifier("#{hash}-#{hostname[0, hostname_character_limit]}")
83
+ theme_name = "Development (#{identifier})"
84
+
85
+ FluidCLI::DB.set(development_theme_name: theme_name)
86
+
87
+ theme_name
88
+ end
89
+
90
+ ##
91
+ # In some cases, the identifier string encoding may be obfuscated by the hostname,
92
+ # which may be an ASCII string.
93
+ #
94
+ # This method ensures the result identifier is a UTF-8 valid string.
95
+ #
96
+ def encode_identifier(identifier)
97
+ identifier.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "-")
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+ require_relative "mime_type"
3
+
4
+ module FluidCLI
5
+ module Theme
6
+ class File < Struct.new(:path)
7
+ attr_accessor :remote_checksum
8
+ attr_writer :warnings
9
+
10
+ def initialize(path, root)
11
+ super(Pathname.new(path))
12
+
13
+ # Path may be relative or absolute depending on the source.
14
+ # By converting both the path and the root to absolute paths, we
15
+ # can safely fetch a relative path.
16
+ @relative_path = self.path.expand_path.relative_path_from(root.expand_path)
17
+ end
18
+
19
+ def read
20
+ if text?
21
+ path.read(universal_newline: true)
22
+ else
23
+ path.read(mode: "rb")
24
+ end
25
+ end
26
+
27
+ def write(content)
28
+ path.parent.mkpath unless path.parent.directory?
29
+ if text?
30
+ path.write(content, universal_newline: true)
31
+ else
32
+ path.write(content, 0, mode: "wb")
33
+ end
34
+ rescue Encoding::UndefinedConversionError
35
+ ##
36
+ # The CLI tries to write the file and normalize EOL characters to avoid
37
+ # errors on Windows when files are shared across different operational systems.
38
+ #
39
+ # The CLI fallbacks any error during the conversion by writing the file
40
+ # in binary mode when the normalization fails (e.g., ASCII files), so no data is lost.
41
+ #
42
+ path.write(content, 0, mode: "wb")
43
+ end
44
+
45
+ def delete
46
+ path.delete
47
+ end
48
+
49
+ def exist?
50
+ path.exist?
51
+ end
52
+
53
+ def mime_type
54
+ @mime_type ||= FluidCLI::Theme::MimeType.by_filename(@relative_path)
55
+ end
56
+
57
+ def text?
58
+ mime_type.text?
59
+ end
60
+
61
+ def liquid?
62
+ path.extname == ".liquid"
63
+ end
64
+
65
+ def liquid_css?
66
+ relative_path.end_with?(".css.liquid")
67
+ end
68
+
69
+ def json?
70
+ path.extname == ".json"
71
+ end
72
+
73
+ def template?
74
+ relative_path.start_with?("templates/")
75
+ end
76
+
77
+ def checksum
78
+ content = read
79
+ Digest::SHA256.hexdigest(content)
80
+ end
81
+
82
+ # Make it possible to check whether a given File is within a list of Files with `include?`,
83
+ # some of which may be relative paths while others are absolute paths.
84
+ def ==(other)
85
+ relative_path == other.relative_path
86
+ end
87
+
88
+ def name(*args)
89
+ ::File.basename(path, *args)
90
+ end
91
+
92
+ def absolute_path
93
+ path.realpath.to_s
94
+ end
95
+
96
+ def relative_path
97
+ @relative_path.to_s
98
+ end
99
+
100
+ def warnings
101
+ @warnings || []
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fluid_cli/theme/presenters/themes_presenter"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ module Forms
8
+ class Select < FluidCLI::Form
9
+ attr_accessor :theme
10
+ flag_arguments :root, :title, :exclude_roles, :include_foreign_developments, :cmd
11
+
12
+ def ask
13
+ self.theme = CLI::UI::Prompt.ask(title, allow_empty: false) do |handler|
14
+ theme_presenters.each do |presenter|
15
+ theme = presenter.theme
16
+
17
+ handler.option(presenter.to_s(:short)) { theme }
18
+ end
19
+ if handler.options.empty? && cmd
20
+ @ctx.abort(@ctx.message("theme.#{cmd}.no_themes_error"), @ctx.message("theme.#{cmd}.no_themes_resolution"))
21
+ end
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def theme_presenters
28
+ FluidCLI::Theme::Presenters::ThemesPresenter.new(ctx, root).all
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ require "webrick"
3
+
4
+ module FluidCLI
5
+ module Theme
6
+ class MimeType < Struct.new(:name)
7
+ MIME_TYPES = WEBrick::HTTPUtils::DefaultMimeTypes.merge(
8
+ "liquid" => "text/x-liquid",
9
+ )
10
+
11
+ class << self
12
+ def by_filename(filename)
13
+ new(WEBrick::HTTPUtils.mime_type(filename.to_s, MIME_TYPES))
14
+ end
15
+ end
16
+
17
+ def text?
18
+ /text/.match?(name) || json? || javascript?
19
+ end
20
+
21
+ def json?
22
+ name == "application/json"
23
+ end
24
+
25
+ def javascript?
26
+ name == "application/javascript"
27
+ end
28
+
29
+ def to_s
30
+ name
31
+ end
32
+ end
33
+ end
34
+ end