npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@eeue56/derw

v0.0.3-7

Published

An Elm-inspired language that transpiles to TypeScript

Downloads

13

Readme

derw

An Elm-inspired language that transpiles to TypeScript

Usage

npx @eeue56/derw

To get started:
Start a package via `derw init`
Compile via `derw compile`
Or compile and test via `derw test`

You can run the derw compiler via npx. You must provide files via --files or be in a package directory.

npx @eeue56/derw

Let\'s write some Derw code
To get started:
Provide entry files via --files
Or run me without args inside a package directory
  --files [string...]:      Filenames to be given
  --test :                  Test the project
  --target ts | js | derw:  Target TS, JS or Derw output
  --output string:          Output directory name
  --verify :                Run typescript compiler on generated files to ensure valid output
  --debug :                 Show a parsed object tree
  --only string:            Only show a particular object
  --run :                   Should be run via ts-node/node
  --format :                Format the files given in-place
  --quiet :                 Keep it short and sweet
  -h, --help :              This help text

Example

You can find a bunch of examples in examples, along with the Typescript they generate. But the general gist is: Elm-compatible syntax where possible.

type Result a b
    = Err { error: a }
    | Ok { value: b }

asIs : Result a b -> Result a b
asIs result =
    case result of
        Err { error } -> Err { error }
        Ok { value } -> Ok { value }

Roadmap

0.0.1 alpha

  • [x] Arrays [ ], [ 1, 2, 3 ], [ [ 1, 2, 3 ], [ 3, 2, 1 ] ]
  • [x] Booleans true, false
  • [x] Boolean equality 1 < 2, 1 <= 2, 1 == 2, 1 != 2, 1 > 2, 1 >= 2
  • [x] Boolean operations true && false, not true, true || false
  • [x] Strings "", "hello world"
  • [x] Format strings ``, `Hello ${name}`
  • [x] Numbers -1, 0, 1, -1.1, 1.1
  • [x] Addition 1 + 2, "Hello" + name
  • [x] Subtraction 2 - 1
  • [x] Multiplication 2 * 1
  • [x] Division 2 / 1
  • [x] Pipe [1, 2, 3] |> List.fold add, List.fold add <| [1, 2, 3]
  • [ ] Compose >>, <<
  • [x] Constants hello = "hello world"
  • [x] Function definitions
  • [x] Lists [ 1, 2, 3 ], [ "hello", "world" ]
  • [x] List ranges [ 1..5 ], [ start..end ]
add : number -> number -> number
add x y = x + y
  • [x] Function calls
three = add 1 2
  • [x] Module references
three = List.map identity [ 1, 2, 3 ]
  • [x] Union types
type Result a b
    = Err { error: a }
    | Ok { value: b }
  • [x] Type variables
type Thing a = Thing a
  • [x] Type aliases
type User =
    { name: string }
  • [x] Object literals
user: User
user = { name: string }
  • [x] Imports
import List
import Result exposing ( map )
import something as banana
  • [x] Exports
exposing ( map )
  • [x] Let statements
sayHiTo : User -> string
sayHiTo user =
    let
        name = user.name
    in
        "Hello " + name

sayHelloTo : User -> string
sayHelloTo user =
    let
        getName: User -> string
        getName user = user.name
    in
        "Hello" + getName user
  • [x] If statements
type Animal = Animal { age: number }
sayHiTo : Animal -> string
sayHiTo animal =
    if animal.age == 1 of
        "Hello little one!"
    else
        "You're old"
  • [x] Case..of
type Animal = Dog | Cat
sayHiTo : Animal -> string
sayHiTo animal =
    case animal of
        Dog -> "Hi dog!"
        Cat -> "Hi cat!"
  • [x] Destructing in case..of
type User = User { name: string }

sayHiTo : User -> string
sayHiTo user =
    case user of
        User { name } -> "Hi " + name + !"
  • [x] strings in case..of
  • [x] defaults in case..of
sayHiTo : string -> string
sayHiTo name =
    case name of
        "Noah" -> "Hi " + name + !"
        default: "I don't know you"
  • [ ] List destructing

sayHiTo : List number -> string
sayHiTo xs =
    case xs of
        [] -> "Empty"
        x::ys -> "Hello " + x + (sayHiTo ys)
  • [x] Constructing union types
type User = User { name: string }
noah = User { name: "Noah" }
  • [x] Errors on type name collison
The name `Person` has been used for different things.
8 - 10:

```
type Person =
    Person { name: string }
```

11 - 14:

```
type alias Person = {
    name: string
}
```
  • [x] Errors on function name collison
The name `isTrue` has been used for different things.
0 - 3:

```
isTrue: boolean -> boolean
isTrue x =
    x == true
```

4 - 7:

```
isTrue: boolean -> boolean
isTrue x =
    x != true
```
  • [x] Some form of basic type errors
Failed to parse examples/errors/mismatching_types.derw due to:
Error on lines 0 - 3
Expected `boolean` but got `number` in the body of the function:

```
isTrue: boolean -> boolean
isTrue x =
    1 + 2
```

Error on lines 4 - 7
Expected `List string` but got `List number`:

```
names: List string
names =
    [1..2]
```
  • [x] lambdas \x -> x + 1, \x y -> x + y
  • [x] Typescript output
  • [x] Javscript output
  • [ ] Elm output
  • [x] Module resolution
  • [x] CLI
  • [x] Basic type checking
  • [x] Detect if types exist in current namespace
  • [x] Syntax highlighting for editors
  • [x] Collision detection for names in a module
  • [x] Importing of Derw files
import "./other"
import "./something" as banana
import "./another" exposing ( isTrue, isFalse )
  • [x] Errors when failing to find relative import
Warning! Failed to find `examples/derw_imports/banana` as either derw, ts or js
  • [x] Single line comments
-- hello
isTrue: boolean -> boolean
isTrue x =
    x
  • [x] Single line comments in function or const bodies
isTrue: boolean -> boolean
isTrue x =
    -- hello
    x
  • [x] Multiline comments
{-
hello
world
-}
isTrue: boolean -> boolean
isTrue x =
    x
  • [x] Function arguments
map: (a -> b) -> a -> b
map fn value =
    fn value

1.0.0

  • [x] An automatic formatter with no options
  • [ ] A standard library
  • [ ] Support for Coed
  • [x] Testing support via Bach

Write a file with _test as an extension (e.g List_test.derw).

import Test exposing (equals)

testMath: boolean -> void
testMath a? =
    equals 1 1

Compile it, then run bach via npx @eeue56/bach

  • [ ] Type checking
  • [ ] Benchmarking support via Mainc
  • [ ] Async support
  • [ ] Packaging
  • [x] Package init
derw --init
  • [x] Package testing
# inside a package directory
derw --test

2.0.0

  • [ ] Type checking with interop with TypeScript
  • [ ] Derw compiler is written in Derw

Divergence from Elm

  • All top level consts or functions must have type definitions
  • Format strings ``
  • No need for module names in the module file itself. Use exposing instead

Editor language support

Currently VSCode syntax highlighting is supported by this extension: https://github.com/eeue56/derw-syntax. It is not on the marketplace because Microsoft account creation was down when I tried.

Instead, you can do:

git clone https://github.com/eeue56/derw-syntax
cp -r derw-syntax ~/.vscode/extensions/derw-syntax-0.0.1

Name

derw which means oak. Oak is one of the native trees in Wales, famous for it's long life, tall stature, and hard, good quality wood. An English speaker might pronounce it as "deh-ru".