url type added
+ support for `Url` columns
This commit is contained in:
		| @ -1,3 +1,3 @@ | |||||||
| id,name,is_good,score,email,json,date | id,name,is_good,score,email,json,date,url | ||||||
| 1,john,1,0.8412384213497,john.doe@example.com,[],2023-03-05T00:35:21.104Z | 1,john,1,0.8412384213497,john.doe@example.com,[],2023-03-05T00:35:21.104Z,https://example.com | ||||||
| 2,fire,0,-80347329472,firebase@google.com,{"xd": "nice meme"}, | 2,fire,0,-80347329472,firebase@google.com,{"xd": "nice meme"},,sftp://fire@8.8.8.8/base.txt | ||||||
| Can't render this file because it contains an unexpected character in line 3 and column 44. | 
| @ -6,7 +6,8 @@ | |||||||
|     "score": 0.8412384213497, |     "score": 0.8412384213497, | ||||||
|     "email": "john.doe@example.com", |     "email": "john.doe@example.com", | ||||||
|     "json": [], |     "json": [], | ||||||
|     "date": "2023-03-05T00:35:21.104Z" |     "date": "2023-03-05T00:35:21.104Z", | ||||||
|  |     "url": "https://example.com" | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     "id": 2, |     "id": 2, | ||||||
| @ -17,6 +18,7 @@ | |||||||
|     "json": { |     "json": { | ||||||
|       "xd": "nice meme" |       "xd": "nice meme" | ||||||
|     }, |     }, | ||||||
|     "date": null |     "date": null, | ||||||
|  |     "url": "sftp://fire@8.8.8.8/base.txt" | ||||||
|   } |   } | ||||||
| ] | ] | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ export const POCKETBASE_TYPE = { | |||||||
|   EMAIL: "email", |   EMAIL: "email", | ||||||
|   JSON: "json", |   JSON: "json", | ||||||
|   DATETIME: "date", |   DATETIME: "date", | ||||||
|  |   URL: "url", | ||||||
| } as const; | } as const; | ||||||
|  |  | ||||||
| type ObjectValues<T> = T[keyof T]; | type ObjectValues<T> = T[keyof T]; | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ import { | |||||||
|   PocketbaseType, |   PocketbaseType, | ||||||
| } from "../types/pocketbase.ts"; | } from "../types/pocketbase.ts"; | ||||||
| import { createSchemaField, generateRowSchema } from "./pocketbase.ts"; | import { createSchemaField, generateRowSchema } from "./pocketbase.ts"; | ||||||
| import { isBool, isDate, isEmail, isJson, isNumber } from "./regex.ts"; | import { isBool, isDate, isEmail, isJson, isNumber, isUrl } from "./regex.ts"; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Reads raw data from a CSV file. |  * Reads raw data from a CSV file. | ||||||
| @ -122,6 +122,10 @@ export function addSchemaField(data: RawCsvRow[], prop: string): SchemaField { | |||||||
|     return createSchemaField(targetProp, "date"); |     return createSchemaField(targetProp, "date"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   if (isUrl(data, prop)) { | ||||||
|  |     return createSchemaField(targetProp, "url"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // Plain text is the default type |   // Plain text is the default type | ||||||
|   return createSchemaField(targetProp, "text"); |   return createSchemaField(targetProp, "text"); | ||||||
| } | } | ||||||
| @ -206,6 +210,8 @@ function parseValue(value: string, type: PocketbaseType): any { | |||||||
|       return value !== "" ? value : null; |       return value !== "" ? value : null; | ||||||
|     case POCKETBASE_TYPE.DATETIME: |     case POCKETBASE_TYPE.DATETIME: | ||||||
|       return value !== "" ? value : null; |       return value !== "" ? value : null; | ||||||
|  |     case POCKETBASE_TYPE.URL: | ||||||
|  |       return value !== "" ? value : null; | ||||||
|     default: |     default: | ||||||
|       console.error( |       console.error( | ||||||
|         `%cPbTypeError: value parser for type '${type}' is not yet implemented.`, |         `%cPbTypeError: value parser for type '${type}' is not yet implemented.`, | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ import { SchemaField } from "https://unpkg.com/pocketbase@0.12.0/dist/pocketbase | |||||||
| import { RawJsonRow } from "../types/json.ts"; | import { RawJsonRow } from "../types/json.ts"; | ||||||
| import { POCKETBASE_SYSFIELD } from "../types/pocketbase.ts"; | import { POCKETBASE_SYSFIELD } from "../types/pocketbase.ts"; | ||||||
| import { createSchemaField } from "./pocketbase.ts"; | import { createSchemaField } from "./pocketbase.ts"; | ||||||
| import { isDate, isEmail } from "./regex.ts"; | import { isDate, isEmail, isUrl } from "./regex.ts"; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Reads an array of rows from a JSON file. |  * Reads an array of rows from a JSON file. | ||||||
| @ -89,6 +89,9 @@ export function addSchemaField(data: RawJsonRow[], prop: string): SchemaField { | |||||||
|     case "bigint": |     case "bigint": | ||||||
|       return createSchemaField(targetProp, "number"); |       return createSchemaField(targetProp, "number"); | ||||||
|     case "string": |     case "string": | ||||||
|  |       if(isUrl(data, targetProp)) { | ||||||
|  |         return createSchemaField(targetProp, "url"); | ||||||
|  |       } | ||||||
|       if (isEmail(data, targetProp)) { |       if (isEmail(data, targetProp)) { | ||||||
|         return createSchemaField(targetProp, "email"); |         return createSchemaField(targetProp, "email"); | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -50,6 +50,9 @@ export function getSchemaType( | |||||||
|     case POCKETBASE_TYPE.DATETIME: |     case POCKETBASE_TYPE.DATETIME: | ||||||
|       return POCKETBASE_TYPE.DATETIME; |       return POCKETBASE_TYPE.DATETIME; | ||||||
|  |  | ||||||
|  |     case POCKETBASE_TYPE.URL: | ||||||
|  |       return POCKETBASE_TYPE.URL; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|       console.error( |       console.error( | ||||||
|         `%cPbTypeError: Unsupported type '${schemaField.type}'`, |         `%cPbTypeError: Unsupported type '${schemaField.type}'`, | ||||||
| @ -137,6 +140,18 @@ export function createSchemaField( | |||||||
|           max: null, |           max: null, | ||||||
|         }, |         }, | ||||||
|       }); |       }); | ||||||
|  |     case POCKETBASE_TYPE.URL: | ||||||
|  |       return new SchemaField({ | ||||||
|  |         name, | ||||||
|  |         type, | ||||||
|  |         system: false, | ||||||
|  |         required: false, | ||||||
|  |         unique: false, | ||||||
|  |         options: { | ||||||
|  |           exceptDomains: null, | ||||||
|  |           onlyDomains: null, | ||||||
|  |         }, | ||||||
|  |       }); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -64,6 +64,31 @@ export function isNumber(data: RawCsvRow[], prop: string): boolean { | |||||||
|   return matched === values && matched > 0; |   return matched === values && matched > 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Checks if the column type could be `Url`. | ||||||
|  |  * @param data Sample data. | ||||||
|  |  * @param prop Validated property. | ||||||
|  |  * @returns  | ||||||
|  |  */ | ||||||
|  | export function isUrl(data: RawCsvRow[], prop: string): boolean { | ||||||
|  |   let values = 0; | ||||||
|  |   let parsed = 0; | ||||||
|  |  | ||||||
|  |   data.forEach((obj) => { | ||||||
|  |     if (obj[prop] !== "" && obj[prop] !== null) { | ||||||
|  |       values++; | ||||||
|  |       try { | ||||||
|  |         new URL(obj[prop]); | ||||||
|  |         parsed++; | ||||||
|  |       } // deno-lint-ignore no-empty | ||||||
|  |       catch {} | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   // an empty column will return false | ||||||
|  |   return parsed === values && parsed > 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Checks if the column type could be `Email`. |  * Checks if the column type could be `Email`. | ||||||
|  * @param data Sample data. |  * @param data Sample data. | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user