url type added
+ support for `Url` columns
This commit is contained in:
parent
63bf053c36
commit
3c78bb2a1b
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user