initial port of lib

This commit is contained in:
Geoff Doty 2019-09-24 21:29:55 -05:00
commit 8d4d1cfbdb
10 changed files with 1471 additions and 0 deletions

32
.eslintrc.json Normal file
View File

@ -0,0 +1,32 @@
{
"env": {
"es6": true,
"node": true,
"mocha": true
},
"globals": {
"riot": true
},
"parserOptions": {
"ecmaVersion": 2015
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
4
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
]
}
}

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules/

72
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,72 @@
# Contributing
So you want to contribute, nice. **Thank you**.
Bug reports and code and documentation patches are all welcome. You can help this project also by using the development version and by reporting any bugs you might encounter.
You may contribute in several ways like:
* Creating new features
* Fixing bugs
* Improving documentation and examples
* Translating any document here to your language
## Table of contents
* [Contributing](#contributing)
* [Developing](#developing)
* [Running tests](#running-tests)
* [Reporting a bug](#reporting-a-bug)
* [Request a feature](#request-a-feature)
* [Commit message](#commit-message)
* [Code style](#code-style)
## Developing
There is only one main source file in the project. It is the [/src/http.js](/src/http.js)
The [test/index.spec.js](test/index.spec.js) is for now the only unit test file in the project.
The `dist` includes the minified version of the source code.
## Running tests
Run unit tests using this command:
```bash
npm run test
```
## Reporting a bug
Use the [GitHub issue tracker](https://github.com/n2geoff/js-lib/issues) to report any bug you find.
Bugs description should include:
* How to reproduce the bug;
* Easy to understand title;
Would be nice to have some code showing how to reproduce the code, you may use [gist](https://gist.github.com) or [Codepen](https://codepen.io) for uploading your example code.
## Request a feature
Use the [GitHub issue tracker](https://github.com/n2geoff/http/issues) to request a new feature.
Keep in mind, this is a pure javascript library
Feel free to port it to your favorite framework, such as [RiotJS](http://riotjs.com), Angular or VueJs in a new repository.
## Commit message
Commit messages should includes GitHub number reference and a imperative easy to understand sentence.
## Coding style
If it is supported in all major browsers without transpiling, then please use those JavaScript language features in your code, with one caveat -- readability is king.
Currently all ES5 and ES6/ES2015 are available.
This project uses [ESLint](https://eslint.org/) and the [`.eslintrc.json`](.eslintrc.json) is dead-simple, and all you need to followed.
Thank you for reading this.
Hey, **star** this *repo* and/or share it with your friends.

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2018
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

83
README.md Normal file
View File

@ -0,0 +1,83 @@
# HTTP
A tiny http/ajax library.
Weighs in at less than **300 bytes** gzipped and minified. It is very basic, but contains support for cross-domain requests back to somewhat older browsers (See [Compatibility](#compatibility)).
> Fork of [nanoajax](https://github.com/yanatan16/nanoajax) to make more encapsulated
## Install
Just include from `/dist`
```html
<script src="/http.min.js"></script>
```
> build from source with: `npm run build`
## Use
GET
```javascript
http({url:'/some-get-url'}, function (code, responseText) { ... });
```
POST
```js
http({url: '/some-post-url', method: 'POST', body: 'post=content&args=yaknow'}, function (code, responseText, request) {
# code is response code
# responseText is response body as a string
# request is the xmlhttprequest, which has `getResponseHeader(header)` function
});
```
## Documentation
Simple and small ajax decorator function for almost any browser. Takes a parameters object and a callback function.
Parameters:
- `url`: string, required
- `headers`: object of `{header_name: header_value, ...}`
- `body`:
+ string (sets content type to 'application/x-www-form-urlencoded' if not set in headers)
+ FormData (doesn't set content type so that browser will set as appropriate)
- `method`: 'GET', 'POST', etc. Defaults to 'GET' or 'POST' based on body
- `cors`: If your using cross-origin, you will need this true for IE8-9 (to use the XMLDomainRequest object, also see [Compatibility](#compatibility))
The following parameters are passed directly onto the request object:
**IMPORTANT NOTE**: The caller is responsible for compatibility checking.
- `responseType`: string, various compatibility, see XHR docs for enum options
- `withCredentials`: boolean, IE10+, CORS only
- `timeout`: long, ms timeout, IE8+
- `onprogress`: callback, IE10+
Callback function prototype:
- `statusCode`: integer status or null
+ if request errors for some browsers (notably Chrome), this is 0 (and `response` is "Error")
- `response`:
+ if `responseType` set and supported by browser, this is an object of some type (see docs)
+ otherwise if request completed, this is the string text of the response
+ if request is aborted, this is `"Abort"`
+ if request times out, this is `"Timeout"`
+ if request errors before completing (probably a CORS issue), this is `"Error"`
- request object
Returns the request object. So you can call .abort() or other methods
## Compatibility
`http` works on android, iOS, IE8+, and all modern browsers, with some (_known_) caveats.
- Safari is conservative with cookies and will not allow cross-domain cookies to be set from domains that have never been visited by the user.
- IE8 and IE9 do not support cookies in cross-domain requests in this library. There are other solutions out there, but this library has chosen small over edge case compatibility.
## License
[MIT](LICENSE)

1
dist/http.min.js vendored Normal file
View File

@ -0,0 +1 @@
(function(root,factory){if(typeof module==="object"&&module.exports){module.exports=factory(root.Module)}else{root.Module=factory(root.Module)}})(this,function(){"use strict";const Module={};return Module});

1141
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
package.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "http",
"version": "0.4.0",
"description": "tiny http lib",
"main": "src/http.js",
"directories": {
"doc": "docs",
"lib": "lib",
"test": "test"
},
"scripts": {
"lint": "node_modules/.bin/eslint src/http.js",
"test": "node_modules/.bin/tape test/*.spec.js"
},
"keywords": [
"library"
],
"author": "Geoff Doty",
"license": "MIT",
"devDependencies": {
"eslint": "^5.16.0",
"tape": "^4.10.2"
}
}

88
src/http.js Normal file
View File

@ -0,0 +1,88 @@
/* {http} v{version} | MIT | https:// */
(function(root, factory) {
/* eslint-disable */
if (typeof define === 'function' && define.amd) {
// AMD
define(['http'], factory);
} else if(typeof module === 'object' && module.exports) {
// CommonJS / NodeJS
module.exports = factory();
} else {
// Global
root.http = factory();
}
}(this, function() {
'use strict';
return function http(params, callback) {
// Any variable used more than once is var'd here because
// minification will munge the variables whereas it can't munge
// the object access.
var headers = params.headers || {}
, body = params.body
, method = params.method || (body ? 'POST' : 'GET')
, called = false;
var req = getRequest(params.cors);
var reqfields = [
'responseType', 'withCredentials', 'timeout', 'onprogress'
];
function getRequest(cors) {
if (window.XMLHttpRequest) {
return new XMLHttpRequest;
}
}
function setDefault(obj, key, value) {
obj[key] = obj[key] || value;
}
function cb(statusCode, responseText) {
return function () {
if (!called) {
callback(req.status === undefined ? statusCode : req.status,
req.status === 0 ? 'Error' : (req.response || req.responseText || responseText),
req);
called = true;
}
};
}
req.open(method, params.url, true);
var success = req.onload = cb(200);
req.onreadystatechange = function () {
if (req.readyState === 4) success();
};
req.onerror = cb(null, 'Error');
req.ontimeout = cb(null, 'Timeout');
req.onabort = cb(null, 'Abort');
if (body) {
setDefault(headers, 'X-Requested-With', 'XMLHttpRequest');
if (!window.FormData || !(body instanceof window.FormData)) {
setDefault(headers, 'Content-Type', 'application/x-www-form-urlencoded');
}
}
for (var i = 0, len = reqfields.length, field; i < len; i++) {
field = reqfields[i];
if (params[field] !== undefined) {
req[field] = params[field];
}
}
for (let field in headers) {
req.setRequestHeader(field, headers[field]);
}
req.send(body);
return req;
}
}));

10
test/index.spec.js Normal file
View File

@ -0,0 +1,10 @@
const test = require('tape');
const index = require('../src/index.js');
test('Index', function(t) {
t.test('setup', function(t) {
t.ok(true);
t.end();
});
});