https://github.com/fibo/strict-mode
enables strict mode in your package
https://github.com/fibo/strict-mode
Last synced: over 1 year ago
JSON representation
enables strict mode in your package
- Host: GitHub
- URL: https://github.com/fibo/strict-mode
- Owner: fibo
- License: mit
- Created: 2014-01-08T20:12:24.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2021-01-15T11:10:31.000Z (over 5 years ago)
- Last Synced: 2025-03-28T17:11:14.232Z (over 1 year ago)
- Language: JavaScript
- Homepage: https://fibo.github.io/strict-mode
- Size: 119 KB
- Stars: 7
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# strict-mode
> enables strict mode in your package
[](http://badge.fury.io/js/strict-mode)
[](https://github.com/fibo/strict-mode)
[](https://standardjs.com)
## Installation
With [npm](https://npmjs.org/) do
```bash
npm install strict-mode --save-dev
```
**NOTA BENE** you may want to install *strict-mode* as a development dependency, see [Bonus Tip below](#bonus-tip).
## Usage
**Please note that this package is intended to be used server side.**
If used with [browserify] it is a [no op].
Suppose that the *main attribute* in your *package.json* is *index.js*.
If you want that all the modules in your package have strict mode enabled,
just wrap your *index.js* this way
```javascript
require('strict-mode')(function () {
// your index.js content
// every *require* call inside this function will have strict mode enabled
})
```
## Motivation
[Strict mode][MDN_Strict_mode] is a best practice but adding a `"use strict";` on top of every *.js* file in your package could
* require a big effort
* be error proning
* make complain linters (like eslint, jshint, etc.)
* be a problem when concatenating files
On the other hand the [use-strict] package solution is too invasive, cause it applies strictness to **all** future modules loaded.
## Use case
At the time of this writing [Node v4 stable](https://nodejs.org/en/blog/release/v4.0.0/) version was released few days ago.
Finally we can use `class`, `let`, `const` (among other new exciting features) but you will notice that if you do not turn on strict mode an exception will raise.
For instance, a file *Point2d.js* with content
```javascript
class Point2d {
constructor (x, y) {
this.x = x
this.y = y
}
}
module.exports = Point2d
```
when imported will complain
```
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
```
but if you wrap the import with *strict-mode* everything will just work
```javascript
require('strict-mode')(function () {
var Point2d = require('./Point2d')
// require all other classes you need.
// You can also export them safely
exports.Point2d = Point2d
})
```
## Bonus tip
You could use *strict-mode* just as a development dependency.
Following the instructions below, you are not going to deploy *strict-mode* on production but when you run your tests **if some code is not strict, then you will get an error**.
Suppose you have the following folder structure in your package.
.
├── package.json
├── src
│ └── index.js # your package.json `main` entry
└── test
├── test1.js
└── test2.js
Assuming you package name is, emh *my-package*, create a file *test/my-package.js* containing
```javascript
require('strict-mode')(function () {
module.exports = require('../src/index.js')
})
```
Now if you set the environment variable `NODE_PATH=test`, you can use `require('my-package')` in your tests.
For instance if you are using *tape* you can add this to your *package.json*
```json
"test": "NODE_PATH=test tape test/*js"
```
You can also achieve the same result without `NODE_PATH` environment variable, using this nasty trick (to cheat npm :^)
Instead of *test/my-package.js*, create a *test/node_modules/my-package/index.js* containing
```javascript
require('strict-mode')(function () {
module.exports = require('../../../src/index.js')
})
```
Notice also that you will probably need to force git add, for instance
```bash
git add -f test/node_modules/my-package/index.js
```
## Credits
Code **stolen** from isaacs' [use-strict].
A big thank to [MDN](https://developer.mozilla.org) cause it is an awesome knowledge base for everything related with the Web: in particular, I could find some valid counterexamples of strict mode to include in my tests.
## License
[MIT](http://g14n.info/mit-license)
[browserify]: http://browserify.org/ "browserify"
[MDN_Strict_mode]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode
[no op]: https://github.com/fibo/strict-mode/blob/master/browser.js "browser.js"
[test/node_modules/strict-mode/index.js]: https://github.com/fibo/strict-mode/blob/master/test/node_modules/strict-mode/index.js
[use-strict]: https://npmjs.org/package/use-strict "use-strict"