120 lines
5.8 KiB
JavaScript
120 lines
5.8 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
Object.defineProperty(exports, "default", {
|
||
|
enumerable: true,
|
||
|
get: function() {
|
||
|
return nextFontLoader;
|
||
|
}
|
||
|
});
|
||
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
||
|
const _picocolors = require("../../../../lib/picocolors");
|
||
|
const _loaderutils3 = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/loader-utils3"));
|
||
|
const _postcssnextfont = /*#__PURE__*/ _interop_require_default(require("./postcss-next-font"));
|
||
|
const _util = require("util");
|
||
|
function _interop_require_default(obj) {
|
||
|
return obj && obj.__esModule ? obj : {
|
||
|
default: obj
|
||
|
};
|
||
|
}
|
||
|
async function nextFontLoader() {
|
||
|
const nextFontLoaderSpan = this.currentTraceSpan.traceChild("next-font-loader");
|
||
|
return nextFontLoaderSpan.traceAsyncFn(async ()=>{
|
||
|
const callback = this.async();
|
||
|
/**
|
||
|
* The next-swc plugin next-transform-font turns font function calls into CSS imports.
|
||
|
* At the end of the import, it adds the call arguments and some additional data as a resourceQuery.
|
||
|
* e.g:
|
||
|
* const inter = Inter({ subset: ['latin'] })
|
||
|
* ->
|
||
|
* import inter from 'next/font/google/target.css?{"import":"Inter","subsets":["latin"]}'
|
||
|
*
|
||
|
* Here we parse the resourceQuery to get the font function name, call arguments, and the path to the file that called the font function.
|
||
|
*/ const { path: relativeFilePathFromRoot, import: functionName, arguments: data, variableName } = JSON.parse(this.resourceQuery.slice(1));
|
||
|
// Throw error if @next/font is used in _document.js
|
||
|
if (/pages[\\/]_document\./.test(relativeFilePathFromRoot)) {
|
||
|
const err = new Error(`${(0, _picocolors.bold)("Cannot")} be used within ${(0, _picocolors.cyan)("pages/_document.js")}.`);
|
||
|
err.name = "NextFontError";
|
||
|
callback(err);
|
||
|
return;
|
||
|
}
|
||
|
const { isDev, isServer, assetPrefix, fontLoaderPath, postcss: getPostcss } = this.getOptions();
|
||
|
if (assetPrefix && !/^\/|https?:\/\//.test(assetPrefix)) {
|
||
|
const err = new Error("assetPrefix must start with a leading slash or be an absolute URL(http:// or https://)");
|
||
|
err.name = "NextFontError";
|
||
|
callback(err);
|
||
|
return;
|
||
|
}
|
||
|
/**
|
||
|
* Emit font files to .next/static/media as [hash].[ext].
|
||
|
*
|
||
|
* If the font should be preloaded, add .p to the filename: [hash].p.[ext]
|
||
|
* NextFontManifestPlugin adds these files to the next/font manifest.
|
||
|
*
|
||
|
* If the font is using a size-adjust fallback font, add -s to the filename: [hash]-s.[ext]
|
||
|
* NextFontManifestPlugin uses this to see if fallback fonts are being used.
|
||
|
* This is used to collect stats on fallback fonts usage by the Google Aurora team.
|
||
|
*/ const emitFontFile = (content, ext, preload, isUsingSizeAdjust)=>{
|
||
|
const opts = {
|
||
|
context: this.rootContext,
|
||
|
content
|
||
|
};
|
||
|
const interpolatedName = _loaderutils3.default.interpolateName(this, `static/media/[hash]${isUsingSizeAdjust ? "-s" : ""}${preload ? ".p" : ""}.${ext}`, opts);
|
||
|
const outputPath = `${assetPrefix}/_next/${interpolatedName}`;
|
||
|
// Only the client emits the font file
|
||
|
if (!isServer) {
|
||
|
this.emitFile(interpolatedName, content, null);
|
||
|
}
|
||
|
// But both the server and client must get the resulting path
|
||
|
return outputPath;
|
||
|
};
|
||
|
try {
|
||
|
// Import the font loader function from either next/font/local or next/font/google
|
||
|
// The font loader function emits font files and returns @font-faces and fallback font metrics
|
||
|
const fontLoader = require(fontLoaderPath).default;
|
||
|
let { css, fallbackFonts, adjustFontFallback, weight, style, variable } = await nextFontLoaderSpan.traceChild("font-loader").traceAsyncFn(()=>fontLoader({
|
||
|
functionName,
|
||
|
variableName,
|
||
|
data,
|
||
|
emitFontFile,
|
||
|
resolve: (src)=>(0, _util.promisify)(this.resolve)(_path.default.dirname(_path.default.join(this.rootContext, relativeFilePathFromRoot)), src.startsWith(".") ? src : `./${src}`),
|
||
|
isDev,
|
||
|
isServer,
|
||
|
loaderContext: this
|
||
|
}));
|
||
|
const { postcss } = await getPostcss();
|
||
|
// Exports will be exported as is from css-loader instead of a CSS module export
|
||
|
const exports1 = [];
|
||
|
// Generate a hash from the CSS content. Used to generate classnames and font families
|
||
|
const fontFamilyHash = _loaderutils3.default.getHashDigest(Buffer.from(css), "sha1", "hex", 6);
|
||
|
// Add CSS classes, exports and make the font-family locally scoped by turning it unguessable
|
||
|
const result = await nextFontLoaderSpan.traceChild("postcss").traceAsyncFn(()=>postcss((0, _postcssnextfont.default)({
|
||
|
exports: exports1,
|
||
|
fontFamilyHash,
|
||
|
fallbackFonts,
|
||
|
weight,
|
||
|
style,
|
||
|
adjustFontFallback,
|
||
|
variable
|
||
|
})).process(css, {
|
||
|
from: undefined
|
||
|
}));
|
||
|
const ast = {
|
||
|
type: "postcss",
|
||
|
version: result.processor.version,
|
||
|
root: result.root
|
||
|
};
|
||
|
// Return the resulting CSS and send the postcss ast, font exports and the hash to the css-loader in the meta argument.
|
||
|
callback(null, result.css, null, {
|
||
|
exports: exports1,
|
||
|
ast,
|
||
|
fontFamilyHash
|
||
|
});
|
||
|
} catch (err) {
|
||
|
callback(err);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
//# sourceMappingURL=index.js.map
|