Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
Signed-off-by: Carlos Quiroz <carlos.m.quiroz@gmail.com>
  • Loading branch information
cquiroz committed Dec 12, 2020
0 parents commit 33367be
Show file tree
Hide file tree
Showing 11 changed files with 251 additions and 0 deletions.
7 changes: 7 additions & 0 deletions .github/dependabot.yml
@@ -0,0 +1,7 @@
version: 2
updates:

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
21 changes: 21 additions & 0 deletions .github/workflows/release.yml
@@ -0,0 +1,21 @@
name: Release
on:
push:
branches: [main]
tags: ["*"]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.3.4
- uses: olafurpg/setup-scala@v10
- uses: olafurpg/setup-gpg@v3
- name: Publish
run: |
git status
sbt ci-release
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
PGP_SECRET: ${{ secrets.PGP_SECRET }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
28 changes: 28 additions & 0 deletions .github/workflows/scala.yml
@@ -0,0 +1,28 @@
name: build

on: [push, pull_request]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2.3.4
- name: Set up JDK 1.8
uses: olafurpg/setup-scala@v10
with:
java-version: 1.8
- name: Cache dependencies
uses: actions/cache@v2.1.3
with:
path: ~/.cache/coursier/v1
key: ${{ runner.os }}-coursier-${{ hashFiles('build.sbt') }}-${{ hashFiles('project/*.scala') }}
restore-keys: ${{ runner.os }}-coursier-
- name: Cache .sbt
uses: actions/cache@v2.1.3
with:
path: ~/.sbt
key: ${{ runner.os }}-sbt-${{ hashFiles('build.sbt') }}-${{ hashFiles('project/*.scala') }}
restore-keys: ${{ runner.os }}-sbt-
- name: Run compile
run: csbt +compile +test
33 changes: 33 additions & 0 deletions .gitignore
@@ -0,0 +1,33 @@
*.class
*.log
*.bsp

# sbt specific
.cache
.history
.lib/
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/

# Scala-IDE specific
.scala_dependencies
.worksheet
.idea/
.vscode/
.bloop/
.metals/
project/metals.sbt

# Mac OS
.DS_Store
._.DS_Store
**/.DS_Store
**/._.DS_Store

# Hydra
.hydra/
gnupg-*
10 changes: 10 additions & 0 deletions .mergify.yml
@@ -0,0 +1,10 @@

pull_request_rules:
- name: automatically merge scala-steward's PRs
conditions:
- author=geminihlswadmin
- body~=labels:.*semver-patch.*
- status-success=build
actions:
merge:
method: merge
42 changes: 42 additions & 0 deletions .scalafmt.conf
@@ -0,0 +1,42 @@
version = "2.7.3"
style = default

maxColumn = 100

// Vertical alignment is pretty, but leads to bigger diffs
align.preset = most

rewrite.rules = [
AvoidInfix
RedundantBraces
RedundantParens
AsciiSortImports
PreferCurlyFors
]

align.tokens.add = [{code = "=>", owner = "Case"}]
align.tokens.add = [{code = ":", owner = "Term.Param"}, "=", "shouldBe", "<-", "^"]
align.openParenCallSite = true
spaces.inImportCurlyBraces = true

continuationIndent.defnSite = 2

docstrings.style = Asterisk

rewrite.neverInfix.excludeFilters = [until
to
by
eq
ne
"should.*"
"contain.*"
"must.*"
in
be
taggedAs
thrownBy
synchronized
have
when
size
theSameElementsAs]
5 changes: 5 additions & 0 deletions README.md
@@ -0,0 +1,5 @@
# lucuma-mousetrap

Facade for [mousetrap](https://github.com/ccampbell/mousetrap) using [ScalablyTyped](https://scalablytyped.org/docs/library-developer)

It includes a scala.js React component for easier integration
48 changes: 48 additions & 0 deletions build.sbt
@@ -0,0 +1,48 @@
/* ScalablyTyped configuration */
enablePlugins(ScalablyTypedConverterGenSourcePlugin)

Global / onChangedBuildSource := ReloadOnSourceChanges

inThisBuild(
Seq(
homepage := Some(url("https://github.com/gemini-hlsw/lucuma-mousetrap")),
Global / onChangedBuildSource := ReloadOnSourceChanges
) ++ lucumaPublishSettings
)

lazy val root = project
.in(file("."))
.settings(name := "lucuma-mousetrap")
.settings(
// shade into another package
stOutputPackage := "lucuma.mt",
/* javascript / typescript deps */
Compile / npmDependencies ++= Seq(
"mousetrap" -> "1.6.5",
"@types/mousetrap" -> "1.6.5"
),
stSourceGenMode := SourceGenMode.ResourceGenerator,
/* disabled because it somehow triggers many warnings */
scalaJSLinkerConfig ~= (_.withSourceMap(false)),
// because npm is slow
useYarn := true,
stUseScalaJsDom := true,
scalacOptions ~= (_.filterNot(
Set(
// By necessity facades will have unused params
"-Wdead-code",
"-Wunused:params",
"-Wunused:imports",
"-Wunused:explicits"
)
)),
sources in (Compile, doc) := Seq(),
// focus only on these libraries
stMinimize := Selection.AllExcept("mousetrap"),
libraryDependencies ++= Seq(
"com.github.japgolly.scalajs-react" %%% "core" % "1.7.7",
"io.github.cquiroz.react" %%% "common" % "0.11.2"
)
)
.settings(lucumaScalaJsSettings: _*)
.enablePlugins(ScalablyTypedConverterGenSourcePlugin)
1 change: 1 addition & 0 deletions project/build.properties
@@ -0,0 +1 @@
sbt.version = 1.4.4
9 changes: 9 additions & 0 deletions project/plugins.sbt
@@ -0,0 +1,9 @@
resolvers += Resolver.bintrayRepo("oyvindberg", "converter")

addSbtPlugin("org.scalablytyped.converter" % "sbt-converter" % "1.0.0-beta29")

addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.2")

addSbtPlugin("edu.gemini" % "sbt-lucuma" % "0.3.3")

addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.4")
47 changes: 47 additions & 0 deletions src/main/scala/lucuma/mousetrap/package.scala
@@ -0,0 +1,47 @@
package lucuma

import japgolly.scalajs.react._
import japgolly.scalajs.react.vdom.html_<^._
import react.common._
import scala.scalajs.js
import scala.scalajs.js.annotation.JSImport
import lucuma.mt.mousetrap.mod.ExtendedKeyboardEvent

package object mousetrap {

val Mousetrap = lucuma.mt.mousetrap.mod.^
type CallbackFn = js.Function2[ /* e */ ExtendedKeyboardEvent, /* combo */ String, Unit]

implicit class CallbackOps(cb: Callback) {
def toCBF: CallbackFn = (_: ExtendedKeyboardEvent, _: String) => cb.runNow()
}
}

package mousetrap {

/**
* Wraps a component in some keyboard bindings
*/
final case class ReactMousetrap(
bindings: Map[String, Callback]
) extends ReactPropsWithChildren[ReactMousetrap](ReactMousetrap.component) {
@inline def render: Seq[CtorType.ChildArg] => VdomElement =
ReactMousetrap.component(this)
}

object ReactMousetrap {
type Props = ReactMousetrap

val component = ScalaComponent
.builder[Props]
.stateless
.render_C(c => c)
.componentDidMount { $ =>
Callback($.props.bindings.foreach { case (k, cb) => Mousetrap.bind(k, cb.toCBF) })
}
.componentWillUnmount { $ =>
Callback($.props.bindings.foreach { case (k, _) => Mousetrap.unbind(k) })
}
.build
}
}

0 comments on commit 33367be

Please sign in to comment.