异步版本


\Asynchronous version

// coffeescript-hooks.mjs
import { readFile } from 'node:fs/promises';
import { findPackageJSON } from 'node:module';
import coffeescript from 'coffeescript';
const extensionsRegex = /\.(coffee|litcoffee|coffee\.md)$/;
export async function load(url, context, nextLoad) {
 if (extensionsRegex.test(url)) {
 // CoffeeScript files can be either CommonJS or ES modules. Use a custom format
 // to tell Node.js not to detect its module type.
 const { source: rawSource } = await nextLoad(url, { ...context, format: 'coffee' });
 // This hook converts CoffeeScript source code into JavaScript source code
 // for all imported CoffeeScript files.
 const transformedSource = coffeescript.compile(rawSource.toString(), url);
 // To determine how Node.js would interpret the transpilation result,
 // search up the file system for the nearest parent package.json file
 // and read its "type" field.
 return {
 format: await getPackageType(url),
 shortCircuit: true,
 source: transformedSource,
 };
 }
 // Let Node.js handle all other URLs.
 return nextLoad(url, context);
}
async function getPackageType(url) {
 // `url` is only a file path during the first iteration when passed the
 // resolved url from the load() hook
 // an actual file path from load() will contain a file extension as it's
 // required by the spec
 // this simple truthy check for whether `url` contains a file extension will
 // work for most projects but does not cover some edge-cases (such as
 // extensionless files or a url ending in a trailing space)
 const pJson = findPackageJSON(url);
 return readFile(pJson, 'utf8')
 .then(JSON.parse)
 .then((json) => json?.type)
 .catch(() => undefined);
} 

AltStyle によって変換されたページ (->オリジナル) /