Current section

14 Versions

Jump to

Compare versions

119 files changed
+32576 additions
-56 deletions
  @@ -1,4 +1,82 @@
1 - # Used by "mix format"
2 - [
3 - inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
1 + locals_without_parens = [
2 + # Combo.Endpoint
3 + plug: 1,
4 + plug: 2,
5 + socket: 2,
6 + socket: 3,
7 +
8 + # Combo.Router
9 + connect: 3,
10 + connect: 4,
11 + delete: 3,
12 + delete: 4,
13 + forward: 2,
14 + forward: 3,
15 + forward: 4,
16 + get: 3,
17 + get: 4,
18 + head: 3,
19 + head: 4,
20 + match: 4,
21 + match: 5,
22 + options: 3,
23 + options: 4,
24 + patch: 3,
25 + patch: 4,
26 + pipeline: 2,
27 + pipe_through: 1,
28 + post: 3,
29 + post: 4,
30 + put: 3,
31 + put: 4,
32 + resources: 2,
33 + resources: 3,
34 + resources: 4,
35 + trace: 4,
36 +
37 + # Combo.Controller
38 + action_fallback: 1,
39 +
40 + # Combo.Template
41 + embed_templates: 1,
42 + embed_templates: 2,
43 +
44 + # Combo.HTML
45 + attr: 2,
46 + attr: 3,
47 + slot: 1,
48 + slot: 2,
49 + slot: 3,
50 +
51 + # Combo.Socket
52 + channel: 2,
53 + channel: 3,
54 +
55 + # Combo.Channel
56 + intercept: 1,
57 +
58 + # Combo.ConnTest
59 + assert_error_sent: 2,
60 +
61 + # Combo.ChannelTest
62 + assert_broadcast: 2,
63 + assert_broadcast: 3,
64 + assert_push: 2,
65 + assert_push: 3,
66 + assert_reply: 2,
67 + assert_reply: 3,
68 + assert_reply: 4,
69 + refute_broadcast: 2,
70 + refute_broadcast: 3,
71 + refute_push: 2,
72 + refute_push: 3,
73 + refute_reply: 2,
74 + refute_reply: 3,
75 + refute_reply: 4
76 + ]
77 +
78 + [
79 + locals_without_parens: locals_without_parens,
80 + export: [locals_without_parens: locals_without_parens],
81 + plugins: [Combo.HTML.Formatter]
4 82 ]
  @@ -0,0 +1 @@
1 + # Changelog
  @@ -0,0 +1,22 @@
1 + The MIT License
2 +
3 + Copyright (c) 2014-2025 Chris McCord
4 + Copyright (c) 2025-now Zeke Dou
5 +
6 + Permission is hereby granted, free of charge, to any person obtaining a copy
7 + of this software and associated documentation files (the "Software"), to deal
8 + in the Software without restriction, including without limitation the rights
9 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 + copies of the Software, and to permit persons to whom the Software is
11 + furnished to do so, subject to the following conditions:
12 +
13 + The above copyright notice and this permission notice shall be included in all
14 + copies or substantial portions of the Software.
15 +
16 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 + SOFTWARE.
  @@ -1,20 +1,65 @@
1 1 # Combo
2 2
3 - An opinionated code generator for Phoenix.
3 + Combines the good parts of modern web development.
4 4
5 - ## Installation
5 + [![Build Status](https://github.com/combo-team/combo/workflows/CI/badge.svg)](https://github.com/combo-team/combo/actions/workflows/ci.yml) [![Hex.pm](https://img.shields.io/hexpm/v/combo.svg)](https://hex.pm/packages/combo)
6 6
7 - If [available in Hex](https://hex.pm/docs/publish), the package can be installed
8 - by adding `combo` to your list of dependencies in `mix.exs`:
7 + ## About
9 8
10 - ```elixir
11 - def deps do
12 - [
13 - {:combo, "~> 0.1.0"}
14 - ]
15 - end
9 + Combo started as a fork of Phoenix. Its goals includes:
10 +
11 + - being a typical MVC framework.
12 + - integrating with the modern frontend tooling.
13 + - ...
14 +
15 + To archive the goals, it:
16 +
17 + - merges closely related dependencies, such as `phoenix_template`, `phoenix_html`, `phoenix_live_reload` etc.
18 + - merges the HEEx engine-related code from `phoenix_live_view` and completely removes the dependency on `phoenix_live_view`.
19 + - provides packages for integrating with the modern frontend tooling.
20 + - ...
21 +
22 + Although Combo is forked from Phoenix and will continue to track upstream changes in the future, full compatibility between the two is not guaranteed.
23 +
24 + ## Getting started
25 +
26 + Read the [documentation](https://hexdocs.pm/combo).
27 +
28 + ## Contributing
29 +
30 + We appreciate any contribution to Combo. Check our [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) and [CONTRIBUTING.md](CONTRIBUTING.md) guides for more information. We usually keep a list of features and bugs in the [issue tracker][4].
31 +
32 + ### Building from source
33 +
34 + To build Combo only:
35 +
36 + ```console
37 + $ mix deps.get
38 + $ mix compile
16 39 ```
17 40
18 - Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
19 - and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
20 - be found at <https://hexdocs.pm/combo>.
41 + To build Combo.js only:
42 +
43 + ```console
44 + $ mix assets.deps.get
45 + $ mix assets.build
46 + ```
47 +
48 + To build Combo and Combo.js together:
49 +
50 + ```bash
51 + $ mix setup
52 + $ mix compile
53 + $ mix assets.build
54 + ```
55 +
56 + To build the documentation:
57 +
58 + ```console
59 + $ mix setup
60 + $ mix docs
61 + ```
62 +
63 + ## License
64 +
65 + [MIT](LICENSE.txt)
  @@ -1,12 +1,150 @@
1 - {<<"links">>,[{<<"GitHub">>,<<"https://github.com/cozy-elixir/combo">>}]}.
1 + {<<"links">>,[{<<"GitHub">>,<<"https://github.com/combo-team/combo">>}]}.
2 2 {<<"name">>,<<"combo">>}.
3 - {<<"version">>,<<"0.1.0">>}.
4 - {<<"description">>,<<"An opinionated code generator for Phoenix.">>}.
5 - {<<"elixir">>,<<"~> 1.14">>}.
3 + {<<"version">>,<<"0.2.0">>}.
4 + {<<"description">>,<<"Combines the good parts of modern web development.">>}.
5 + {<<"elixir">>,<<"~> 1.18">>}.
6 6 {<<"app">>,<<"combo">>}.
7 - {<<"licenses">>,[<<"Apache-2.0">>]}.
8 - {<<"requirements">>,[]}.
7 + {<<"licenses">>,[<<"MIT">>]}.
9 8 {<<"files">>,
10 - [<<"lib">>,<<"lib/combo.ex">>,<<".formatter.exs">>,<<"mix.exs">>,
11 - <<"README.md">>]}.
9 + [<<"lib">>,<<"lib/mix">>,<<"lib/mix/tasks">>,
10 + <<"lib/mix/tasks/combo_digest_clean.ex">>,
11 + <<"lib/mix/tasks/combo_gen_secret.ex">>,<<"lib/mix/tasks/combo_serve.ex">>,
12 + <<"lib/mix/tasks/combo_routes.ex">>,<<"lib/mix/tasks/combo.ex">>,
13 + <<"lib/mix/tasks/combo_digest.ex">>,<<"lib/combo.ex">>,<<"lib/combo">>,
14 + <<"lib/combo/filtered_params.ex">>,<<"lib/combo/naming.ex">>,
15 + <<"lib/combo/html.ex">>,<<"lib/combo/channel.ex">>,
16 + <<"lib/combo/verified_routes.ex">>,<<"lib/combo/safe_html.ex">>,
17 + <<"lib/combo/code_reloader">>,<<"lib/combo/code_reloader/proxy.ex">>,
18 + <<"lib/combo/code_reloader/mix_listener.ex">>,
19 + <<"lib/combo/code_reloader/server.ex">>,<<"lib/combo/param.ex">>,
20 + <<"lib/combo/live_reloader.ex">>,<<"lib/combo/test">>,
21 + <<"lib/combo/test/html_test.ex">>,<<"lib/combo/test/html_test">>,
22 + <<"lib/combo/test/html_test/dom.ex">>,<<"lib/combo/test/channel_test.ex">>,
23 + <<"lib/combo/test/conn_test.ex">>,<<"lib/combo/presence.ex">>,
24 + <<"lib/combo/logger.ex">>,<<"lib/combo/transports">>,
25 + <<"lib/combo/transports/long_poll.ex">>,
26 + <<"lib/combo/transports/long_poll_server.ex">>,
27 + <<"lib/combo/transports/websocket.ex">>,<<"lib/combo/template">>,
28 + <<"lib/combo/template/exs_engine.ex">>,<<"lib/combo/template/ceex_engine">>,
29 + <<"lib/combo/template/ceex_engine/slot.ex">>,
30 + <<"lib/combo/template/ceex_engine/syntax_error.ex">>,
31 + <<"lib/combo/template/ceex_engine/formatter.ex">>,
32 + <<"lib/combo/template/ceex_engine/compiler.ex">>,
33 + <<"lib/combo/template/ceex_engine/declarative_assigns.ex">>,
34 + <<"lib/combo/template/ceex_engine/formatter">>,
35 + <<"lib/combo/template/ceex_engine/formatter/html_algebra.ex">>,
36 + <<"lib/combo/template/ceex_engine/assigns.ex">>,
37 + <<"lib/combo/template/ceex_engine/sigil.ex">>,
38 + <<"lib/combo/template/ceex_engine/tokenizer.ex">>,
39 + <<"lib/combo/template/ceex_engine/compiler">>,
40 + <<"lib/combo/template/ceex_engine/compiler/assigns.ex">>,
41 + <<"lib/combo/template/ceex_engine/compiler/attr.ex">>,
42 + <<"lib/combo/template/ceex_engine/compiler/io_builder.ex">>,
43 + <<"lib/combo/template/ceex_engine/compiler/debug_annotation.ex">>,
44 + <<"lib/combo/template/ceex_engine/compiler/engine.ex">>,
45 + <<"lib/combo/template/html_encoder.ex">>,
46 + <<"lib/combo/template/ceex_engine.ex">>,
47 + <<"lib/combo/template/format_encoder.ex">>,
48 + <<"lib/combo/template/eex_engine.ex">>,<<"lib/combo/template/engine.ex">>,
49 + <<"lib/combo/env.ex">>,<<"lib/combo/config.ex">>,<<"lib/combo/safe_html">>,
50 + <<"lib/combo/safe_html/escape.ex">>,<<"lib/combo/safe_html/safe.ex">>,
51 + <<"lib/combo/token.ex">>,<<"lib/combo/html">>,
52 + <<"lib/combo/html/form_field.ex">>,<<"lib/combo/html/formatter.ex">>,
53 + <<"lib/combo/html/components.ex">>,<<"lib/combo/html/form_data.ex">>,
54 + <<"lib/combo/html/form.ex">>,<<"lib/combo/controller.ex">>,
55 + <<"lib/combo/controller">>,<<"lib/combo/controller/pipeline.ex">>,
56 + <<"lib/combo/code_reloader.ex">>,<<"lib/combo/router.ex">>,
57 + <<"lib/combo/channel">>,<<"lib/combo/channel/server.ex">>,
58 + <<"lib/combo/conn.ex">>,<<"lib/combo/socket.ex">>,<<"lib/combo/digester">>,
59 + <<"lib/combo/digester/gzip.ex">>,<<"lib/combo/digester/compressor.ex">>,
60 + <<"lib/combo/endpoint">>,<<"lib/combo/endpoint/adapter.ex">>,
61 + <<"lib/combo/endpoint/supervisor.ex">>,
62 + <<"lib/combo/endpoint/cowboy2_adapter.ex">>,
63 + <<"lib/combo/endpoint/bandit_adapter.ex">>,
64 + <<"lib/combo/endpoint/watcher.ex">>,
65 + <<"lib/combo/endpoint/render_errors.ex">>,
66 + <<"lib/combo/endpoint/sync_code_reload_plug.ex">>,
67 + <<"lib/combo/endpoint.ex">>,<<"lib/combo/digester.ex">>,
68 + <<"lib/combo/helpers">>,<<"lib/combo/helpers/keyword_helper.ex">>,
69 + <<"lib/combo/debug.ex">>,<<"lib/combo/exceptions.ex">>,
70 + <<"lib/combo/socket">>,<<"lib/combo/socket/message.ex">>,
71 + <<"lib/combo/socket/transport.ex">>,<<"lib/combo/socket/serializers">>,
72 + <<"lib/combo/socket/serializers/v1_json_serializer.ex">>,
73 + <<"lib/combo/socket/serializers/v2_json_serializer.ex">>,
74 + <<"lib/combo/socket/pool_supervisor.ex">>,
75 + <<"lib/combo/socket/serializer.ex">>,<<"lib/combo/live_reloader">>,
76 + <<"lib/combo/live_reloader/channel.ex">>,
77 + <<"lib/combo/live_reloader/server.ex">>,
78 + <<"lib/combo/live_reloader/socket.ex">>,<<"lib/combo/flash.ex">>,
79 + <<"lib/combo/template.ex">>,<<"lib/combo/router">>,
80 + <<"lib/combo/router/route.ex">>,<<"lib/combo/router/console_formatter.ex">>,
81 + <<"lib/combo/router/resource.ex">>,<<"lib/combo/router/scope.ex">>,
82 + <<"mix.exs">>,<<"priv">>,<<"priv/logo">>,<<"priv/logo/combo.svg">>,
83 + <<"priv/static">>,<<"priv/static/html.js">>,<<"priv/static/html.js.map">>,
84 + <<"priv/static/socket.min.js.map">>,<<"priv/static/html.esm.js.map">>,
85 + <<"priv/static/socket.min.js">>,<<"priv/static/html.min.js">>,
86 + <<"priv/static/socket.js.map">>,<<"priv/static/socket.cjs.js.map">>,
87 + <<"priv/static/socket.js">>,<<"priv/static/live_reloader.min.js.map">>,
88 + <<"priv/static/html.min.js.map">>,<<"priv/static/socket.esm.js">>,
89 + <<"priv/static/socket.esm.js.map">>,<<"priv/static/live_reloader.min.js">>,
90 + <<"priv/static/html.cjs.js">>,<<"priv/static/html.esm.js">>,
91 + <<"priv/static/socket.cjs.js">>,<<"priv/static/html.cjs.js.map">>,
92 + <<"package.json">>,<<".formatter.exs">>,<<"README.md">>,<<"CHANGELOG.md">>,
93 + <<"LICENSE.txt">>]}.
94 + {<<"requirements">>,
95 + [[{<<"name">>,<<"plug">>},
96 + {<<"app">>,<<"plug">>},
97 + {<<"optional">>,false},
98 + {<<"requirement">>,<<"~> 1.14">>},
99 + {<<"repository">>,<<"hexpm">>}],
100 + [{<<"name">>,<<"plug_crypto">>},
101 + {<<"app">>,<<"plug_crypto">>},
102 + {<<"optional">>,false},
103 + {<<"requirement">>,<<"~> 1.2 or ~> 2.0">>},
104 + {<<"repository">>,<<"hexpm">>}],
105 + [{<<"name">>,<<"telemetry">>},
106 + {<<"app">>,<<"telemetry">>},
107 + {<<"optional">>,false},
108 + {<<"requirement">>,<<"~> 0.4 or ~> 1.0">>},
109 + {<<"repository">>,<<"hexpm">>}],
110 + [{<<"name">>,<<"phoenix_pubsub">>},
111 + {<<"app">>,<<"phoenix_pubsub">>},
112 + {<<"optional">>,false},
113 + {<<"requirement">>,<<"~> 2.1">>},
114 + {<<"repository">>,<<"hexpm">>}],
115 + [{<<"name">>,<<"websock_adapter">>},
116 + {<<"app">>,<<"websock_adapter">>},
117 + {<<"optional">>,false},
118 + {<<"requirement">>,<<"~> 0.5.3">>},
119 + {<<"repository">>,<<"hexpm">>}],
120 + [{<<"name">>,<<"file_system">>},
121 + {<<"app">>,<<"file_system">>},
122 + {<<"optional">>,false},
123 + {<<"requirement">>,<<"~> 1.0">>},
124 + {<<"repository">>,<<"hexpm">>}],
125 + [{<<"name">>,<<"lazy_html">>},
126 + {<<"app">>,<<"lazy_html">>},
127 + {<<"optional">>,false},
128 + {<<"requirement">>,<<"~> 0.1.0">>},
129 + {<<"repository">>,<<"hexpm">>}],
130 + [{<<"name">>,<<"plug_cowboy">>},
131 + {<<"app">>,<<"plug_cowboy">>},
132 + {<<"optional">>,true},
133 + {<<"requirement">>,<<"~> 2.7">>},
134 + {<<"repository">>,<<"hexpm">>}],
135 + [{<<"name">>,<<"bandit">>},
136 + {<<"app">>,<<"bandit">>},
137 + {<<"optional">>,true},
138 + {<<"requirement">>,<<"~> 1.0">>},
139 + {<<"repository">>,<<"hexpm">>}],
140 + [{<<"name">>,<<"jason">>},
141 + {<<"app">>,<<"jason">>},
142 + {<<"optional">>,true},
143 + {<<"requirement">>,<<"~> 1.0">>},
144 + {<<"repository">>,<<"hexpm">>}],
145 + [{<<"name">>,<<"decimal">>},
146 + {<<"app">>,<<"decimal">>},
147 + {<<"optional">>,true},
148 + {<<"requirement">>,<<"~> 2.0">>},
149 + {<<"repository">>,<<"hexpm">>}]]}.
12 150 {<<"build_tools">>,[<<"mix">>]}.
Loading more files…