Skip to content

Commit

Permalink
feat: add argument validation using joi
Browse files Browse the repository at this point in the history
  • Loading branch information
recursive-beast committed Aug 8, 2023
1 parent 8e421b1 commit 4ee6b01
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 20 deletions.
46 changes: 45 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
"@babel/generator": "^7.22.9",
"@babel/parser": "^7.22.7",
"@babel/traverse": "^7.22.8",
"@rollup/pluginutils": "^5.0.2"
"@rollup/pluginutils": "^5.0.2",
"joi": "^17.9.2"
}
}
45 changes: 27 additions & 18 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { parse } from "@babel/parser";
import traverse from "@babel/traverse";
import { createFilter } from "@rollup/pluginutils";
import fs from "fs/promises";
import Joi from "joi";
import path from "path";
import { Plugin } from "rollup";

Expand All @@ -11,15 +12,6 @@ const PREFIX = `\0${PLUGIN_NAME}:`;

export type FilterPattern = string | RegExp | (string | RegExp)[];

export function isFilterPattern(value: unknown): value is FilterPattern {
let tmp: unknown[];

if (Array.isArray(value)) tmp = value;
else tmp = [value];

return tmp.every((e) => typeof e === "string" || e instanceof RegExp);
}

export interface ExternalAssetsOptions {
/** A pattern, or array of patterns, to match files the plugin should ignore. */
include: FilterPattern;
Expand All @@ -29,6 +21,29 @@ export interface ExternalAssetsOptions {
resolve?: string;
}

const union = Joi.alternatives(Joi.string(), Joi.object().regex());
const patternSchema = Joi.alternatives<FilterPattern>(
union,
Joi.array().items(union).min(1)
);
const optionsSchema = Joi.object<ExternalAssetsOptions>({
include: patternSchema.required(),
exclude: patternSchema,
resolve: Joi.string(),
});

function validate(arg: unknown): ExternalAssetsOptions {
const pattern = patternSchema.validate(arg);

if (!pattern.error) return { include: pattern.value };

const options = optionsSchema.validate(arg);

if (!options.error) return options.value;

throw new TypeError("Invalid argument");
}

/**
* Make assets external but include them in the output.
* @param options The options object.
Expand All @@ -41,15 +56,9 @@ function externalAssets(options: ExternalAssetsOptions): Plugin;
*/
function externalAssets(pattern: FilterPattern): Plugin;

function externalAssets(arg: FilterPattern | ExternalAssetsOptions): Plugin {
let idFilter: ReturnType<typeof createFilter>;

if (isFilterPattern(arg)) {
idFilter = createFilter(arg);
} else {
const { include, exclude, resolve } = arg;
idFilter = createFilter(include, exclude, { resolve });
}
function externalAssets(arg: unknown): Plugin {
const { include, exclude, resolve } = validate(arg);
const idFilter = createFilter(include, exclude, { resolve });

return {
name: PLUGIN_NAME,
Expand Down

0 comments on commit 4ee6b01

Please sign in to comment.