feat(blog): add file-based blog with dynamic slugs, MDX content and layout shell
- Introduced blog routing using Next.js App Router - Implemented dynamic [slug] pages for blog posts - Added MDX-based content loading via lib/posts - Integrated shared TopBar layout with navigation - Established clear content, lib and component separation
This commit is contained in:
155
apps/public-web/node_modules/next/dist/client/form-shared.js
generated
vendored
Normal file
155
apps/public-web/node_modules/next/dist/client/form-shared.js
generated
vendored
Normal file
@@ -0,0 +1,155 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
0 && (module.exports = {
|
||||
DISALLOWED_FORM_PROPS: null,
|
||||
checkFormActionUrl: null,
|
||||
createFormSubmitDestinationUrl: null,
|
||||
hasReactClientActionAttributes: null,
|
||||
hasUnsupportedSubmitterAttributes: null,
|
||||
isSupportedFormEncType: null,
|
||||
isSupportedFormMethod: null,
|
||||
isSupportedFormTarget: null
|
||||
});
|
||||
function _export(target, all) {
|
||||
for(var name in all)Object.defineProperty(target, name, {
|
||||
enumerable: true,
|
||||
get: all[name]
|
||||
});
|
||||
}
|
||||
_export(exports, {
|
||||
DISALLOWED_FORM_PROPS: function() {
|
||||
return DISALLOWED_FORM_PROPS;
|
||||
},
|
||||
checkFormActionUrl: function() {
|
||||
return checkFormActionUrl;
|
||||
},
|
||||
createFormSubmitDestinationUrl: function() {
|
||||
return createFormSubmitDestinationUrl;
|
||||
},
|
||||
hasReactClientActionAttributes: function() {
|
||||
return hasReactClientActionAttributes;
|
||||
},
|
||||
hasUnsupportedSubmitterAttributes: function() {
|
||||
return hasUnsupportedSubmitterAttributes;
|
||||
},
|
||||
isSupportedFormEncType: function() {
|
||||
return isSupportedFormEncType;
|
||||
},
|
||||
isSupportedFormMethod: function() {
|
||||
return isSupportedFormMethod;
|
||||
},
|
||||
isSupportedFormTarget: function() {
|
||||
return isSupportedFormTarget;
|
||||
}
|
||||
});
|
||||
const DISALLOWED_FORM_PROPS = [
|
||||
'method',
|
||||
'encType',
|
||||
'target'
|
||||
];
|
||||
function createFormSubmitDestinationUrl(action, formElement) {
|
||||
let targetUrl;
|
||||
try {
|
||||
// NOTE: It might be more correct to resolve URLs relative to `document.baseURI`,
|
||||
// but we already do it relative to `location.href` elsewhere:
|
||||
// (see e.g. https://github.com/vercel/next.js/blob/bb0e6722f87ceb2d43015f5b8a413d0072f2badf/packages/next/src/client/components/app-router.tsx#L146)
|
||||
// so it's better to stay consistent.
|
||||
const base = window.location.href;
|
||||
targetUrl = new URL(action, base);
|
||||
} catch (err) {
|
||||
throw Object.defineProperty(new Error(`Cannot parse form action "${action}" as a URL`, {
|
||||
cause: err
|
||||
}), "__NEXT_ERROR_CODE", {
|
||||
value: "E152",
|
||||
enumerable: false,
|
||||
configurable: true
|
||||
});
|
||||
}
|
||||
if (targetUrl.searchParams.size) {
|
||||
// url-encoded HTML forms *overwrite* any search params in the `action` url:
|
||||
//
|
||||
// "Let `query` be the result of running the application/x-www-form-urlencoded serializer [...]"
|
||||
// "Set parsed action's query component to `query`."
|
||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#submit-mutate-action
|
||||
//
|
||||
// We need to match that.
|
||||
// (note that all other parts of the URL, like `hash`, are preserved)
|
||||
targetUrl.search = '';
|
||||
}
|
||||
const formData = new FormData(formElement);
|
||||
for (let [name, value] of formData){
|
||||
if (typeof value !== 'string') {
|
||||
// For file inputs, the native browser behavior is to use the filename as the value instead:
|
||||
//
|
||||
// "If entry's value is a File object, then let value be entry's value's name. Otherwise, let value be entry's value."
|
||||
// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs
|
||||
//
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.warn(`<Form> only supports file inputs if \`action\` is a function. File inputs cannot be used if \`action\` is a string, ` + `because files cannot be encoded as search params.`);
|
||||
}
|
||||
value = value.name;
|
||||
}
|
||||
targetUrl.searchParams.append(name, value);
|
||||
}
|
||||
return targetUrl;
|
||||
}
|
||||
function checkFormActionUrl(action, source) {
|
||||
const aPropName = source === 'action' ? `an \`action\`` : `a \`formAction\``;
|
||||
let testUrl;
|
||||
try {
|
||||
testUrl = new URL(action, 'http://n');
|
||||
} catch (err) {
|
||||
console.error(`<Form> received ${aPropName} that cannot be parsed as a URL: "${action}".`);
|
||||
return;
|
||||
}
|
||||
// url-encoded HTML forms ignore any queryparams in the `action` url. We need to match that.
|
||||
if (testUrl.searchParams.size) {
|
||||
console.warn(`<Form> received ${aPropName} that contains search params: "${action}". This is not supported, and they will be ignored. ` + `If you need to pass in additional search params, use an \`<input type="hidden" />\` instead.`);
|
||||
}
|
||||
}
|
||||
const isSupportedFormEncType = (value)=>value === 'application/x-www-form-urlencoded';
|
||||
const isSupportedFormMethod = (value)=>value === 'get';
|
||||
const isSupportedFormTarget = (value)=>value === '_self';
|
||||
function hasUnsupportedSubmitterAttributes(submitter) {
|
||||
// A submitter can override `encType` for the form.
|
||||
const formEncType = submitter.getAttribute('formEncType');
|
||||
if (formEncType !== null && !isSupportedFormEncType(formEncType)) {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.error(`<Form>'s \`encType\` was set to an unsupported value via \`formEncType="${formEncType}"\`. ` + `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// A submitter can override `method` for the form.
|
||||
const formMethod = submitter.getAttribute('formMethod');
|
||||
if (formMethod !== null && !isSupportedFormMethod(formMethod)) {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.error(`<Form>'s \`method\` was set to an unsupported value via \`formMethod="${formMethod}"\`. ` + `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// A submitter can override `target` for the form.
|
||||
const formTarget = submitter.getAttribute('formTarget');
|
||||
if (formTarget !== null && !isSupportedFormTarget(formTarget)) {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.error(`<Form>'s \`target\` was set to an unsupported value via \`formTarget="${formTarget}"\`. ` + `This will disable <Form>'s navigation functionality. If you need this, use a native <form> element instead.`);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function hasReactClientActionAttributes(submitter) {
|
||||
// CSR: https://github.com/facebook/react/blob/942eb80381b96f8410eab1bef1c539bed1ab0eb1/packages/react-dom-bindings/src/client/ReactDOMComponent.js#L482-L487
|
||||
// SSR: https://github.com/facebook/react/blob/942eb80381b96f8410eab1bef1c539bed1ab0eb1/packages/react-dom-bindings/src/client/ReactDOMComponent.js#L2401
|
||||
const action = submitter.getAttribute('formAction');
|
||||
return action && /\s*javascript:/i.test(action);
|
||||
}
|
||||
|
||||
if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
|
||||
Object.defineProperty(exports.default, '__esModule', { value: true });
|
||||
Object.assign(exports.default, exports);
|
||||
module.exports = exports.default;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=form-shared.js.map
|
||||
Reference in New Issue
Block a user