93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | 
 | ||
|  | /** @typedef {import("ajv").Ajv} Ajv */ | ||
|  | 
 | ||
|  | /** @typedef {import("ajv").ValidateFunction} ValidateFunction */ | ||
|  | 
 | ||
|  | /** @typedef {import("../validate").SchemaUtilErrorObject} SchemaUtilErrorObject */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {string} message | ||
|  |  * @param {object} schema | ||
|  |  * @param {string} data | ||
|  |  * @returns {SchemaUtilErrorObject} | ||
|  |  */ | ||
|  | function errorMessage(message, schema, data) { | ||
|  |   return { | ||
|  |     // @ts-ignore
 | ||
|  |     // eslint-disable-next-line no-undefined
 | ||
|  |     dataPath: undefined, | ||
|  |     // @ts-ignore
 | ||
|  |     // eslint-disable-next-line no-undefined
 | ||
|  |     schemaPath: undefined, | ||
|  |     keyword: "absolutePath", | ||
|  |     params: { | ||
|  |       absolutePath: data | ||
|  |     }, | ||
|  |     message, | ||
|  |     parentSchema: schema | ||
|  |   }; | ||
|  | } | ||
|  | /** | ||
|  |  * @param {boolean} shouldBeAbsolute | ||
|  |  * @param {object} schema | ||
|  |  * @param {string} data | ||
|  |  * @returns {SchemaUtilErrorObject} | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | function getErrorFor(shouldBeAbsolute, schema, data) { | ||
|  |   const message = shouldBeAbsolute ? `The provided value ${JSON.stringify(data)} is not an absolute path!` : `A relative path is expected. However, the provided value ${JSON.stringify(data)} is an absolute path!`; | ||
|  |   return errorMessage(message, schema, data); | ||
|  | } | ||
|  | /** | ||
|  |  * | ||
|  |  * @param {Ajv} ajv | ||
|  |  * @returns {Ajv} | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | function addAbsolutePathKeyword(ajv) { | ||
|  |   ajv.addKeyword("absolutePath", { | ||
|  |     errors: true, | ||
|  |     type: "string", | ||
|  | 
 | ||
|  |     compile(schema, parentSchema) { | ||
|  |       /** @type {ValidateFunction} */ | ||
|  |       const callback = data => { | ||
|  |         let passes = true; | ||
|  |         const isExclamationMarkPresent = data.includes("!"); | ||
|  | 
 | ||
|  |         if (isExclamationMarkPresent) { | ||
|  |           callback.errors = [errorMessage(`The provided value ${JSON.stringify(data)} contains exclamation mark (!) which is not allowed because it's reserved for loader syntax.`, parentSchema, data)]; | ||
|  |           passes = false; | ||
|  |         } // ?:[A-Za-z]:\\ - Windows absolute path
 | ||
|  |         // \\\\ - Windows network absolute path
 | ||
|  |         // \/ - Unix-like OS absolute path
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         const isCorrectAbsolutePath = schema === /^(?:[A-Za-z]:(\\|\/)|\\\\|\/)/.test(data); | ||
|  | 
 | ||
|  |         if (!isCorrectAbsolutePath) { | ||
|  |           callback.errors = [getErrorFor(schema, parentSchema, data)]; | ||
|  |           passes = false; | ||
|  |         } | ||
|  | 
 | ||
|  |         return passes; | ||
|  |       }; | ||
|  | 
 | ||
|  |       callback.errors = []; | ||
|  |       return callback; | ||
|  |     } | ||
|  | 
 | ||
|  |   }); | ||
|  |   return ajv; | ||
|  | } | ||
|  | 
 | ||
|  | var _default = addAbsolutePathKeyword; | ||
|  | exports.default = _default; |