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,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FluidCLI
4
+ module Theme
5
+ class DevServer
6
+ class LocalAssets
7
+ THEME_REGEX = %r{//cdn\.shopify\.com/s/.+?/(assets/.+?\.(?:css|js))}
8
+
9
+ class FileBody
10
+ def initialize(path)
11
+ @path = path
12
+ end
13
+
14
+ # Naive implementation. Only used in unit tests.
15
+ def each
16
+ yield @path.read
17
+ end
18
+
19
+ # Rack will stream a body that responds to `to_path`
20
+ def to_path
21
+ @path.to_path
22
+ end
23
+ end
24
+
25
+ def initialize(ctx, app, target)
26
+ @ctx = ctx
27
+ @app = app
28
+ @target = target
29
+ end
30
+
31
+ def call(env)
32
+ path_info = env["PATH_INFO"]
33
+ if path_info.start_with?("/assets")
34
+ # Serve from disk
35
+ serve_file(path_info)
36
+ else
37
+ # Proxy the request, and replace the URLs in the response
38
+ status, headers, body = @app.call(env)
39
+ body = replace_asset_urls(body) unless path_info.start_with?("/fonts")
40
+ [status, headers, body]
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def replace_asset_urls(body)
47
+ replaced_body = body.join.gsub(THEME_REGEX) do |match|
48
+ path = Regexp.last_match[1]
49
+ if @target.static_asset_paths.include?(path)
50
+ "/#{path}"
51
+ else
52
+ match
53
+ end
54
+ end
55
+
56
+ [replaced_body]
57
+ rescue ArgumentError => error
58
+ return [body.join] if error.message.include?("invalid byte sequence")
59
+
60
+ raise error
61
+ end
62
+
63
+ def serve_fail(status, body)
64
+ [
65
+ status,
66
+ {
67
+ "Content-Type" => "text/plain",
68
+ "Content-Length" => body.size.to_s,
69
+ },
70
+ [body],
71
+ ]
72
+ end
73
+
74
+ def serve_file(path_info)
75
+ path = @target.root.join(path_info[1..-1])
76
+ if path.file? && path.readable? && @target.static_asset_file?(path)
77
+ [
78
+ 200,
79
+ {
80
+ "Content-Type" => MimeType.by_filename(path).to_s,
81
+ "Content-Length" => path.size.to_s,
82
+ },
83
+ FileBody.new(path),
84
+ ]
85
+ else
86
+ serve_fail(404, "Not found")
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "stringio"
4
+ require "time"
5
+ require "cgi"
6
+ require "net/http"
7
+
8
+ require_relative "header_hash"
9
+ require_relative "proxy_param_builder"
10
+
11
+ module FluidCLI
12
+ module Theme
13
+ class DevServer
14
+ HOP_BY_HOP_HEADERS = [
15
+ "connection",
16
+ "keep-alive",
17
+ "proxy-authenticate",
18
+ "proxy-authorization",
19
+ "te",
20
+ "trailer",
21
+ "transfer-encoding",
22
+ "upgrade",
23
+ "content-security-policy",
24
+ "content-length",
25
+ ]
26
+
27
+ class Proxy
28
+ SESSION_COOKIE_NAME = "_fluid_session"
29
+ SESSION_COOKIE_REGEXP = /#{SESSION_COOKIE_NAME}=(\h+)/
30
+ SESSION_COOKIE_MAX_AGE = 60 * 60 * 23 # 1 day - leeway of 1h
31
+
32
+ def initialize(ctx, theme, param_builder)
33
+ @ctx = ctx
34
+ @theme = theme
35
+ @param_builder = param_builder
36
+
37
+ @core_endpoints = Set.new
38
+ @secure_session_id = nil
39
+ @last_session_cookie_refresh = nil
40
+ end
41
+
42
+ def call(env)
43
+ headers = extract_http_request_headers(env)
44
+ headers["Host"] = company_host
45
+ headers["Cookie"] = add_session_cookie(headers["Cookie"])
46
+ headers["Accept-Encoding"] = "none"
47
+ headers["X-Fluid-Theme"] = theme_id.to_s
48
+ headers["User-Agent"] = "Fluid CLI"
49
+ query = URI.decode_www_form(env["QUERY_STRING"])
50
+ replace_templates = build_replacement_param(env)
51
+ response = if replace_templates.any?
52
+ # Pass to SFR the recently modified templates in `replace_templates` or
53
+ # `replace_extension_templates` body param
54
+ headers["Authorization"] = "Bearer #{bearer_token}"
55
+ form_data = URI.decode_www_form(env["rack.input"].read).to_h
56
+ request(
57
+ "POST", env["PATH_INFO"],
58
+ headers: headers,
59
+ query: query,
60
+ form_data: form_data.merge(replace_templates).merge(_method: env["REQUEST_METHOD"])
61
+ )
62
+ else
63
+ request(
64
+ env["REQUEST_METHOD"], env["PATH_INFO"],
65
+ headers: headers,
66
+ query: query,
67
+ body_stream: (env["rack.input"] if has_body?(headers))
68
+ )
69
+ end
70
+
71
+ headers = get_response_headers(response, env)
72
+
73
+ @core_endpoints << env["PATH_INFO"]
74
+
75
+ body = patch_body(env, response.body)
76
+ body = [body] unless body.respond_to?(:each)
77
+ [response.code, headers, body]
78
+ end
79
+
80
+ private
81
+
82
+ def patch_body(env, body)
83
+ return [""] unless body
84
+
85
+ body.gsub(%r{(data-.+=(["']))(http:|https:)?//#{company}(.*)(\2)}) do |_|
86
+ match = Regexp.last_match
87
+ "#{match[1]}http://#{host(env)}#{match[4]}#{match[5]}"
88
+ end
89
+ end
90
+
91
+ def host(env)
92
+ env["HTTP_HOST"]
93
+ end
94
+
95
+ def has_body?(headers)
96
+ headers["Content-Length"] || headers["Transfer-Encoding"]
97
+ end
98
+
99
+ def bearer_token
100
+ Environment.storefront_renderer_auth_token ||
101
+ FluidCLI::DB.get(:storefront_renderer_production_exchange_token) ||
102
+ raise(KeyError, "storefront_renderer_production_exchange_token missing")
103
+ end
104
+
105
+ def extract_http_request_headers(env)
106
+ headers = HeaderHash.new
107
+
108
+ env.each do |name, value|
109
+ next if value.nil?
110
+
111
+ if /^HTTP_[A-Z0-9_]+$/.match?(name) || name == "CONTENT_TYPE" || name == "CONTENT_LENGTH"
112
+ headers[reconstruct_header_name(name)] = value
113
+ end
114
+ end
115
+
116
+ x_forwarded_for = (headers["X-Forwarded-For"].to_s.split(/, +/) << env["REMOTE_ADDR"]).join(", ")
117
+ headers["X-Forwarded-For"] = x_forwarded_for
118
+
119
+ headers
120
+ end
121
+
122
+ def normalize_headers(headers)
123
+ mapped = headers.map do |k, v|
124
+ [k, v.is_a?(Array) ? v.join("\n") : v]
125
+ end
126
+ HeaderHash.new(Hash[mapped])
127
+ end
128
+
129
+ def reconstruct_header_name(name)
130
+ name.sub(/^HTTP_/, "").gsub("_", "-")
131
+ end
132
+
133
+ def add_session_cookie(cookie_header)
134
+ cookie_header = if cookie_header
135
+ cookie_header.dup
136
+ else
137
+ +""
138
+ end
139
+
140
+ expected_session_cookie = "#{SESSION_COOKIE_NAME}=#{secure_session_id}"
141
+
142
+ unless cookie_header.include?(expected_session_cookie)
143
+ if cookie_header.include?(SESSION_COOKIE_NAME)
144
+ cookie_header.sub!(SESSION_COOKIE_REGEXP, expected_session_cookie)
145
+ else
146
+ cookie_header << "; " unless cookie_header.empty?
147
+ cookie_header << expected_session_cookie
148
+ end
149
+ end
150
+
151
+ cookie_header
152
+ end
153
+
154
+ def secure_session_id_expired?
155
+ return true unless @secure_session_id && @last_session_cookie_refresh
156
+
157
+ Time.now - @last_session_cookie_refresh >= SESSION_COOKIE_MAX_AGE
158
+ end
159
+
160
+ def extract_secure_session_id_from_response_headers(headers)
161
+ return unless headers["set-cookie"]
162
+
163
+ headers["set-cookie"][SESSION_COOKIE_REGEXP, 1]
164
+ end
165
+
166
+ def secure_session_id
167
+ if secure_session_id_expired?
168
+ @ctx.debug("Refreshing preview _secure_session_id cookie")
169
+ response = request("HEAD", "/", query: [[:preview_theme_id, theme_id]])
170
+ @secure_session_id = extract_secure_session_id_from_response_headers(response)
171
+ @last_session_cookie_refresh = Time.now
172
+ end
173
+
174
+ @secure_session_id
175
+ end
176
+
177
+ def get_response_headers(response, env)
178
+ response_headers = normalize_headers(
179
+ response.respond_to?(:headers) ? response.headers : response.to_hash,
180
+ )
181
+ # According to https://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-14#section-7.1.3.1Acc
182
+ # should remove hop-by-hop header fields
183
+ # (Taken from Rack::Proxy)
184
+ response_headers.reject! { |k| HOP_BY_HOP_HEADERS.include?(k.downcase) }
185
+
186
+ new_session_id = extract_secure_session_id_from_response_headers(response_headers)
187
+ if new_session_id
188
+ @ctx.debug("New _secure_session_id cookie from response")
189
+ @secure_session_id = new_session_id
190
+ @last_session_cookie_refresh = Time.now
191
+ end
192
+
193
+ response_headers
194
+ end
195
+
196
+ def request(method, path, headers: nil, query: [], form_data: nil, body_stream: nil)
197
+ uri = URI.join("https://#{company_host}", path)
198
+
199
+ uri.query = URI.encode_www_form(query + [[:_fd, 0], [:pb, 0]])
200
+
201
+ @ctx.debug("Proxying #{method} #{uri}")
202
+ Net::HTTP.start(uri.host, 443, use_ssl: true) do |http|
203
+ req_class = Net::HTTP.const_get(method.capitalize)
204
+ req = req_class.new(uri)
205
+ req.initialize_http_header(headers) if headers
206
+ req.set_form_data(form_data) if form_data
207
+ req.body_stream = body_stream if body_stream
208
+ response = http.request(req)
209
+ @ctx.debug("`-> #{response.code} request_id: #{response["x-request-id"]}")
210
+ response
211
+ end
212
+ end
213
+
214
+ def company
215
+ @company ||= @theme.company
216
+ end
217
+
218
+ def company_host
219
+ @company_host ||= "#{company}.fluid.app"
220
+ end
221
+
222
+ def theme_id
223
+ @theme_id ||= @theme.id
224
+ end
225
+
226
+ def build_replacement_param(env)
227
+ @param_builder
228
+ .with_core_endpoints(@core_endpoints)
229
+ .with_rack_env(env)
230
+ .build
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cgi"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ class DevServer
8
+ class ProxyParamBuilder
9
+ def build
10
+ # Core doesn't support replace_templates
11
+ return {} if core?(current_path)
12
+
13
+ (syncer_templates + request_templates)
14
+ .select { |file| file.liquid? || file.json? }
15
+ .uniq(&:relative_path)
16
+ .map { |file| as_param(file) }
17
+ .to_h
18
+ end
19
+
20
+ def with_core_endpoints(core_endpoints)
21
+ @core_endpoints = core_endpoints
22
+ self
23
+ end
24
+
25
+ def with_syncer(syncer)
26
+ @syncer = syncer
27
+ self
28
+ end
29
+
30
+ def with_rack_env(rack_env)
31
+ @rack_env = rack_env
32
+ self
33
+ end
34
+
35
+ def with_theme(theme)
36
+ @theme = theme
37
+ self
38
+ end
39
+
40
+ private
41
+
42
+ def as_param(file)
43
+ ["replace_templates[#{file.relative_path}]", file.read]
44
+ end
45
+
46
+ def syncer_templates
47
+ @syncer&.pending_updates || []
48
+ end
49
+
50
+ def request_templates
51
+ cookie_sections
52
+ .map { |section| @theme[section] unless @theme.nil? }
53
+ .compact
54
+ end
55
+
56
+ def cookie_sections
57
+ CGI::Cookie.parse(cookie)["hot_reload_files"].join.split(",") || []
58
+ end
59
+
60
+ def core?(path)
61
+ core_endpoints.include?(path)
62
+ end
63
+
64
+ def current_path
65
+ rack_env["PATH_INFO"]
66
+ end
67
+
68
+ def cookie
69
+ rack_env["HTTP_COOKIE"]
70
+ end
71
+
72
+ def core_endpoints
73
+ @core_endpoints || []
74
+ end
75
+
76
+ def rack_env
77
+ @rack_env || {}
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FluidCLI
4
+ module Theme
5
+ class DevServer
6
+ class ReloadMode
7
+ MODES = [:"full-page", :off]
8
+
9
+ class << self
10
+ def default
11
+ :"full-page"
12
+ end
13
+
14
+ def get!(mode)
15
+ MODES.find { |m| m == mode.to_sym } || raise_error(mode)
16
+ end
17
+
18
+ private
19
+
20
+ def raise_error(invalid_mode)
21
+ error_message = FluidCLI::Context.message("theme.serve.reload_mode_is_not_valid", invalid_mode)
22
+ help_message = FluidCLI::Context.message("theme.serve.try_a_valid_reload_mode", valid_modes)
23
+
24
+ FluidCLI::Context.abort(error_message, help_message)
25
+ end
26
+
27
+ def valid_modes
28
+ MODES.map { |v| "`#{v}`" }.join(", ")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+ require "thread"
3
+
4
+ module FluidCLI
5
+ module Theme
6
+ class DevServer
7
+ # Server-Sent events implementation for Rack.
8
+ # Based on https://gist.github.com/raggi/ff7971991297e5c8a1ce
9
+ class SSE
10
+ class Event < Struct.new(:data)
11
+ def to_s
12
+ "data: #{data}\n" \
13
+ "\n\n"
14
+ end
15
+ end
16
+
17
+ class Stream
18
+ def initialize(streams)
19
+ @streams = streams
20
+ @queue = Queue.new
21
+ end
22
+
23
+ def <<(event)
24
+ raise TypeError, "expected SSE::Event" unless event.is_a?(Event)
25
+ @queue << event
26
+ end
27
+
28
+ def each
29
+ while (event = @queue.pop)
30
+ yield event.to_s
31
+ end
32
+ end
33
+
34
+ def close
35
+ @streams.remove(self)
36
+ @queue << nil
37
+ end
38
+ end
39
+
40
+ class Streams
41
+ def initialize
42
+ @list = []
43
+ end
44
+
45
+ def size
46
+ @list.size
47
+ end
48
+
49
+ def new
50
+ stream = Stream.new(self)
51
+ @list << stream
52
+ stream
53
+ end
54
+
55
+ def remove(stream)
56
+ raise TypeError, "expected SSE::Stream" unless stream.is_a?(Stream)
57
+ @list.delete(stream)
58
+ end
59
+
60
+ def broadcast(data)
61
+ raise TypeError, "expected String" unless data.is_a?(String)
62
+ @list.each do |stream|
63
+ stream << Event.new(data)
64
+ end
65
+ end
66
+
67
+ def close
68
+ @list.each(&:close)
69
+ @list.clear
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+ require "fluid_cli/file_system_listener"
3
+ require "forwardable"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ class DevServer
8
+ # Watches for file changes and publish events to the theme
9
+ class Watcher
10
+ extend Forwardable
11
+
12
+ def_delegators :@listener, :add_observer, :changed, :notify_observers
13
+
14
+ def initialize(ctx, theme:, syncer:, poll: false)
15
+ @ctx = ctx
16
+ @theme = theme
17
+ @syncer = syncer
18
+ @listener = FileSystemListener.new(root: @theme.root, force_poll: poll)
19
+
20
+ add_observer(self, :upload_files_when_changed)
21
+ end
22
+
23
+ def start
24
+ @listener.start
25
+ end
26
+
27
+ def stop
28
+ @listener.stop
29
+ end
30
+
31
+ def upload_files_when_changed(modified, added, removed)
32
+ modified_theme_files = filter_theme_files(modified + added)
33
+ if modified_theme_files.any?
34
+ @syncer.enqueue_updates(modified_theme_files)
35
+ end
36
+
37
+ removed_theme_files = filter_remote_files(removed)
38
+ if removed_theme_files.any?
39
+ @syncer.enqueue_deletes(removed_theme_files)
40
+ end
41
+ end
42
+
43
+ def filter_theme_files(files)
44
+ files
45
+ .select { |file| @theme.theme_file?(file) }
46
+ .map { |file| @theme[file] }
47
+ end
48
+
49
+ def filter_remote_files(files)
50
+ files
51
+ .select { |file| @syncer.remote_file?(file) }
52
+ .map { |file| @theme[file] }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end