Skip to content

tweedjs/tweed-env

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tweed-env

Simple abstraction to turn different JavaScript environments into strategies, with the purpose of being used in universal UI apps.

Let's say you have a Tweed component:

class YourURL {
  render () {
    return (
      <p>Your URL is {window.location.href}</p>
    )
  }
}

You have now coupled this component to a browser environment, because in an environment like Node window doesn't exist.

Instead, this package gives you a WebEnvironment interface in TypeScript, so that you can turn your code into this:

import { WebEnvironment } from 'tweed-env'

class YourURL {
  constructor (
    private readonly _environment: WebEnvironment
  ) {}

  render () {
    return (
      <p>Your URL is {this._environment.location.href}</p>
    )
  }
}

Then, in your browser entry file, you can use the BrowserEnvironment:

import { BrowserEnvironment } from 'tweed-env'

new YourURL(BrowserEnvironment.make())

And on the server, you can use the NodeHttpEnvironment, which requires an HTTP request to create the environment for a single request.

import { NodeHttpEnvironment } from 'tweed-env'

export default function (req, res) {
  new YourURL(NodeHttpEnvironment.make(req))
  ...
}

Among other things, the NodeHttpEnvironment will create a Location object from the url property of the request. It will try to use the Origin or Host headers to fill in the missing part of the HREF. However, headers are easy to fake, so you have the option to explicitly say what the origin of the request should be:

NodeHttpEnvironment.make(req, 'https://domain.example.com:8080')

If you're not necessarily within an HTTP environment, you can use the Environment base type, which at the moment just gives you a reference to the global object (window in the browser and global in Node). If that is all you need, you don't need an HTTP request ready. Instead, just use the NodeEnvironment class:

import { Environment, NodeEnvironment } from 'tweed-env'

const environment: Environment = NodeEnvironment.make()

About

Runtime Environment Strategies for Tweed

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published