Skip to content

Commit

Permalink
Merge branch 'master' into develop
Browse files Browse the repository at this point in the history
* master:
  Fixed SBT dependency
  Continued development 1. Added puny code (although it’s deprecated) 2. Fixes on stream.Writable class 3. Fixes for setInterval function 4. Fixed issue with process.hrtime()
  Pre-release v0.4.0-pre3: Miscellaneous fixes in OS and Stream packages
  Improved the repl binding

# Conflicts:
#	src/main/scala/io/scalajs/nodejs/stream/Writable.scala
  • Loading branch information
ldaniels528 committed Apr 19, 2017
2 parents 54ae6f7 + 5a37777 commit 3d8abbc
Show file tree
Hide file tree
Showing 18 changed files with 245 additions and 96 deletions.
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ The following applications were developed using ScalaJs.io:
| Application | Frontend | Backend | Scalajs.io version | Description |
|------------------------------------------------------------------------|-----------------------|--------------------|--------------------|------------------------------------------|
| [Phaser-Invaders](https://github.com/scalajs-io/phaser-invaders-demo) | Scala.js + DOM | Scala + NodeJS | 0.3.0.1 | Port of Phaser Invaders. |
| [Socialize](https://github.com/ldaniels528/scalajs-nodejs-socialized) | Scala.js + AngularJS | Scala.js + NodeJS | 0.3.0.3 | A Facebook-inspired Social networking web application. |
| [Todo MVC](https://github.com/ldaniels528/scalajs-nodejs-todomvc) | Scala.js + AngularJS | Scala.js + NodeJS | 0.2.3.1 | A simple Todo example application. |
| [Trifecta](https://github.com/ldaniels528/trifecta) | Scala.js + AngularJS | Scala + Play 2.4.x | 0.3.0.0 | Trifecta is a web-based and CLI tool that simplifies inspecting Kafka messages and Zookeeper data. |
| [Socialize](https://github.com/scalajs-io/scalajs-nodejs-socialized) | Scala.js + AngularJS | Scala.js + NodeJS | 0.3.0.3 | A Facebook-inspired Social networking web application. |
| [Todo MVC](https://github.com/scalajs-io/scalajs-nodejs-todomvc) | Scala.js + AngularJS | Scala.js + NodeJS | 0.2.3.1 | A simple Todo example application. |
| [Trifecta](https://github.com/scalajs-io/trifecta) | Scala.js + AngularJS | Scala + Play 2.4.x | 0.3.0.0 | Trifecta is a web-based and CLI tool that simplifies inspecting Kafka messages and Zookeeper data. |

### The MEAN Stack — AngularJS, MongoDB, Mongoose, Express and more

Expand All @@ -101,7 +101,7 @@ The following applications were developed using ScalaJs.io:
| [mongoose](https://github.com/scalajs-io/mongoose) | 4.8.1 | Mongoose is a MongoDB object modeling tool designed to work in an asynchronous environment. |
| [mpromise](https://github.com/scalajs-io/mpromise) | 0.5.5 | A promises/A+ conformant implementation, written for mongoose. |

Looking for a complete list of available bindings? Go [here](https://github.com/scalajs-io/scalajs.io-platform)
Looking for a complete list of available bindings? Go [here](https://github.com/scalajs-io/scalajs-io-platform)

<a name="discussions"></a>
### Discussions
Expand Down Expand Up @@ -231,7 +231,7 @@ The following core Node.js modules (v7.7.1) have been implemented:
| vm | The vm module provides APIs for compiling and running code within V8 Virtual Machine contexts.|
| zlib | This provides bindings to Gzip/Gunzip, Deflate/Inflate, and DeflateRaw/InflateRaw classes. |

*NOTE*: The SBT artifact for the complete Node.js platform is: "io.scalajs.npm" %%% "nodejs" % "0.4.0-pre2"
*NOTE*: The SBT artifact for the complete Node.js platform is: "io.scalajs" %%% "nodejs" % "0.4.0-pre4"

<a name="npm_modules">
#### Third-party Modules
Expand Down Expand Up @@ -298,7 +298,7 @@ The following Third Party/OSS Node.js (npm) modules have been implemented:
| [winston-daily-rotate-file](https://github.com/scalajs-io/winston-daily-rotate-file) | 1.4.4 | A multi-transport async logging library for Node.js. |
| [xml2js](https://github.com/scalajs-io/xml2js) | 0.4.16 | Simple XML to JavaScript object converter. |

*NOTE*: The full SBT artifact expression is: "io.scalajs.npm" %%% "xxxx" % version (e.g. "io.scalajs.npm" %%% "express" % "0.4.0-pre2")
*NOTE*: The full SBT artifact expression is: "io.scalajs.npm" %%% "xxxx" % version (e.g. "io.scalajs.npm" %%% "express" % "0.4.0-pre4")

I've provided an example to demonstrate how similar the Scala.js code is to the JavaScript
that it replaces.
Expand Down
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import sbt._

import scala.language.postfixOps

val scalaJsIOVersion = "0.4.0-pre2"
val scalaJsIOVersion = "0.4.0-pre4"
val apiVersion = scalaJsIOVersion
val scalaJsVersion = "2.12.1"

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nodejs-sfs",
"version": "0.4.0-pre2",
"version": "0.4.0-pre4",
"private": true,
"dependencies": {
"source-map": "^0.5.6"
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/io/scalajs/nodejs/Process.scala
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ trait Process extends IEventEmitter {
/**
* An object containing the user environment.
*/
def env: js.Dictionary[String] = js.native
def env: Environment = js.native

/**
* This is the set of Node.js-specific command line options from the executable that started the process.
Expand Down Expand Up @@ -245,9 +245,9 @@ trait Process extends IEventEmitter {
* Returns the current high-resolution real time in a [seconds, nanoseconds] tuple Array. It is relative to an
* arbitrary time in the past. It is not related to the time of day and therefore not subject to clock drift.
* The primary use is for measuring performance between intervals.
* @example process.hrtime()
* @example process.hrtime([time])
*/
def hrtime(): js.Array[Int] = js.native
def hrtime(time: js.Array[Int] = js.native): js.Array[Int] = js.native

/**
* Reads /etc/group and initializes the group access list, using all groups of which the user is a member.
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/io/scalajs/nodejs/fs/Fs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -674,7 +674,7 @@ trait Fs extends IEventEmitter {
* data will be read from the current file position.
* @return the number of bytesRead.
*/
def readSync(fd: FileDescriptor, buffer: Buffer, offset: Int, length: Int, position: Int): Buffer = js.native
def readSync(fd: FileDescriptor, buffer: Buffer, offset: Int, length: Int, position: Int): Int = js.native

/**
* Asynchronous readdir(3). Reads the contents of a directory.
Expand Down
2 changes: 2 additions & 0 deletions src/main/scala/io/scalajs/nodejs/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ package object nodejs {
*/
type FileDescriptor = Integer

type Environment = js.Dictionary[String]

/////////////////////////////////////////////////////////////////////////////////
// Built-in Properties
/////////////////////////////////////////////////////////////////////////////////
Expand Down
87 changes: 87 additions & 0 deletions src/main/scala/io/scalajs/nodejs/punycode/Punycode.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package io.scalajs.nodejs.punycode

import scala.scalajs.js
import scala.scalajs.js.annotation.JSImport

/**
* The version of the punycode module bundled in Node.js is being deprecated. In a future major version of Node.js
* this module will be removed. Users currently depending on the punycode module should switch to using the
* userland-provided Punycode.js module instead.
* @see https://nodejs.org/dist/latest-v7.x/docs/api/punycode.html
*/
@js.native
trait Punycode extends js.Object {

/**
* The punycode.decode() method converts a Punycode string of ASCII-only characters to the equivalent
* string of Unicode codepoints.
* @param string a Punycode string of ASCII-only characters
* @return the equivalent string of Unicode codepoints.
*/
def decode(string: String): String = js.native

/**
* The punycode.encode() method converts a string of Unicode codepoints to a Punycode string of ASCII-only characters.
* @param codePoints a string of Unicode codepoints
* @return a Punycode string of ASCII-only characters.
*/
def encode(codePoints: String): String = js.native

/**
* The punycode.toASCII() method converts a Unicode string representing an Internationalized Domain Name to Punycode.
* Only the non-ASCII parts of the domain name will be converted. Calling punycode.toASCII() on a string that already
* only contains ASCII characters will have no effect.
* @param domain the domain name
* @return a Unicode string representing an Internationalized Domain Name as Punycode
*/
def toASCII(domain: String): String = js.native

/**
* The punycode.toUnicode() method converts a string representing a domain name containing Punycode encoded
* characters into Unicode. Only the Punycode encoded parts of the domain name are be converted.
* @param domain a string representing a domain name containing Punycode encoded characters
* @return the Unicode string
*/
def toUnicode(domain: String): String = js.native

/**
* The UCS2 object
* @return The [[UCS2 UCS2]] object
*/
def ucs2: UCS2 = js.native

/**
* Returns a string identifying the current Punycode.js version number.
* @return a string identifying the current Punycode.js version number.
*/
def version: String = js.native

}

/**
* Punycode.UCS2
* @see https://nodejs.org/dist/latest-v7.x/docs/api/punycode.html
*/
@js.native
trait UCS2 extends js.Object {

/**
* The punycode.ucs2.decode() method returns an array containing the numeric codepoint values of each Unicode
* symbol in the string.
* @param string the string containing Unicode symbols
* @return an array containing the numeric codepoint values of each Unicode symbol
*/
def decode(string: String): js.Array[Int] = js.native

/**
* The punycode.ucs2.encode() method returns a string based on an array of numeric code point values.
* @param codePoints an array of numeric code point values
* @return a string based on an array of numeric code point values
*/
def encode(codePoints: js.Array[Int]): String = js.native

}

@js.native
@JSImport("punycode", JSImport.Namespace)
object Punycode extends Punycode
2 changes: 1 addition & 1 deletion src/main/scala/io/scalajs/nodejs/repl/REPL.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import scala.scalajs.js.|
trait REPL extends IEventEmitter {
var REPL_MODE_SLOPPY: String = js.native
var REPL_MODE_STRICT: String = js.native
var REPL_MODE_MAGIC: String = js.native
var REPL_MODE_MAGIC: String = js.native

/**
* @example repl.start([options])
Expand Down
36 changes: 20 additions & 16 deletions src/main/scala/io/scalajs/nodejs/repl/REPLServer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,34 @@ trait REPLServer extends IEventEmitter with Interface {
/**
* The REPL's context
*/
// TODO find document for this property
val context: js.Dynamic = js.native
val context: REPLContext = js.native

/**
* Makes a command available in the REPL. The command is invoked by typing a . followed by the keyword.
* The cmd is an object with the following values:
* The replServer.defineCommand() method is used to add new .-prefixed commands to the REPL instance.
* Such commands are invoked by typing a period (.) followed by the keyword. The cmd is either a Function
* or an object with the following properties:
* <ul>
* <li>help - help text to be displayed when .help is entered (Optional).</li>
* <li>action - a function to execute, potentially taking in a string argument, when the command is invoked,
* bound to the REPLServer instance (Required).</li>
* <li>help (string) Help text to be displayed when .help is entered (Optional).</li>
* <li>action (Function) The function to execute, optionally accepting a single string argument.</li>
* </ul>
* If a function is provided instead of an object for cmd, it is treated as the action.
* @example replServer.defineCommand(keyword, cmd)
* @param keyword The command keyword (without a leading . character).
* @param cmd The function to invoke when the command is processed.
*/
def defineCommand(keyword: String, cmd: js.Any): Unit = js.native
def defineCommand(keyword: String, cmd: js.Function0[Any]): Unit = js.native

/**
* Like readline.prompt except also adding indents with ellipses when inside blocks. The preserveCursor argument
* is passed to readline.prompt. This is used primarily with defineCommand. It's also used internally to render
* each prompt line.
* @example replServer.displayPrompt([preserveCursor])
* @see [[prompt()]]
* The replServer.displayPrompt() method readies the REPL instance for input from the user, printing the
* configured prompt to a new line in the output and resuming the input to accept new input.
*
* When multi-line input is being entered, an ellipsis is printed rather than the 'prompt'.
* *
* When preserveCursor is true, the cursor placement will not be reset to 0.
*
* The replServer.displayPrompt method is primarily intended to be called from within the action function
* for commands registered using the replServer.defineCommand() method.
* @param preserveCursor indicates whether to preserver the cursor (position?)
*/
def displayPrompt(preserveCursor: Boolean): Unit = js.native
def displayPrompt(preserveCursor: Boolean = js.native): Unit = js.native

/**
* Like readline.prompt except also adding indents with ellipses when inside blocks. The preserveCursor argument
Expand Down
88 changes: 88 additions & 0 deletions src/main/scala/io/scalajs/nodejs/repl/package.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package io.scalajs.nodejs

import scala.scalajs.js

/**
* repl package object
* @author [email protected]
*/
package object repl {

type REPLContext = js.Dynamic

/**
* REPL Server events
* @param server the given [[REPLServer instance]]
*/
final implicit class REPLServerEvents(val server: REPLServer) extends AnyVal {

@inline
def contextAs[T]: T = server.context.asInstanceOf[T]

/**
* The 'exit' event is emitted when the REPL is exited either by receiving the .exit command as input,
* the user pressing CTRL-C twice to signal SIGINT, or by pressing CTRL-D to signal 'end' on the input stream.
* The listener callback is invoked without any arguments.
* @param listener The listener callback
*/
@inline
def onExit(listener: () => Any): server.type = server.on("exit", listener)

/**
* The 'reset' event is emitted when the REPL's context is reset. This occurs whenever the .clear command
* is received as input unless the REPL is using the default evaluator and the repl.REPLServer instance
* was created with the useGlobal option set to true. The listener callback will be called with a reference
* to the context object as the only argument.
* @param listener The listener callback
*/
@inline
def onReset(listener: REPLContext => Any): server.type = server.on("reset", listener)

}

/**
* Various behaviors of the Node.js REPL can be customized using the following environment variables:
* <ul>
* <li>NODE_REPL_HISTORY</li>
* <li>NODE_REPL_HISTORY_SIZE</li>
* <li>NODE_REPL_MODE</li>
* </ul>
*/
final implicit class EnvironmentVariableOptions(val env: Environment) extends AnyVal {

/**
* When a valid path is given, persistent REPL history will be saved to the specified file rather
* than .node_repl_history in the user's home directory. Setting this value to "" will disable persistent
* REPL history. Whitespace will be trimmed from the value.
*/
@inline
def NODE_REPL_HISTORY: Option[String] = env.get("NODE_REPL_HISTORY")

/**
* Previously in Node.js/io.js v2.x, REPL history was controlled by using a NODE_REPL_HISTORY_FILE environment
* variable, and the history was saved in JSON format. This variable has now been deprecated, and the old
* JSON REPL history file will be automatically converted to a simplified plain text format. This new file
* will be saved to either the user's home directory, or a directory defined by the NODE_REPL_HISTORY variable,
* as documented in the Environment Variable Options.
*/
@inline
@deprecated("Use NODE_REPL_HISTORY instead.", since = "3.0.0")
def NODE_REPL_HISTORY_FILE: Option[String] = env.get("NODE_REPL_HISTORY_FILE")

/**
* Defaults to 1000. Controls how many lines of history will be persisted if history is available.
* Must be a positive number.
*/
@inline
def NODE_REPL_HISTORY_SIZE: Option[Int] = env.get("NODE_REPL_HISTORY_SIZE").map(_.toInt)

/**
* May be any of sloppy, strict, or magic. Defaults to magic, which will automatically run "strict mode only"
* statements in strict mode.
*/
@inline
def NODE_REPL_MODE: Option[String] = env.get("NODE_REPL_MODE")

}

}
29 changes: 23 additions & 6 deletions src/main/scala/io/scalajs/nodejs/stream/Writable.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package io.scalajs.nodejs
package stream

import io.scalajs.util.PromiseHelper._
import io.scalajs.util.PromiseHelper.Implicits._
import io.scalajs.nodejs.buffer.Buffer
import io.scalajs.nodejs.events.IEventEmitter
import io.scalajs.util.PromiseHelper._

import scala.concurrent.Promise
import scala.scalajs.js
Expand Down Expand Up @@ -136,6 +135,24 @@ trait Writable extends IEventEmitter {
*/
def uncork(): Unit = js.native

/**
* Flush all data, buffered since stream.cork() call.
* @param chunk The data to write (<String> | <Buffer>)
* @param callback the Callback for when this chunk of data is flushed
* @return true, if the data was handled completely
* @example writable.write(chunk[, encoding][, callback])
*/
def write(chunk: Buffer | String, callback: js.Function1[Error, Any] = js.native): Boolean = js.native

/**
* Flush all data, buffered since stream.cork() call.
* @param chunk The data to write (<String> | <Buffer>)
* @param encoding The encoding, if chunk is a String
* @return true, if the data was handled completely
* @example writable.write(chunk[, encoding][, callback])
*/
def write(chunk: Buffer | String, encoding: String): Boolean = js.native

/**
* Flush all data, buffered since stream.cork() call.
* @param chunk The data to write (<String> | <Buffer>)
Expand All @@ -145,8 +162,8 @@ trait Writable extends IEventEmitter {
* @example writable.write(chunk[, encoding][, callback])
*/
def write(chunk: Buffer | String,
encoding: String = js.native,
callback: js.Function1[Error, Any] = js.native): Boolean = js.native
encoding: String,
callback: js.Function1[Error, Any]): Boolean = js.native

}

Expand All @@ -160,7 +177,7 @@ object Writable {
* Writable Events
* @author [email protected]
*/
implicit class WritableEvents(val writable: Writable) extends AnyVal {
implicit class WritableEvents[T <: Writable](val writable: T) extends AnyVal {

/**
* Emitted when the stream and any of its underlying resources (a file descriptor, for example) have been closed.
Expand Down Expand Up @@ -209,7 +226,7 @@ object Writable {
* Writable Extensions
* @author [email protected]
*/
implicit class WritableExtensions(val writable: Writable) extends AnyVal {
implicit class WritableExtensions[T <: Writable](val writable: T) extends AnyVal {

@inline
def endAsync(chunk: Buffer): Promise[Unit] = promiseWithError0[Error](writable.end(chunk, _))
Expand Down
Loading

0 comments on commit 3d8abbc

Please sign in to comment.