├── .github
└── FUNDING.yml
├── src
└── leiningen
│ └── new
│ ├── figwheel
│ ├── style.css
│ ├── webpack.config.js
│ ├── gitignore
│ ├── package.json
│ ├── index.html
│ ├── README.md
│ ├── user.clj
│ ├── core.cljs
│ └── project.clj
│ └── figwheel.clj
├── .gitignore
├── project.clj
├── README.md
└── LICENSE
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: [bhauman]
2 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/style.css:
--------------------------------------------------------------------------------
1 | /* some style */
2 |
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 | /classes
3 | /checkouts
4 | pom.xml
5 | pom.xml.asc
6 | *.jar
7 | *.class
8 | /.lein-*
9 | /.nrepl-port
10 | hello_world
11 | hello-world
12 | \.\#*
13 | \#*
14 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/webpack.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | entry: "./resources/public/js/compiled/out/index.js",
3 | output: {
4 | path: __dirname + "/resources/public/js/compiled",
5 | filename: "{{sanitized}}.js"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/gitignore:
--------------------------------------------------------------------------------
1 | /resources/public/js/compiled/**
2 | figwheel_server.log
3 | pom.xml
4 | *jar
5 | /lib/
6 | /classes/
7 | /out/
8 | /target/
9 | .lein-deps-sum
10 | .lein-repl-history
11 | .lein-plugins/
12 | .repl
13 | .nrepl-port
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "webpack": "^4.43.0",
4 | "webpack-cli": "^3.3.11"
5 | }{{#reactdep?}},
6 | "dependencies": {
7 | "react": "^16.13.1",
8 | "react-dom": "^16.13.1"
9 | }{{/reactdep?}}
10 | }
11 |
--------------------------------------------------------------------------------
/project.clj:
--------------------------------------------------------------------------------
1 | (defproject figwheel/lein-template "0.5.20-5"
2 | :description "A Leinigen template for figwheel"
3 | :url "https://github.com/bhauman/figwheel-template"
4 | :license {:name "Eclipse Public License"
5 | :url "http://www.eclipse.org/legal/epl-v10.html"}
6 | :scm { :name "git"
7 | :url "https://github.com/bhauman/figwheel-template"}
8 | :eval-in-leiningen true)
9 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
Figwheel template
12 |
Checkout your developer console.
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/README.md:
--------------------------------------------------------------------------------
1 | # {{name}}
2 |
3 | FIXME: Write a one-line description of your library/project.
4 |
5 | ## Overview
6 |
7 | FIXME: Write a paragraph about the library/project and highlight its goals.
8 |
9 | ## Setup
10 |
11 | To get an interactive development environment run:
12 |
13 | {{#bundle?}}
14 | npm install{{/bundle?}}
15 | lein figwheel
16 |
17 | and open your browser at [localhost:3449](http://localhost:3449/).
18 | This will auto compile and send all changes to the browser without the
19 | need to reload. After the compilation process is complete, you will
20 | get a Browser Connected REPL. An easy way to try it is:
21 |
22 | (js/alert "Am I connected?")
23 |
24 | and you should see an alert in the browser window.
25 |
26 | To clean all compiled files:
27 |
28 | lein clean
29 |
30 | To create a production build run:
31 |
32 | lein do clean, cljsbuild once min
33 |
34 | And open your browser in `resources/public/index.html`. You will not
35 | get live reloading, nor a REPL.
36 |
37 | ## License
38 |
39 | Copyright © 2014 FIXME
40 |
41 | Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.
42 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/user.clj:
--------------------------------------------------------------------------------
1 | (ns user
2 | (:require
3 | [figwheel-sidecar.repl-api :as f]))
4 |
5 | ;; user is a namespace that the Clojure runtime looks for and
6 | ;; loads if its available
7 |
8 | ;; You can place helper functions in here. This is great for starting
9 | ;; and stopping your webserver and other development services
10 |
11 | ;; The definitions in here will be available if you run "lein repl" or launch a
12 | ;; Clojure repl some other way
13 |
14 | ;; You have to ensure that the libraries you :require are listed in your dependencies
15 |
16 | ;; Once you start down this path
17 | ;; you will probably want to look at
18 | ;; tools.namespace https://github.com/clojure/tools.namespace
19 | ;; and Component https://github.com/stuartsierra/component
20 |
21 |
22 | (defn fig-start
23 | "This starts the figwheel server and watch based auto-compiler."
24 | []
25 | ;; this call will only work as long as your :cljsbuild and
26 | ;; :figwheel configurations are at the top level of your project.clj
27 | ;; and are not spread across different lein profiles
28 |
29 | ;; otherwise you can pass a configuration into start-figwheel! manually
30 | (f/start-figwheel!))
31 |
32 | (defn fig-stop
33 | "Stop the figwheel server and watch based auto-compiler."
34 | []
35 | (f/stop-figwheel!))
36 |
37 | ;; if you are in an nREPL environment you will need to make sure you
38 | ;; have setup piggieback for this to work
39 | (defn cljs-repl
40 | "Launch a ClojureScript REPL that is connected to your build and host environment."
41 | []
42 | (f/cljs-repl))
43 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/core.cljs:
--------------------------------------------------------------------------------
1 | (ns {{name}}.core
2 | (:require {{#react?}}[react]
3 | [react-dom]
4 | [sablono.core :as sab :include-macros true]{{/react?}}{{#reagent?}}
5 | [reagent.core :as reagent :refer [atom]]
6 | [reagent.dom :as rd]{{/reagent?}}{{#rum?}}[rum.core :as rum]{{/rum?}}))
7 |
8 | (enable-console-print!)
9 |
10 | (println "This text is printed from src/{{name}}/core.cljs. Go ahead and edit it and see reloading in action.")
11 |
12 | ;; define your app data so that it doesn't get over-written on reload
13 |
14 | (defonce app-state (atom {:text "Hello world!"}))
15 |
16 | {{#react?}}
17 | (defn hello-world [state]
18 | (sab/html [:div
19 | [:h1 (:text @state)]
20 | [:h3 "Edit this and watch it change!"]]))
21 |
22 | ({{#bundle?}}react-dom/render{{/bundle?}}{{^bundle?}}js/ReactDOM.render{{/bundle?}}
23 | (hello-world app-state)
24 | (. js/document (getElementById "app")))
25 | {{/react?}}{{#reagent?}}
26 | (defn hello-world []
27 | [:div
28 | [:h1 (:text @app-state)]
29 | [:h3 "Edit this and watch it change!"]])
30 |
31 | (rd/render [hello-world]
32 | (. js/document (getElementById "app")))
33 | {{/reagent?}}{{#rum?}}
34 | (rum/defc hello-world []
35 | [:div
36 | [:h1 (:text @app-state)]
37 | [:h3 "Edit this and watch it change!"]])
38 |
39 | (rum/mount (hello-world)
40 | (. js/document (getElementById "app")))
41 | {{/rum?}}
42 |
43 | (defn on-js-reload []
44 | ;; optionally touch your app-state to force rerendering depending on
45 | ;; your application
46 | ;; (swap! app-state update-in [:__figwheel_counter] inc)
47 | )
48 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # figwheel-template
2 |
3 | A Leinigen template to get started with [Figwheel](https://github.com/bhauman/lein-figwheel).
4 |
5 | ## Usage
6 |
7 | Make sure you have the [latest version of leiningen installed](https://github.com/technomancy/leiningen#installation).
8 |
9 |
10 | lein new figwheel hello-world
11 |
12 | ### Options
13 |
14 | --react Adds a bare bones React app, including Sablono.
15 | --reagent Adds a bare bones Reagent app.
16 | --rum Adds a bare bones Rum app.
17 | +bundle Generates a project with npm and webpack support.
18 |
19 | Include the options using `--` to separate them from Leiningens
20 | options, like so
21 |
22 | lein new figwheel hello-world -- --reagent
23 |
24 | ## Usage
25 |
26 | To get an interactive development environment run
27 |
28 | npm install
29 |
30 | and then
31 |
32 | lein figwheel
33 |
34 | from the project root directory.
35 |
36 | Wait ... until the project finishes compiling and then ...
37 | open your browser at [localhost:3449/index.html](http://localhost:3449/index.html).
38 |
39 | Figwheel will now be running and will auto compile and send all
40 | changes to the browser without the need to reload.
41 |
42 | After the compilation process is complete, and you have loaded the
43 | compiled project in your browser you will get a ClojureScript REPL
44 | prompt that is connected to the browser.
45 |
46 | An easy way to verify this is:
47 |
48 | (js/alert "Am I connected?")
49 |
50 | and you should see an alert in the browser window.
51 |
52 | To clean all compiled files:
53 |
54 | lein clean
55 |
56 | To create a production build run:
57 |
58 | lein do clean, cljsbuild once min
59 |
60 | And open your browser in `resources/public/index.html`. You will not
61 | get live reloading, nor a REPL.
62 |
63 | ## Npm dependencies
64 |
65 | The generated project is compatible with Webpack and npm and you can
66 | add JavaScript dependencies via the normal `npm install` route.
67 |
68 | ## From the Clojure REPL
69 |
70 | Alternatively you can lauch Figwheel from the REPL.
71 |
72 | If you run `lein repl` a Clojure REPL will launch.
73 |
74 | From this REPL prompt you can run
75 |
76 | ```
77 | user> (fig-start)
78 | ```
79 |
80 | and this will launch figwheel but will not launch the ClojureScript
81 | REPL.
82 |
83 | You can launch the Figwheel ClojureScript REPL like so:
84 |
85 | ```
86 | user> (cljs-repl)
87 | ```
88 |
89 | Please see `dev/user.clj` for more information.
90 |
91 | Note: you should always run `lein figwheel` to verify that you have
92 | setup everything correctly.
93 |
94 |
95 | ## License
96 |
97 | Copyright © 2020 Bruce Hauman
98 |
99 | Distributed under the Eclipse Public License either version 1.0 or (at
100 | your option) any later version.
101 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel/project.clj:
--------------------------------------------------------------------------------
1 | (defproject {{ name }} "0.1.0-SNAPSHOT"
2 | :description "FIXME: write this!"
3 | :url "http://example.com/FIXME"
4 | :license {:name "Eclipse Public License"
5 | :url "http://www.eclipse.org/legal/epl-v10.html"}
6 |
7 | :min-lein-version "2.9.1"
8 |
9 | :dependencies [[org.clojure/clojure "1.10.0"]
10 | [org.clojure/clojurescript "1.10.773"]
11 | [org.clojure/core.async "0.4.500"]{{#react?}}
12 | {{^bundle?}}[cljsjs/react "16.6.0-0"]
13 | [cljsjs/react-dom "16.6.0-0"]{{/bundle?}}
14 | [sablono "0.8.6"]{{/react?}}{{#reagent?}}
15 | [reagent "0.10.0"{{#bundle?}} :exclusions [cljsjs/react cljsjs/react-dom cljsjs/react-dom-server]{{/bundle?}}]{{/reagent?}}{{#rum?}}
16 | [rum "0.11.5"]{{/rum?}}]
17 |
18 | :plugins [[lein-figwheel "0.5.20"]
19 | [lein-cljsbuild "1.1.7" :exclusions [[org.clojure/clojure]]]]
20 |
21 | :source-paths ["src"]
22 |
23 | :cljsbuild {:builds
24 | [{:id "dev"
25 | :source-paths ["src"]
26 |
27 | ;; The presence of a :figwheel configuration here
28 | ;; will cause figwheel to inject the figwheel client
29 | ;; into your build
30 | :figwheel {:on-jsload "{{name}}.core/on-js-reload"
31 | ;; :open-urls will pop open your application
32 | ;; in the default browser once Figwheel has
33 | ;; started and compiled your application.
34 | ;; Comment this out once it no longer serves you.
35 | :open-urls ["http://localhost:3449/index.html"]}
36 |
37 | :compiler {:main {{name}}.core{{#bundle?}}
38 | :target :bundle{{/bundle?}}
39 | :asset-path "js/compiled/out"
40 | :output-to "resources/public/js/compiled/{{^bundle?}}{{sanitized}}.js{{/bundle?}}{{#bundle?}}out/index.js{{/bundle?}}"
41 | :output-dir "resources/public/js/compiled/out"
42 | {{#bundle?}}:bundle-cmd {:none ["{{npx-command}}" "webpack" "--mode=development"]
43 | :default ["{{npx-command}}" "webpack"]}
44 | {{/bundle?}}:source-map-timestamp true
45 | ;; To console.log CLJS data-structures make sure you enable devtools in Chrome
46 | ;; https://github.com/binaryage/cljs-devtools
47 | :preloads [devtools.preload]}}
48 | ;; This next build is a compressed minified build for
49 | ;; production. You can build this with:
50 | ;; lein cljsbuild once min
51 | {:id "min"
52 | :source-paths ["src"]
53 | :compiler {:output-to "resources/public/js/compiled/{{sanitized}}.js"
54 | :main {{name}}.core
55 | :optimizations :advanced
56 | :pretty-print false}}]}
57 |
58 | :figwheel {;; :http-server-root "public" ;; default and assumes "resources"
59 | ;; :server-port 3449 ;; default
60 | ;; :server-ip "127.0.0.1"
61 |
62 | :css-dirs ["resources/public/css"] ;; watch and update CSS
63 |
64 | ;; Start an nREPL server into the running figwheel process
65 | ;; :nrepl-port 7888
66 |
67 | ;; Server Ring Handler (optional)
68 | ;; if you want to embed a ring handler into the figwheel http-kit
69 | ;; server, this is for simple ring servers, if this
70 |
71 | ;; doesn't work for you just run your own server :) (see lein-ring)
72 |
73 | ;; :ring-handler hello_world.server/handler
74 |
75 | ;; To be able to open files in your editor from the heads up display
76 | ;; you will need to put a script on your path.
77 | ;; that script will have to take a file path and a line number
78 | ;; ie. in ~/bin/myfile-opener
79 | ;; #! /bin/sh
80 | ;; emacsclient -n +$2 $1
81 | ;;
82 | ;; :open-file-command "myfile-opener"
83 |
84 | ;; if you are using emacsclient you can just use
85 | ;; :open-file-command "emacsclient"
86 |
87 | ;; if you want to disable the REPL
88 | ;; :repl false
89 |
90 | ;; to configure a different figwheel logfile path
91 | ;; :server-logfile "tmp/logs/figwheel-logfile.log"
92 |
93 | ;; to pipe all the output to the repl
94 | ;; :server-logfile false
95 | }
96 |
97 | :profiles {:dev {:dependencies [[binaryage/devtools "1.0.0"]
98 | [figwheel-sidecar "0.5.20"]]
99 | ;; need to add dev source path here to get user.clj loaded
100 | :source-paths ["src" "dev"]
101 | ;; need to add the compiled assets to the :clean-targets
102 | :clean-targets ^{:protect false} ["resources/public/js/compiled"
103 | :target-path]}})
104 |
--------------------------------------------------------------------------------
/src/leiningen/new/figwheel.clj:
--------------------------------------------------------------------------------
1 | (ns leiningen.new.figwheel
2 | (:require [leiningen.new.templates :refer [renderer name-to-path ->files]]
3 | [leiningen.core.main :as main]
4 | [clojure.string :as string]))
5 |
6 | (def render (renderer "figwheel"))
7 |
8 | (defn os? []
9 | (let [os-name
10 | (-> (System/getProperty "os.name" "generic")
11 | (.toLowerCase java.util.Locale/ENGLISH))
12 | has? #(>= (.indexOf %1 %2) 0)]
13 | (cond
14 | (or (has? os-name "mac")
15 | (has? os-name "darwin")) :macos
16 | (has? os-name "win") :windows
17 | (has? os-name "nux") :linux
18 | :else :other)))
19 |
20 | ;; Check if om or reagent are in the options
21 | ;; Copied from: https://github.com/plexus/chestnut/blob/master/src/leiningen/new/chestnut.clj
22 |
23 | ;; I copy this levenshtein impl everywhere
24 | (defn- next-row
25 | [previous current other-seq]
26 | (reduce
27 | (fn [row [diagonal above other]]
28 | (let [update-val (if (= other current)
29 | diagonal
30 | (inc (min diagonal above (peek row))))]
31 | (conj row update-val)))
32 | [(inc (first previous))]
33 | (map vector previous (next previous) other-seq)))
34 |
35 | (defn- levenshtein
36 | [sequence1 sequence2]
37 | (peek
38 | (reduce (fn [previous current] (next-row previous current sequence2))
39 | (map #(identity %2) (cons nil sequence2) (range))
40 | sequence1)))
41 |
42 | (defn- similar [ky ky2]
43 | (let [dist (levenshtein (str ky) (str ky2))]
44 | (when (<= dist 2) dist)))
45 |
46 | (def supported-frameworks #{"reagent" "rum" "react"})
47 |
48 | (def framework-opts (set (map #(str "--" %) supported-frameworks)))
49 |
50 | (def supported-attributes #{"bundle"})
51 |
52 | (def attribute-opts (set (map #(str "+" %) supported-attributes)))
53 |
54 | (defn similar-options [opt]
55 | (second (first (sort-by first
56 | (filter first (map (juxt (partial similar opt) identity)
57 | (concat framework-opts attribute-opts)))))))
58 |
59 | (defn parse-opts [opts]
60 | (reduce (fn [accum opt]
61 | (cond
62 | (framework-opts opt) (assoc accum :framework (keyword (subs opt 2)))
63 | (attribute-opts opt) (update accum :attributes
64 | (fnil conj #{})
65 | (keyword (subs opt 1)))
66 | :else
67 | (let [suggestion (similar-options opt)]
68 | (throw
69 | (ex-info (format "Unknown option '%s' %s"
70 | opt
71 | (str
72 | (when suggestion
73 | (format "\n --> Perhaps you intended to use the '%s' option?" suggestion))))
74 | {:opts opts
75 | ::error true})))))
76 | {} opts))
77 |
78 | #_ (parse-opts ["--om" "+no-bundle"])
79 |
80 | (defn figwheel
81 | "Takes a name and options with the form --option and produces an interactive
82 | ClojureScript + Figwheel template.
83 | The valid options are:
84 | --react which adds a minimal Ract application in core.cljs
85 | --reagent which adds a minimal Reagent application in core.cljs
86 | --rum which adds a minimal Rum application in core.cljs
87 | +bundle include npm bundle support
88 | Only one option can be specified at a time. If no option is specified,
89 | nothing but a print statment is added in core.cljs"
90 | [name & opts]
91 | (do
92 | (when (= name "figwheel")
93 | (main/abort
94 | (str "Cannot name a figwheel project \"figwheel\" the namespace will clash.\n"
95 | "Please choose a different name, maybe \"tryfig\"?")))
96 | (let [{:keys [framework attributes]} (parse-opts opts)
97 | bundle? (get attributes :bundle false)
98 | data {:name name
99 | :sanitized (name-to-path name)
100 | :react? (= :react framework)
101 | :reagent? (= :reagent framework)
102 | :rum? (= :rum framework)
103 | :npx-command (if (= :windows (os?)) "npx.cmd" "npx")
104 | :bundle? bundle?
105 | :reactdep? (boolean (#{:om :react :reagent} framework))}]
106 | (main/info (str "Generating fresh 'lein new' figwheel project.\n\n"
107 | "Change into your '" name "' directory\n\n"
108 | (when bundle?
109 | "Install npm dependencies via 'npm install'\n")
110 | "Then run 'lein figwheel'\n"
111 | "Wait for it to finish compiling\n"
112 | "A browser window should open to the demo application, if not\n"
113 | "then open 'http://localhost:3449/index.html' in your browser"))
114 | (apply ->files data
115 | (cond-> [["README.md" (render "README.md" data)]
116 | ["project.clj" (render "project.clj" data)]
117 | ["dev/user.clj" (render "user.clj" data)]
118 | ["src/{{sanitized}}/core.cljs" (render "core.cljs" data)]
119 | ["resources/public/index.html" (render "index.html" data)]
120 | ["resources/public/css/style.css" (render "style.css" data)]
121 | [".gitignore" (render "gitignore" data)]]
122 | bundle?
123 | (concat [["package.json" (render "package.json" data)]
124 | ["webpack.config.js" (render "webpack.config.js" data)]]))))))
125 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
2 | LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
3 | CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
4 |
5 | 1. DEFINITIONS
6 |
7 | "Contribution" means:
8 |
9 | a) in the case of the initial Contributor, the initial code and
10 | documentation distributed under this Agreement, and
11 |
12 | b) in the case of each subsequent Contributor:
13 |
14 | i) changes to the Program, and
15 |
16 | ii) additions to the Program;
17 |
18 | where such changes and/or additions to the Program originate from and are
19 | distributed by that particular Contributor. A Contribution 'originates' from
20 | a Contributor if it was added to the Program by such Contributor itself or
21 | anyone acting on such Contributor's behalf. Contributions do not include
22 | additions to the Program which: (i) are separate modules of software
23 | distributed in conjunction with the Program under their own license
24 | agreement, and (ii) are not derivative works of the Program.
25 |
26 | "Contributor" means any person or entity that distributes the Program.
27 |
28 | "Licensed Patents" mean patent claims licensable by a Contributor which are
29 | necessarily infringed by the use or sale of its Contribution alone or when
30 | combined with the Program.
31 |
32 | "Program" means the Contributions distributed in accordance with this
33 | Agreement.
34 |
35 | "Recipient" means anyone who receives the Program under this Agreement,
36 | including all Contributors.
37 |
38 | 2. GRANT OF RIGHTS
39 |
40 | a) Subject to the terms of this Agreement, each Contributor hereby grants
41 | Recipient a non-exclusive, worldwide, royalty-free copyright license to
42 | reproduce, prepare derivative works of, publicly display, publicly perform,
43 | distribute and sublicense the Contribution of such Contributor, if any, and
44 | such derivative works, in source code and object code form.
45 |
46 | b) Subject to the terms of this Agreement, each Contributor hereby grants
47 | Recipient a non-exclusive, worldwide, royalty-free patent license under
48 | Licensed Patents to make, use, sell, offer to sell, import and otherwise
49 | transfer the Contribution of such Contributor, if any, in source code and
50 | object code form. This patent license shall apply to the combination of the
51 | Contribution and the Program if, at the time the Contribution is added by the
52 | Contributor, such addition of the Contribution causes such combination to be
53 | covered by the Licensed Patents. The patent license shall not apply to any
54 | other combinations which include the Contribution. No hardware per se is
55 | licensed hereunder.
56 |
57 | c) Recipient understands that although each Contributor grants the licenses
58 | to its Contributions set forth herein, no assurances are provided by any
59 | Contributor that the Program does not infringe the patent or other
60 | intellectual property rights of any other entity. Each Contributor disclaims
61 | any liability to Recipient for claims brought by any other entity based on
62 | infringement of intellectual property rights or otherwise. As a condition to
63 | exercising the rights and licenses granted hereunder, each Recipient hereby
64 | assumes sole responsibility to secure any other intellectual property rights
65 | needed, if any. For example, if a third party patent license is required to
66 | allow Recipient to distribute the Program, it is Recipient's responsibility
67 | to acquire that license before distributing the Program.
68 |
69 | d) Each Contributor represents that to its knowledge it has sufficient
70 | copyright rights in its Contribution, if any, to grant the copyright license
71 | set forth in this Agreement.
72 |
73 | 3. REQUIREMENTS
74 |
75 | A Contributor may choose to distribute the Program in object code form under
76 | its own license agreement, provided that:
77 |
78 | a) it complies with the terms and conditions of this Agreement; and
79 |
80 | b) its license agreement:
81 |
82 | i) effectively disclaims on behalf of all Contributors all warranties and
83 | conditions, express and implied, including warranties or conditions of title
84 | and non-infringement, and implied warranties or conditions of merchantability
85 | and fitness for a particular purpose;
86 |
87 | ii) effectively excludes on behalf of all Contributors all liability for
88 | damages, including direct, indirect, special, incidental and consequential
89 | damages, such as lost profits;
90 |
91 | iii) states that any provisions which differ from this Agreement are offered
92 | by that Contributor alone and not by any other party; and
93 |
94 | iv) states that source code for the Program is available from such
95 | Contributor, and informs licensees how to obtain it in a reasonable manner on
96 | or through a medium customarily used for software exchange.
97 |
98 | When the Program is made available in source code form:
99 |
100 | a) it must be made available under this Agreement; and
101 |
102 | b) a copy of this Agreement must be included with each copy of the Program.
103 |
104 | Contributors may not remove or alter any copyright notices contained within
105 | the Program.
106 |
107 | Each Contributor must identify itself as the originator of its Contribution,
108 | if any, in a manner that reasonably allows subsequent Recipients to identify
109 | the originator of the Contribution.
110 |
111 | 4. COMMERCIAL DISTRIBUTION
112 |
113 | Commercial distributors of software may accept certain responsibilities with
114 | respect to end users, business partners and the like. While this license is
115 | intended to facilitate the commercial use of the Program, the Contributor who
116 | includes the Program in a commercial product offering should do so in a
117 | manner which does not create potential liability for other Contributors.
118 | Therefore, if a Contributor includes the Program in a commercial product
119 | offering, such Contributor ("Commercial Contributor") hereby agrees to defend
120 | and indemnify every other Contributor ("Indemnified Contributor") against any
121 | losses, damages and costs (collectively "Losses") arising from claims,
122 | lawsuits and other legal actions brought by a third party against the
123 | Indemnified Contributor to the extent caused by the acts or omissions of such
124 | Commercial Contributor in connection with its distribution of the Program in
125 | a commercial product offering. The obligations in this section do not apply
126 | to any claims or Losses relating to any actual or alleged intellectual
127 | property infringement. In order to qualify, an Indemnified Contributor must:
128 | a) promptly notify the Commercial Contributor in writing of such claim, and
129 | b) allow the Commercial Contributor tocontrol, and cooperate with the
130 | Commercial Contributor in, the defense and any related settlement
131 | negotiations. The Indemnified Contributor may participate in any such claim
132 | at its own expense.
133 |
134 | For example, a Contributor might include the Program in a commercial product
135 | offering, Product X. That Contributor is then a Commercial Contributor. If
136 | that Commercial Contributor then makes performance claims, or offers
137 | warranties related to Product X, those performance claims and warranties are
138 | such Commercial Contributor's responsibility alone. Under this section, the
139 | Commercial Contributor would have to defend claims against the other
140 | Contributors related to those performance claims and warranties, and if a
141 | court requires any other Contributor to pay any damages as a result, the
142 | Commercial Contributor must pay those damages.
143 |
144 | 5. NO WARRANTY
145 |
146 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON
147 | AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
148 | EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
149 | CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
150 | PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
151 | appropriateness of using and distributing the Program and assumes all risks
152 | associated with its exercise of rights under this Agreement , including but
153 | not limited to the risks and costs of program errors, compliance with
154 | applicable laws, damage to or loss of data, programs or equipment, and
155 | unavailability or interruption of operations.
156 |
157 | 6. DISCLAIMER OF LIABILITY
158 |
159 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
160 | CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
161 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
162 | LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
163 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
164 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
165 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
166 | OF SUCH DAMAGES.
167 |
168 | 7. GENERAL
169 |
170 | If any provision of this Agreement is invalid or unenforceable under
171 | applicable law, it shall not affect the validity or enforceability of the
172 | remainder of the terms of this Agreement, and without further action by the
173 | parties hereto, such provision shall be reformed to the minimum extent
174 | necessary to make such provision valid and enforceable.
175 |
176 | If Recipient institutes patent litigation against any entity (including a
177 | cross-claim or counterclaim in a lawsuit) alleging that the Program itself
178 | (excluding combinations of the Program with other software or hardware)
179 | infringes such Recipient's patent(s), then such Recipient's rights granted
180 | under Section 2(b) shall terminate as of the date such litigation is filed.
181 |
182 | All Recipient's rights under this Agreement shall terminate if it fails to
183 | comply with any of the material terms or conditions of this Agreement and
184 | does not cure such failure in a reasonable period of time after becoming
185 | aware of such noncompliance. If all Recipient's rights under this Agreement
186 | terminate, Recipient agrees to cease use and distribution of the Program as
187 | soon as reasonably practicable. However, Recipient's obligations under this
188 | Agreement and any licenses granted by Recipient relating to the Program shall
189 | continue and survive.
190 |
191 | Everyone is permitted to copy and distribute copies of this Agreement, but in
192 | order to avoid inconsistency the Agreement is copyrighted and may only be
193 | modified in the following manner. The Agreement Steward reserves the right to
194 | publish new versions (including revisions) of this Agreement from time to
195 | time. No one other than the Agreement Steward has the right to modify this
196 | Agreement. The Eclipse Foundation is the initial Agreement Steward. The
197 | Eclipse Foundation may assign the responsibility to serve as the Agreement
198 | Steward to a suitable separate entity. Each new version of the Agreement will
199 | be given a distinguishing version number. The Program (including
200 | Contributions) may always be distributed subject to the version of the
201 | Agreement under which it was received. In addition, after a new version of
202 | the Agreement is published, Contributor may elect to distribute the Program
203 | (including its Contributions) under the new version. Except as expressly
204 | stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
205 | licenses to the intellectual property of any Contributor under this
206 | Agreement, whether expressly, by implication, estoppel or otherwise. All
207 | rights in the Program not expressly granted under this Agreement are
208 | reserved.
209 |
210 | This Agreement is governed by the laws of the State of Washington and the
211 | intellectual property laws of the United States of America. No party to this
212 | Agreement will bring a legal action under this Agreement more than one year
213 | after the cause of action arose. Each party waives its rights to a jury trial
214 | in any resulting litigation.
215 |
--------------------------------------------------------------------------------