remix-hook-form
Version:
Utility wrapper around react-hook-form for use with react-router v7+
138 lines (134 loc) • 4.92 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/middleware/index.ts
var middleware_exports = {};
__export(middleware_exports, {
getFormData: () => getFormData2,
getValidatedFormData: () => getValidatedFormData,
unstable_extractFormDataMiddleware: () => unstable_extractFormDataMiddleware
});
module.exports = __toCommonJS(middleware_exports);
var import_react_router = require("react-router");
// src/utilities/index.ts
var tryParseJSON = (value) => {
if (value instanceof File || value instanceof Blob) {
return value;
}
try {
const json = JSON.parse(value);
return json;
} catch (e) {
return value;
}
};
var generateFormData = (formData, preserveStringified = false) => {
var _a;
const outputObject = {};
const keyCounts = {};
for (const key of formData.keys()) {
keyCounts[key] = ((_a = keyCounts[key]) != null ? _a : 0) + 1;
}
for (const [key, value] of formData.entries()) {
const keyCount = keyCounts[key];
const data = preserveStringified ? value : tryParseJSON(value);
const keyParts = key.split(".");
let currentObject = outputObject;
for (let i = 0; i < keyParts.length - 1; i++) {
const keyPart = keyParts[i];
if (!currentObject[keyPart]) {
currentObject[keyPart] = /^\d+$/.test(keyParts[i + 1]) ? [] : {};
}
currentObject = currentObject[keyPart];
}
const lastKeyPart = keyParts[keyParts.length - 1];
const lastKeyPartIsArray = /\[\d*\]$|\[\]$/.test(lastKeyPart);
if (lastKeyPartIsArray) {
const key2 = lastKeyPart.replace(/\[\d*\]$|\[\]$/, "");
if (!currentObject[key2]) {
currentObject[key2] = [];
}
currentObject[key2].push(data);
} else {
if (/^\d+$/.test(lastKeyPart)) {
currentObject.push(data);
} else {
if (keyCount > 1) {
if (!currentObject[key]) {
currentObject[key] = [];
}
currentObject[key].push(data);
} else {
currentObject[lastKeyPart] = data;
}
}
}
}
return outputObject;
};
var getFormDataFromSearchParams = (request, preserveStringified = false) => {
const searchParams = new URL(request.url).searchParams;
return generateFormData(searchParams, preserveStringified);
};
var isGet = (request) => request.method === "GET" || request.method === "get";
var getFormData = async (request, preserveStringified = false) => {
const receivedValues = "url" in request && isGet(request) ? getFormDataFromSearchParams(request, preserveStringified) : await parseFormData(request, preserveStringified);
return { receivedValues };
};
var validateFormData = async (data, resolver) => {
const dataToValidate = data instanceof FormData ? Object.fromEntries(data) : data;
const { errors, values } = await resolver(dataToValidate, {}, {
shouldUseNativeValidation: false,
fields: {}
});
if (Object.keys(errors).length > 0) {
return { errors, data: void 0 };
}
return { errors: void 0, data: values };
};
var parseFormData = async (request, preserveStringified = false) => {
const formData = request instanceof Request ? await request.formData() : request;
return generateFormData(formData, preserveStringified);
};
// src/middleware/index.ts
var formDataContext = (0, import_react_router.unstable_createContext)();
function unstable_extractFormDataMiddleware({
preserveStringified = false
} = {}) {
return async function extractFormDataMiddleware({ request, context }, next) {
const cloneRequest = request.clone();
const { receivedValues: formData } = await getFormData(
cloneRequest,
preserveStringified
);
context.set(formDataContext, formData);
return next();
};
}
var getFormData2 = (context) => context.get(formDataContext);
var getValidatedFormData = async (context, resolver) => {
const formData = context.get(formDataContext);
const data = await validateFormData(formData, resolver);
return { ...data, receivedValues: formData };
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
getFormData,
getValidatedFormData,
unstable_extractFormDataMiddleware
});