Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

hyperagent-forms.js Build StatusCoverage Status

hyperagent-forms is a plugin for hyperagent.js adding support for a custom, unofficial form profile to HAL.

Installation

Download with bower or alternatively install manually.

bower install hyperagent-forms

Usage

Just configure hyperagent.js to run the plugin's load hook when a resource is loaded:

Hyperagent.configure('loadHooks',[HyperagentForms.LoadHook]);

Dependencies

There is optional support for JSON Schema v4 validation through the Tiny Validator for JSON Schema v4 tv4. You only need to load it if you want to use validate, though.

Spec

There is no official support for write access in HAL at this time, but several discussions have been had around this topic. This library implements a custom schema, based on what has been proposed in those discussions.

Example

The following JSON response represents the entry point of https://rw-api.example.com and shall serve as an example for using hyperclient.

{
"_links": {
"self": {
"href": "/"
},
"curies": [
{
"name": "ht",
"href": "http://haltalk.herokuapp.com/rels/{rel}",
"templated": true
}
]
},
"_forms": {
"ht:signup": {
"href": "/signup",
"method": "POST",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Create an account",
"title": "signup",
"required": [
"username",
"password"
],
"type": "object",
"properties": {
"username": {
"minLength": 1,
"type": "string",
"description": "The username you want to log in with."
},
"password": {
"type": "string",
"description": "The password you want to log in with."
},
"bio": {
"type": "string",
"description": "A short description of yourself."
},
"real_name": {
"type": "string",
"description": "The name you were born with."
}
}
}
}
}
}

Forms

Forms are available as forms attribute on your Hyperagent Resource.

varapi=Hyperagent.Resource('https://api-rw.example.com/');api.fetch().then(function(){varsignup=newapi.forms['ht:signup']({username: 'mkelly'});signup.data.username='overwrite';if(signup.validate()){signup.submit();}else{console.error(signup.errors);}});

Submitting this formular with the data { username: 'mkelly', password: 'ilikehal' } would cause an HTTP request similar to this to be sent:

POST /signup HTTP/1.1Host: api-rw.example.com...Content-Type: application/jsonContent-Size: xxx
{
"username": "mkelly",
"password": "ilikehal"
}

API

Resource#forms

When the plugin is loaded, a forms attribute is added to every loaded Resource instance and represents the form objects under the _forms key of the document. Forms are lazily constructed and can be accessed via name, CURIE or expanded URL.

assert.equal(api.forms['ht:signup'],api.forms['http://haltalk.herokuapp.com/rels/signup']);

The return value is a constructor for a Form class and also exposes a schema attribute that contains the raw JSON schema that can be accessed without instantiating the object.

buildFormFor(api.forms['ht:signup'].schema);

Form([data])

The constructor of Forms takes an object containing the form values specified by the schema.

varform=newapi.forms['ht:signup']({username: 'passy',password: 'unicorns'});

The form can also be constructed without passing in data:

varform=newapi.forms['delete']();

Form#data

The data passed into the constructor can be altered at any point through the data attribute:

varform=newapi.forms['ht:signup']({password: 'popsicles'});form.data.username='newuser';console.log(form.data.password);// "popsicles"

Form#schema / Form.schema

If the form has a JSON schema, it can be accessed through the object or the class. This can be used to generate user interfaces based on the required inputs or own validations.

Form#submit()

Submits the data to the specified href. The data will be stringified as JSON and is passed as request body. The return value is a promise that contains a DelayedResource object both when resolved and rejected:

form.submit().then(function(result){console.log('Status Code: ',result.xhr.statusCode);console.log('User name: ',result.loadResource().props.username);},function(error){console.warn('Status Code: ',result.xhr.statusCode);console.warn('Error Message: ',result.loadResource().props.error);});

DelayedResource

A delayed resource is wrapped in a promise returned from submit operation. It always contains the underlying XMLHttpRequest object as xhr attribute and has a loadResource() message that can be used to interpret the response text as HAL document.

License

Licensed under MIT

About

A plugin for hyperagent.js that adds support for a HAL forms profile

Resources

Contributing

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages