@hdsydsvenskan/forms-utils
Advanced tools
Comparing version 1.1.6 to 1.2.0
@@ -0,3 +1,9 @@ | ||
// @ts-check | ||
/// <reference types="node" /> | ||
'use strict'; | ||
/** @typedef {import('./lib/promise').Form} Form */ | ||
/** @typedef {import('./lib/promise').FormBound} FormBound */ | ||
const fields = { | ||
@@ -4,0 +10,0 @@ basic: require('./lib/basic-field'), |
@@ -0,7 +1,28 @@ | ||
// @ts-check | ||
/// <reference types="node" /> | ||
'use strict'; | ||
/** @typedef {{ data: { [fieldName: string]: any }, [otherProperties: string]: any }} FormBound */ | ||
/** @typedef {{ handle: FormHandleMethod, [otherProperties: string]: any }} Form */ | ||
/** @typedef {(form: FormBound) => void} FormHandleCallback */ | ||
/** | ||
* @callback FormHandleMethod | ||
* @param {Object<string, any> | import('http').IncomingMessage} req | ||
* @param {{ success?: FormHandleCallback, error?: FormHandleCallback, empty?: FormHandleCallback, other?: FormHandleCallback }} callbacks | ||
*/ | ||
/** @typedef {Promise<{ success?: boolean, error?: boolean, empty?: boolean, form: FormBound }>} PromisedFormHandle */ | ||
/** | ||
* @param {Form|Promise<Form>} form | ||
* @param {Object<string, any> | import('http').IncomingMessage} body | ||
* @returns {PromisedFormHandle} | ||
*/ | ||
const promisedFormHandle = async function (form, body) { | ||
form = await form; | ||
const resolvedForm = await form; | ||
return new Promise(resolve => { | ||
form.handle(body, { | ||
resolvedForm.handle(body, { | ||
success: form => resolve({ success: true, form }), | ||
@@ -14,19 +35,42 @@ error: form => resolve({ error: true, form }), | ||
const promisedFormHandles = function (forms, body) { | ||
/** | ||
* @param {{ [formName: string]: Form|Promise<Form> }[]} forms | ||
* @param {Object<string, any> | import('http').IncomingMessage} body | ||
* @returns {Promise<{ success?: boolean, error?: boolean, empty?: boolean, forms: { [formName: string]: FormBound }}>} | ||
*/ | ||
const promisedFormHandles = async function (forms, body) { | ||
const formKeys = Object.keys(forms); | ||
return Promise.all(formKeys.map(formKey => promisedFormHandle(forms[formKey], body))) | ||
.then(results => { | ||
let resultForms = {}; | ||
results.forEach((result, i) => { resultForms[formKeys[i]] = result.form; }); | ||
if (!formKeys.length) return { success: true, forms: {} }; | ||
if (results.some(result => result.error)) { | ||
return { error: true, forms: resultForms }; | ||
} | ||
if (results.some(result => !result.success)) { | ||
return { empty: true, forms: resultForms }; | ||
} | ||
const formValues = Object.values(forms); | ||
/** @type {Form[]} */ | ||
// @ts-ignore | ||
const resolvedFormValues = await Promise.all(formValues); | ||
const [ first, ...remaining ] = resolvedFormValues; | ||
return { success: true, forms: resultForms }; | ||
}); | ||
/** @type {PromisedFormHandle[]} */ | ||
let promisedHandles = [ | ||
promisedFormHandle(first, body) | ||
]; | ||
for (const value of remaining) { | ||
promisedHandles.push(promisedFormHandle(value, body)); | ||
} | ||
const results = await Promise.all(promisedHandles); | ||
/** @type {{ [formName: string]: FormBound }} */ | ||
let resultForms = {}; | ||
results.forEach((result, i) => { resultForms[formKeys[i]] = result.form; }); | ||
if (results.some(result => result.error)) { | ||
return { error: true, forms: resultForms }; | ||
} | ||
if (results.some(result => !result.success)) { | ||
return { empty: true, forms: resultForms }; | ||
} | ||
return { success: true, forms: resultForms }; | ||
}; | ||
@@ -33,0 +77,0 @@ |
{ | ||
"name": "@hdsydsvenskan/forms-utils", | ||
"version": "1.1.6", | ||
"version": "1.2.0", | ||
"license": "MIT", | ||
"description": "A set of useful utilities for the forms module", | ||
"author": "Pelle Wessman <pelle.wessman@kodfabrik.se> (http://kodfabrik.se/)", | ||
"author": "Pelle Wessman <pelle.wessman@hdsydsvenskan.se>", | ||
"homepage": "https://github.com/sydsvenskan/node-forms-utils", | ||
@@ -19,5 +19,6 @@ "repository": { | ||
"dependency-check": "JS_FILES=\"*.js lib/*.js\" && dependency-check . $JS_FILES && dependency-check . $JS_FILES --unused --no-dev", | ||
"test": "eslint --ext .js --ext .jsx . && npm run --silent dependency-check" | ||
"test": "eslint --ext .js --ext .jsx . && npm run --silent dependency-check && tsc" | ||
}, | ||
"devDependencies": { | ||
"@types/node": "^10.0.0", | ||
"dependency-check": "^3.2.1", | ||
@@ -30,7 +31,9 @@ "eslint": "^5.7.0", | ||
"eslint-plugin-standard": "^4.0.0", | ||
"forms": "1.3.0" | ||
"forms": "1.3.0", | ||
"typescript": "^3.7.5" | ||
}, | ||
"peerDependencies": { | ||
"forms": "^1.2.0" | ||
} | ||
}, | ||
"dependencies": {} | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
25348
19
503
0
10