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,126 @@
1
+ require "base64"
2
+ require "digest"
3
+ require "json"
4
+ require "net/http"
5
+ require "securerandom"
6
+ require "openssl"
7
+ require "fluid_cli"
8
+ require "uri"
9
+
10
+ module FluidCLI
11
+ class IdentityAuth
12
+ # include SmartProperties
13
+ autoload :Servlet, "fluid_cli/identity_auth/servlet"
14
+ # autoload :EnvAuthToken, "fluid_cli/identity_auth/env_auth_token"
15
+
16
+ class Error < StandardError; end
17
+ class Timeout < StandardError; end
18
+ LocalRequest = Struct.new(:method, :path, :query, :protocol)
19
+
20
+ DEFAULT_PORT = 3456
21
+ REDIRECT_HOST = "http://127.0.0.1:#{DEFAULT_PORT}"
22
+
23
+ attr_accessor :ctx, :store, :response_query, :state_token
24
+
25
+ def initialize(ctx:, store: FluidCLI::DB.new, state_token: SecureRandom.hex(30))
26
+ @ctx = ctx
27
+ @store = store
28
+ @state_token = state_token
29
+ end
30
+
31
+ def authenticate(spinner: false)
32
+ initiate_authentication
33
+
34
+ begin
35
+ store.set(jwt: receive_jwt)
36
+ rescue IdentityAuth::Timeout => e
37
+ ctx.abort(e.message)
38
+ end
39
+ end
40
+
41
+ def with_spinner(spinner, message, &block)
42
+ result = nil
43
+ if spinner
44
+ CLI::UI::Spinner.spin(message) do
45
+ result = block.call
46
+ end
47
+ else
48
+ result = block.call
49
+ end
50
+ result
51
+ end
52
+
53
+ def self.environment_auth_token?
54
+ !!Environment.auth_token
55
+ end
56
+
57
+ def self.authenticated?
58
+ environment_auth_token? || FluidCLI::DB.exists?(:jwt)
59
+ end
60
+
61
+ def reauthenticate
62
+ return if attempt_reauthenticate
63
+ ctx.abort("Authentication required. Please login again using 'fluid_cli login' command.")
64
+ end
65
+
66
+ def attempt_reauthenticate
67
+ refresh_jwt
68
+ end
69
+
70
+ def server
71
+ @server ||= begin
72
+ server = WEBrick::HTTPServer.new(
73
+ Port: DEFAULT_PORT,
74
+ Logger: WEBrick::Log.new(File.open(File::NULL, "w")),
75
+ AccessLog: [],
76
+ )
77
+ server.mount("/", Servlet, self, state_token)
78
+ server
79
+ end
80
+ end
81
+
82
+ def self.delete_tokens_and_keys
83
+ FluidCLI::DB.del(:jwt)
84
+ end
85
+
86
+ private
87
+
88
+ def initiate_authentication
89
+ @server_thread = Thread.new { server.start }
90
+ params = {
91
+ redirect_url: REDIRECT_HOST,
92
+ }
93
+ uri = URI.parse("https://auth.fluid.app/")
94
+ uri.query = URI.encode_www_form(params)
95
+ open_browser_authentication(uri)
96
+ end
97
+
98
+ def open_browser_authentication(uri)
99
+ ctx.open_browser_url!(uri)
100
+ end
101
+
102
+ def receive_jwt
103
+ @jwt ||= begin
104
+ @server_thread.join(240)
105
+ raise Timeout, "timeout" if response_query.nil?
106
+ raise Error, response_query["error"] unless response_query["error"].nil?
107
+ response_query["jwt"]
108
+ end
109
+ end
110
+
111
+ def refresh_jwt
112
+ # return false unless store.exists?(:jwt)
113
+ _status, body = FluidCLI::API.new(@ctx).get(path: "/me")
114
+
115
+ store.set(jwt: body["jwt"])
116
+ store.set(company: body["company"]["subdomain"])
117
+ store.set(company_name: body["company"]["name"])
118
+ true
119
+ rescue
120
+ store.del(:jwt)
121
+ store.del(:company)
122
+ store.del(:company_name)
123
+ false
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require "fluid_cli"
3
+ require "optparse"
4
+
5
+ module FluidCLI
6
+ class Options
7
+ attr_reader :flags, :subcommand, :help
8
+
9
+ def initialize
10
+ @flags = {}
11
+ @help = false
12
+ end
13
+
14
+ def parse(options_block, args)
15
+ @args = args
16
+ if options_block.respond_to?(:call) && args
17
+ parse_flags(options_block)
18
+ else
19
+ parser.permute!(@args)
20
+ end
21
+ @args
22
+ end
23
+
24
+ def parse_flags(block)
25
+ block.call(parser, @flags)
26
+ parser.permute!(@args)
27
+ end
28
+
29
+ def parser
30
+ @parser ||= begin
31
+ opt = OptionParser.new
32
+ opt.on("--help", "-h", "options help") do |v|
33
+ @help = v
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "openssl"
4
+
5
+ module FluidCLI
6
+ module Theme
7
+ class DevServer
8
+ class CertificateManager
9
+ attr_reader :ctx, :domain_name, :certificate, :private_key
10
+
11
+ ISSUER_EXTENSIONS = [
12
+ ["subjectKeyIdentifier", "hash", false],
13
+ ["authorityKeyIdentifier", "keyid:always", false],
14
+ ]
15
+
16
+ def initialize(ctx, domain_name)
17
+ @ctx = ctx
18
+ @domain_name = domain_name
19
+ end
20
+
21
+ def find_or_create_certificates!
22
+ @private_key = if (private_key_pem = FluidCLI::DB.get(:ssl_private_key))
23
+ OpenSSL::PKey::RSA.new(private_key_pem)
24
+ else
25
+ OpenSSL::PKey::RSA.new(2048)
26
+ end
27
+
28
+ @certificate = if (certificate_pem = FluidCLI::DB.get(:ssl_certificate))
29
+ OpenSSL::X509::Certificate.new(certificate_pem)
30
+ else
31
+ x509_certificate = build_x509_certificate
32
+
33
+ sign_certificate!(x509_certificate)
34
+
35
+ x509_certificate
36
+ end
37
+
38
+ FluidCLI::DB.set(ssl_certificate: certificate.to_pem)
39
+ FluidCLI::DB.set(ssl_private_key: private_key.to_pem)
40
+ end
41
+
42
+ private
43
+
44
+ def build_x509_certificate
45
+ certificate = OpenSSL::X509::Certificate.new
46
+
47
+ certificate.public_key = private_key.public_key
48
+ certificate.subject = subject
49
+ certificate.version = 2
50
+ certificate.serial = 0x0
51
+
52
+ certificate.not_before = Time.now.utc
53
+ certificate.not_after = Time.now.utc + 365 * 24 * 60 * 60
54
+
55
+ certificate
56
+ end
57
+
58
+ def sign_certificate!(certificate)
59
+ ef = OpenSSL::X509::ExtensionFactory.new
60
+
61
+ ef.subject_certificate = certificate
62
+ ef.issuer_certificate = certificate
63
+
64
+ ISSUER_EXTENSIONS.each do |args|
65
+ certificate.add_extension(ef.create_extension(*args))
66
+ end
67
+
68
+ certificate.add_extension(ef.create_extension("subjectAltName", "DNS:#{@domain_name}", false))
69
+
70
+ certificate.sign(private_key, OpenSSL::Digest.new("SHA256"))
71
+ end
72
+
73
+ def subject
74
+ OpenSSL::X509::Name.parse("/CN=#{@domain_name}/")
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ module FluidCLI
3
+ module Theme
4
+ class DevServer
5
+ # Errors
6
+ class Error < StandardError; end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FluidCLI
4
+ module Theme
5
+ class DevServer
6
+ # Based on Rack::HeaderHash
7
+ class HeaderHash < Hash
8
+ def self.[](headers)
9
+ if headers.is_a?(HeaderHash) && !headers.frozen?
10
+ headers
11
+ else
12
+ new(headers)
13
+ end
14
+ end
15
+
16
+ def initialize(hash = {})
17
+ super()
18
+ @names = {}
19
+ hash.each { |k, v| self[k] = v }
20
+ end
21
+
22
+ # on dup/clone, we need to duplicate @names hash
23
+ def initialize_copy(other)
24
+ super
25
+ @names = other.names.dup
26
+ end
27
+
28
+ # on clear, we need to clear @names hash
29
+ def clear
30
+ super
31
+ @names.clear
32
+ end
33
+
34
+ def each
35
+ super do |k, v|
36
+ yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v)
37
+ end
38
+ end
39
+
40
+ def to_hash
41
+ hash = {}
42
+ each { |k, v| hash[k] = v }
43
+ hash
44
+ end
45
+
46
+ def [](k)
47
+ super(k) || super(@names[k.downcase])
48
+ end
49
+
50
+ def fetch(k, default = nil)
51
+ self[k] || super(@names[k.downcase], default)
52
+ end
53
+
54
+ def []=(k, v)
55
+ canonical = k.downcase.freeze
56
+ # .delete is expensive, don't invoke it unless necessary
57
+ delete(k) if @names[canonical] && @names[canonical] != k
58
+ @names[canonical] = k
59
+ super(k, v)
60
+ end
61
+
62
+ def delete(k)
63
+ canonical = k.downcase
64
+ result = super(@names.delete(canonical))
65
+ result
66
+ end
67
+
68
+ def include?(k)
69
+ super || @names.include?(k.downcase)
70
+ end
71
+
72
+ alias_method :has_key?, :include?
73
+ alias_method :member?, :include?
74
+ alias_method :key?, :include?
75
+
76
+ def merge!(other)
77
+ other.each { |k, v| self[k] = v }
78
+ self
79
+ end
80
+
81
+ def merge(other)
82
+ hash = dup
83
+ hash.merge!(other)
84
+ end
85
+
86
+ def replace(other)
87
+ clear
88
+ other.each { |k, v| self[k] = v }
89
+ self
90
+ end
91
+
92
+ protected
93
+
94
+ attr_reader :names
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module FluidCLI
3
+ module Theme
4
+ class DevServer
5
+ module Hooks
6
+ class FileChangeHook
7
+ def initialize(ctx, theme:)
8
+ @ctx = ctx
9
+ @theme = theme
10
+ end
11
+
12
+ def call(modified, added, removed, streams: nil)
13
+ @streams = streams
14
+ files = (modified + added)
15
+ .map { |f| @theme[f] }
16
+ deleted_files = removed
17
+ .map { |f| @theme[f] }
18
+
19
+ reload_page(removed) unless deleted_files.empty?
20
+ hot_reload(files) unless files.empty?
21
+ end
22
+
23
+ private
24
+
25
+ def hot_reload(files)
26
+ paths = files.map(&:relative_path)
27
+ @streams.broadcast(JSON.generate(modified: paths))
28
+ @ctx.debug("[HotReload] Modified #{paths.join(", ")}")
29
+ end
30
+
31
+ def reload_page(removed)
32
+ @streams.broadcast(JSON.generate(reload_page: true))
33
+ @ctx.debug("[ReloadPage] Deleted #{removed.join(", ")}")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ <noscript>
2
+ <style type="text/css">
3
+ .fluid-cli-no-script-message {
4
+ font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;
5
+ text-size-adjust: 100%;
6
+ text-rendering: optimizeLegibility;
7
+ -webkit-font-smoothing: antialiased;
8
+ -moz-osx-font-smoothing: grayscale;
9
+ position: fixed;
10
+ z-index: 999;
11
+ font-weight: 500;
12
+ left: 0;
13
+ top: 0;
14
+ width: 100vw;
15
+ height: 100vh;
16
+ padding: 10rem 0;
17
+ color: #202223;
18
+ text-align: center;
19
+ background-color: #F6F6F7;
20
+ }
21
+ </style>
22
+ <div class="fluid-cli-no-script-message">
23
+ Fluid CLI requires JavaScript to work.
24
+ <br />
25
+ Activate JavaScript support or try a different browser.
26
+ </div>
27
+ </noscript>
@@ -0,0 +1,28 @@
1
+ class HotReload {
2
+ static reloadMode = () => {
3
+ const namespace = window.__FLUID_CLI_ENV__;
4
+ return namespace.mode;
5
+ };
6
+ static isFullPageReloadMode = () => {
7
+ return HotReload.reloadMode() === "full-page";
8
+ };
9
+ static isReloadModeActive = () => {
10
+ return HotReload.reloadMode() !== "off";
11
+ };
12
+ static setHotReloadCookie = (files) => {
13
+ const date = new Date();
14
+
15
+ // Hot reload cookie expires in 3 seconds
16
+ date.setSeconds(date.getSeconds() + 3);
17
+
18
+ const sections = files.join(",");
19
+ const expires = date.toUTCString();
20
+
21
+ document.cookie = `hot_reload_files=${sections}; expires=${expires}; path=/`;
22
+ };
23
+ static refreshPage = (files) => {
24
+ HotReload.setHotReloadCookie(files);
25
+ console.log("[HotReload] Refreshing entire page");
26
+ window.location.reload();
27
+ };
28
+ }
@@ -0,0 +1,43 @@
1
+ class SSEClient {
2
+ constructor(eventsUrl, eventHandler) {
3
+ SSEClient.verifySSE();
4
+ this.eventsUrl = eventsUrl;
5
+ this.eventHandler = eventHandler;
6
+ }
7
+ static verifySSE() {
8
+ if (typeof EventSource === "undefined") {
9
+ console.error(
10
+ "[HotReload] Error: SSE features are not supported. Try a different browser."
11
+ );
12
+ }
13
+
14
+ console.log("[HotReload] Initializing...");
15
+ }
16
+ connect() {
17
+ const eventSource = new EventSource(this.eventsUrl);
18
+ eventSource.onmessage = (msg) => {
19
+ this.handleMessage(msg);
20
+ };
21
+
22
+ eventSource.onopen = () => console.log("[HotReload] SSE connected.");
23
+
24
+ eventSource.onclose = () => {
25
+ console.log("[HotReload] SSE closed. Attempting to reconnect...");
26
+
27
+ setTimeout(this.connect, 5000);
28
+ };
29
+
30
+ eventSource.onerror = () => {
31
+ console.log("[HotReload] SSE closed.");
32
+ eventSource.close();
33
+ };
34
+ }
35
+ handleMessage(message) {
36
+ const data = JSON.parse(message.data);
37
+ if (data.reload_page) {
38
+ HotReload.refreshPage([]);
39
+ return;
40
+ }
41
+ this.eventHandler(data);
42
+ }
43
+ }
@@ -0,0 +1,16 @@
1
+ (() => {
2
+ function handleUpdate(data) {
3
+ const modifiedFiles = data.modified;
4
+
5
+ if (modifiedFiles === undefined) {
6
+ return;
7
+ }
8
+
9
+ HotReload.refreshPage(modifiedFiles)
10
+ }
11
+
12
+ if (HotReload.isReloadModeActive()) {
13
+ let client = new SSEClient("/hot-reload", handleUpdate);
14
+ client.connect();
15
+ }
16
+ })();
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FluidCLI
4
+ module Theme
5
+ class DevServer
6
+ class HotReload
7
+ class ScriptInjector
8
+ def initialize(ctx, theme: nil)
9
+ @ctx = ctx
10
+ @theme = theme
11
+ end
12
+
13
+ def inject(body:, dir:, mode:)
14
+ @mode = mode
15
+ @dir = dir
16
+ hot_reload_script = [
17
+ read("hot-reload-no-script.html"),
18
+ "<script>",
19
+ "(() => {",
20
+ javascript_inline,
21
+ *javascript_files.map { |file| read(file) },
22
+ "})();",
23
+ "</script>",
24
+ ].join("\n")
25
+
26
+ body = body.join.sub("</body>", "#{hot_reload_script}\n</body>")
27
+
28
+ [body]
29
+ end
30
+
31
+ private
32
+
33
+ def javascript_files
34
+ %w(hot_reload.js sse_client.js theme.js)
35
+ end
36
+
37
+ def javascript_inline
38
+ env = { mode: @mode }
39
+
40
+ <<~JS
41
+ (() => {
42
+ window.__FLUID_CLI_ENV__ = #{env.to_json};
43
+ })();
44
+ JS
45
+ end
46
+
47
+ def read(filename)
48
+ ::File.read("#{@dir}/hot_reload/resources/#{filename}")
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FluidCLI
4
+ module Theme
5
+ class DevServer
6
+ class HotReload
7
+ def initialize(ctx, app, broadcast_hooks: [], script_injector: nil, watcher:, mode:)
8
+ @ctx = ctx
9
+ @app = app
10
+ @mode = mode
11
+ @broadcast_hooks = broadcast_hooks
12
+ @script_injector = script_injector
13
+ @streams = SSE::Streams.new
14
+ @watcher = watcher
15
+ @watcher.add_observer(self, :notify_streams_of_file_change)
16
+ end
17
+
18
+ def call(env)
19
+ path = env["PATH_INFO"]
20
+ if path == "/hot-reload"
21
+ create_stream
22
+ else
23
+ status, headers, body = @app.call(env)
24
+
25
+ if request_is_html?(headers) && leads_to_injectable_body?(path)
26
+ body = inject_hot_reload_javascript(body)
27
+ end
28
+
29
+ [status, headers, body]
30
+ end
31
+ end
32
+
33
+ def close
34
+ @streams.close
35
+ end
36
+
37
+ def notify_streams_of_file_change(modified, added, removed)
38
+ @broadcast_hooks.each do |hook|
39
+ hook.call(modified, added, removed, streams: @streams)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def request_is_html?(headers)
46
+ headers["content-type"]&.start_with?("text/html")
47
+ end
48
+
49
+ def leads_to_injectable_body?(path)
50
+ path !~ /.+\/sandbox/
51
+ end
52
+
53
+ def inject_hot_reload_javascript(body)
54
+ @script_injector&.inject(body: body, dir: __dir__, mode: @mode)
55
+ end
56
+
57
+ def create_stream
58
+ stream = @streams.new
59
+
60
+ @ctx.debug("[HotReload] Connected to SSE stream")
61
+
62
+ [
63
+ 200,
64
+ {
65
+ "Content-Type" => "text/event-stream",
66
+ "Cache-Control" => "no-cache",
67
+ "webrick.chunked" => true,
68
+ },
69
+ stream,
70
+ ]
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end