UNPKG

@metalsmith/in-place

Version:

A metalsmith plugin for in-place templating

1 lines 16.8 kB
{"version":3,"file":"index.cjs","sources":["../src/utils.js","../src/index.js"],"sourcesContent":["import { dirname, join, basename, sep, isAbsolute } from 'path'\nimport jstransformer from 'jstransformer'\n\n/**\n * Parse a filepath into dirname, base & extensions\n * @param {string} filename\n */\nexport function parseFilepath(filename) {\n const isNested = filename.includes(sep)\n const dir = isNested ? dirname(filename) : ''\n const [base, ...extensions] = basename(filename).split('.')\n return { dirname: dir, base, extensions }\n}\n\n/**\n * @param {string} filename\n * @param {import('./index').Options} opts\n * @returns {string}\n */\nexport function handleExtname(filename, opts) {\n const { dirname, base, extensions } = parseFilepath(filename)\n const extname = opts.extname && opts.extname.slice(1)\n // decouples file extension chaining order from transformer usage order\n for (let i = extensions.length; i--; ) {\n if (opts.transform.inputFormats.includes(extensions[i])) {\n extensions.splice(i, 1)\n break\n }\n }\n const isLast = !extensions.length\n if (isLast && extname) extensions.push(extname)\n return [join(dirname, base), ...extensions].join('.')\n}\n\n/**\n * Get a transformer by name (\"jstransformer-ejs\"), shortened name (\"ejs\") or filesystem path\n * @param {string|JsTransformer} namePathOrTransformer\n * @param {import('metalsmith').Debugger} debug\n * @returns {Promise<JsTransformer>}\n */\nexport function getTransformer(namePathOrTransformer, debug) {\n let transform = null\n const t = namePathOrTransformer\n const tName = t\n const tPath = t\n\n // let the jstransformer constructor throw errors\n if (typeof t !== 'string') {\n transform = Promise.resolve(t)\n } else {\n if (isAbsolute(tPath) || tPath.startsWith('.') || tName.startsWith('jstransformer-')) {\n debug('Importing transformer: %s', tPath)\n transform = import(tPath).then((t) => t.default)\n } else {\n debug('Importing transformer: jstransformer-%s', tName)\n // suppose a shorthand where the jstransformer- prefix is omitted, more likely\n transform = import(`jstransformer-${tName}`)\n .then((t) => t.default)\n .catch(() => {\n // else fall back to trying to import the name\n debug.warn('\"jstransformer-%s\" not found, trying \"%s\" instead', tName, tName)\n return import(tName).then((t) => t.default)\n })\n }\n }\n return transform.then((t) => {\n return jstransformer(t)\n })\n}\n","import isUtf8 from 'is-utf8'\nimport { parseFilepath, handleExtname, getTransformer } from './utils.js'\n\n/**\n * @callback Render\n * @param {string} source\n * @param {Object} options\n * @param {Object} locals\n * @returns {string}\n */\n\n/**\n * @callback RenderAsync\n * @param {string} source\n * @param {Object} options\n * @param {Object} locals\n * @param {Function} callback\n * @returns {Promise<string>}\n */\n\n/**\n * @callback Compile\n * @param {string} source\n * @param {Object} options\n * @returns {string}\n */\n\n/**\n * @callback CompileAsync\n * @param {string} source\n * @param {Object} options\n * @param {Function} callback\n * @returns {Promise<string>}\n */\n\n/**\n * @typedef {Object} JsTransformer\n * @property {string} name\n * @property {string[]} inputFormats\n * @property {string} outputFormat\n * @property {Render} [render]\n * @property {RenderAsync} [renderAsync]\n * @property {Compile} [compile]\n * @property {CompileAsync} [compileAsync]\n */\n\n/* c8 ignore start */\nlet debug = () => {\n throw new Error('uninstantiated debug')\n}\n/* c8 ignore end */\n\nasync function render({ filename, files, metalsmith, options, transform }) {\n const file = files[filename]\n const engineOptions = Object.assign({}, options.engineOptions)\n if (options.engineOptions.filename) {\n Object.assign(engineOptions, {\n // set the filename in options for jstransformers requiring it (like Pug)\n filename: metalsmith.path(metalsmith.source(), filename)\n })\n }\n const metadata = metalsmith.metadata()\n debug(`rendering ${filename}`)\n\n const locals = Object.assign({}, metadata, file)\n const contents = file.contents.toString()\n\n return transform\n .renderAsync(contents, engineOptions, locals)\n .then((rendered) => {\n const newName = handleExtname(filename, { ...options, transform })\n debug('Done rendering %s', filename)\n debug('Renaming \"%s\" to \"%s\"', filename, newName)\n\n if (newName !== filename) {\n delete files[filename]\n files[newName] = file\n }\n files[newName].contents = Buffer.from(rendered.body)\n })\n .catch((err) => {\n err.message = `${filename}: ${err.message}`\n throw err\n })\n}\n\n/**\n * Validate, checks whether a file should be processed\n */\n\nfunction validate({ filename, files, transform }) {\n const { extensions } = parseFilepath(filename)\n debug(`validating ${filename} %O %O`, extensions, transform.inputFormats)\n\n // IF the transform has inputFormats defined, invalidate the file if it has no matching extname\n if (transform.inputFormats && !extensions.some((fmt) => transform.inputFormats.includes(fmt))) {\n debug.warn(\n 'Validation failed for file \"%s\", transformer %s supports extensions %s.',\n filename,\n transform.name,\n transform.inputFormats.map((i) => `.${i}`).join(', ')\n )\n }\n\n // Files that are not utf8 are ignored\n if (!isUtf8(files[filename].contents)) {\n debug.warn(`Validation failed, %s is not utf-8`, filename)\n return false\n }\n return true\n}\n\n/**\n * @typedef {Object} Options\n * @property {string|JsTransformer} transform Jstransformer to run: name of a node module or local JS module path (starting with `.`) whose default export is a jstransformer. As a shorthand for existing transformers you can remove the `jstransformer-` prefix: `marked` will be understood as `jstransformer-marked`. Or an actual jstransformer; an object with `name`, `inputFormats`,`outputFormat`, and at least one of the render methods `render`, `renderAsync`, `compile` or `compileAsync` described in the [jstransformer API docs](https://github.com/jstransformers/jstransformer#api)\n * @property {string} [pattern='**\\/*.<transform.inputFormats>'] (*optional*) One or more paths or glob patterns to limit the scope of the transform. Defaults to `'**\\/*.<transform.inputFormats>*'`\n * @property {Object} [engineOptions={}] (*optional*) Pass options to the jstransformer templating engine that's rendering your files. The default is `{}`\n * @property {string} [extname] (*optional*) Pass `''` to remove the extension or `'.<extname>'` to keep or rename it. Defaults to `transform.outputFormat`\n **/\n\n/**\n * Set default options based on jstransformer `transform`\n * @param {JsTransformer} transform\n * @returns {Options}\n */\nfunction normalizeOptions(transform) {\n const extMatch =\n transform.inputFormats.length === 1 ? transform.inputFormats[0] : `{${transform.inputFormats.join(',')}}`\n return {\n pattern: `**/*.${extMatch}*`,\n extname: `.${transform.outputFormat}`,\n engineOptions: {}\n }\n}\n\n/**\n * A metalsmith plugin for in-place templating\n * @param {Options} options\n * @returns {import('metalsmith').Plugin}\n */\nfunction inPlace(options = {}) {\n let transform\n\n return async function inPlace(files, metalsmith, done) {\n debug = metalsmith.debug('@metalsmith/in-place')\n\n // Check whether the pattern option is valid\n if (options.pattern && !(typeof options.pattern === 'string' || Array.isArray(options.pattern))) {\n return done(\n new Error(\n 'invalid pattern, the pattern option should be a string or array of strings. See https://www.npmjs.com/package/@metalsmith/in-place#pattern'\n )\n )\n }\n\n // skip resolving the transform option on repeat runs\n if (!transform) {\n try {\n transform = await getTransformer(options.transform, debug)\n } catch (err) {\n // pass through jstransformer & Node import resolution errors\n return done(err)\n }\n }\n\n options = Object.assign(normalizeOptions(transform), options)\n\n debug('Running with options %O', options)\n\n const matchedFiles = metalsmith.match(options.pattern)\n\n // Filter files by validity, pass basename to avoid dots in folder path\n const validFiles = matchedFiles.filter((filename) => validate({ filename, files, transform }))\n\n // Let the user know when there are no files to process\n if (validFiles.length === 0) {\n debug.warn('No valid files to process.')\n return done()\n } else {\n debug('Rendering %s files', validFiles.length)\n }\n\n // Map all files that should be processed to an array of promises and call done when finished\n return Promise.all(validFiles.map((filename) => render({ filename, files, metalsmith, options, transform })))\n .then(() => done())\n .catch((error) => done(error))\n }\n}\n\nexport default inPlace\n"],"names":["parseFilepath","filename","isNested","includes","sep","dir","dirname","base","extensions","basename","split","handleExtname","opts","extname","slice","i","length","transform","inputFormats","splice","isLast","push","join","getTransformer","namePathOrTransformer","debug","t","tName","tPath","Promise","resolve","isAbsolute","startsWith","then","default","catch","warn","jstransformer","Error","render","files","metalsmith","options","file","engineOptions","Object","assign","path","source","metadata","locals","contents","toString","renderAsync","rendered","newName","Buffer","from","body","err","message","validate","some","fmt","name","map","isUtf8","normalizeOptions","extMatch","pattern","outputFormat","inPlace","done","Array","isArray","matchedFiles","match","validFiles","filter","all","error"],"mappings":"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"}