@leettools/common 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +16 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/content.d.ts +6 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +33 -0
- package/dist/content.js.map +1 -0
- package/dist/csv.d.ts +10 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +63 -0
- package/dist/csv.js.map +1 -0
- package/dist/deprecatied.d.ts +5 -0
- package/dist/deprecatied.d.ts.map +1 -0
- package/dist/deprecatied.js +18 -0
- package/dist/deprecatied.js.map +1 -0
- package/dist/errors.d.ts +106 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +196 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +8 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +46 -0
- package/dist/json.js.map +1 -0
- package/dist/language.d.ts +13 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +89 -0
- package/dist/language.js.map +1 -0
- package/dist/node/dotenv_utils.d.ts +13 -0
- package/dist/node/dotenv_utils.d.ts.map +1 -0
- package/dist/node/dotenv_utils.js +82 -0
- package/dist/node/dotenv_utils.js.map +1 -0
- package/dist/node/file_utils.d.ts +30 -0
- package/dist/node/file_utils.d.ts.map +1 -0
- package/dist/node/file_utils.js +211 -0
- package/dist/node/file_utils.js.map +1 -0
- package/dist/node/module_utils.d.ts +2 -0
- package/dist/node/module_utils.d.ts.map +1 -0
- package/dist/node/module_utils.js +30 -0
- package/dist/node/module_utils.js.map +1 -0
- package/dist/registry.d.ts +11 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +48 -0
- package/dist/registry.js.map +1 -0
- package/dist/template.d.ts +5 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +62 -0
- package/dist/template.js.map +1 -0
- package/dist/time.d.ts +7 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +47 -0
- package/dist/time.js.map +1 -0
- package/dist/tokenizer.d.ts +3 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +26 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +128 -0
- package/dist/types.js.map +1 -0
- package/dist/url.d.ts +6 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +48 -0
- package/dist/url.js.map +1 -0
- package/package.json +89 -0
package/dist/types.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
export const FIELD_NAME_PREFIX = 'FIELD_';
|
|
2
|
+
export const ENV_VAR_PREFIX = 'EDS_';
|
|
3
|
+
export function isJsonObject(value) {
|
|
4
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
export function isStringArray(value) {
|
|
7
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
8
|
+
}
|
|
9
|
+
export function addEnvVarConstants(target, fieldNames = inferFieldNames(target)) {
|
|
10
|
+
for (const fieldName of fieldNames) {
|
|
11
|
+
const envVarName = `${ENV_VAR_PREFIX}${fieldName.toUpperCase()}`;
|
|
12
|
+
if (envVarName in target) {
|
|
13
|
+
throw new Error(`Field '${envVarName}' already exists in the model object`);
|
|
14
|
+
}
|
|
15
|
+
;
|
|
16
|
+
target[envVarName] = fieldName;
|
|
17
|
+
}
|
|
18
|
+
return target;
|
|
19
|
+
}
|
|
20
|
+
export function addFieldnameConstants(target, fieldNames = inferFieldNames(target)) {
|
|
21
|
+
for (const fieldName of fieldNames) {
|
|
22
|
+
;
|
|
23
|
+
target[`${FIELD_NAME_PREFIX}${fieldName.toUpperCase()}`] = fieldName;
|
|
24
|
+
}
|
|
25
|
+
return target;
|
|
26
|
+
}
|
|
27
|
+
export function setFieldFromString(target, fieldName, value, fieldType = inferFieldType(target[fieldName])) {
|
|
28
|
+
if (!(fieldName in target)) {
|
|
29
|
+
throw new Error(`Field '${fieldName}' not found in the model object`);
|
|
30
|
+
}
|
|
31
|
+
switch (fieldType) {
|
|
32
|
+
case 'boolean':
|
|
33
|
+
target[fieldName] = ['true', '1', 'yes'].includes(value.toLowerCase());
|
|
34
|
+
break;
|
|
35
|
+
case 'number': {
|
|
36
|
+
const parsed = Number(value);
|
|
37
|
+
if (Number.isNaN(parsed)) {
|
|
38
|
+
throw new Error(`Cannot convert value '${value}' to type number`);
|
|
39
|
+
}
|
|
40
|
+
target[fieldName] = parsed;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'null':
|
|
44
|
+
target[fieldName] = ['none', 'null', ''].includes(value.toLowerCase()) ? null : value;
|
|
45
|
+
break;
|
|
46
|
+
case 'string':
|
|
47
|
+
target[fieldName] = value;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function isSubclassSafe(value, base) {
|
|
52
|
+
try {
|
|
53
|
+
return (typeof value === 'function' &&
|
|
54
|
+
typeof base === 'function' &&
|
|
55
|
+
value !== base &&
|
|
56
|
+
value.prototype instanceof base);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function assignProperties(source, destination, override = false) {
|
|
63
|
+
const sourceClassVars = new Set(readStringArray(source.__class_vars__));
|
|
64
|
+
const destinationClassVars = new Set(readStringArray(destination.__class_vars__));
|
|
65
|
+
for (const [name, value] of Object.entries(source)) {
|
|
66
|
+
if (sourceClassVars.has(name) ||
|
|
67
|
+
destinationClassVars.has(name) ||
|
|
68
|
+
name.startsWith(FIELD_NAME_PREFIX) ||
|
|
69
|
+
name.startsWith('_') ||
|
|
70
|
+
typeof value === 'function') {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!(name in destination)) {
|
|
74
|
+
if (!MODEL_INTERNAL_FIELDS.has(name)) {
|
|
75
|
+
destination[name] = structuredCloneIfPossible(value);
|
|
76
|
+
}
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const destinationValue = destination[name];
|
|
80
|
+
if (isEmptyAssignableValue(destinationValue)) {
|
|
81
|
+
destination[name] = structuredCloneIfPossible(value);
|
|
82
|
+
}
|
|
83
|
+
else if (override && typeof value === typeof destinationValue) {
|
|
84
|
+
destination[name] = structuredCloneIfPossible(value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const MODEL_INTERNAL_FIELDS = new Set([
|
|
89
|
+
'model_computed_fields',
|
|
90
|
+
'model_config',
|
|
91
|
+
'model_extra',
|
|
92
|
+
'model_fields',
|
|
93
|
+
'model_fields_set',
|
|
94
|
+
]);
|
|
95
|
+
function inferFieldNames(target) {
|
|
96
|
+
if (isJsonObject(target.modelFields)) {
|
|
97
|
+
return Object.keys(target.modelFields);
|
|
98
|
+
}
|
|
99
|
+
if (isJsonObject(target.model_fields)) {
|
|
100
|
+
return Object.keys(target.model_fields);
|
|
101
|
+
}
|
|
102
|
+
return Object.keys(target).filter((key) => !key.startsWith('_') && typeof target[key] !== 'function');
|
|
103
|
+
}
|
|
104
|
+
function inferFieldType(value) {
|
|
105
|
+
if (typeof value === 'number')
|
|
106
|
+
return 'number';
|
|
107
|
+
if (typeof value === 'boolean')
|
|
108
|
+
return 'boolean';
|
|
109
|
+
if (value === null || value === undefined)
|
|
110
|
+
return 'null';
|
|
111
|
+
return 'string';
|
|
112
|
+
}
|
|
113
|
+
function readStringArray(value) {
|
|
114
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
115
|
+
}
|
|
116
|
+
function isEmptyAssignableValue(value) {
|
|
117
|
+
return (value === null ||
|
|
118
|
+
value === '' ||
|
|
119
|
+
(Array.isArray(value) && value.length === 0) ||
|
|
120
|
+
(isJsonObject(value) && Object.keys(value).length === 0));
|
|
121
|
+
}
|
|
122
|
+
function structuredCloneIfPossible(value) {
|
|
123
|
+
if (typeof structuredClone === 'function') {
|
|
124
|
+
return structuredClone(value);
|
|
125
|
+
}
|
|
126
|
+
return JSON.parse(JSON.stringify(value));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/url.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function normalizeUrl(value: string): string;
|
|
2
|
+
export declare function getHostnameFromUrl(value: string): string;
|
|
3
|
+
export declare function getDomainFromUrl(value: string): string;
|
|
4
|
+
export declare function getFirstLevelDomainFromUrl(value: string): string;
|
|
5
|
+
export declare function normalizeGitRepoUrl(value: string): string;
|
|
6
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAIA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWzD"}
|
package/dist/url.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const COMMON_COUNTRY_CODE_SECOND_LEVEL_DOMAINS = new Set([
|
|
2
|
+
'ac', 'co', 'com', 'edu', 'gov', 'net', 'org',
|
|
3
|
+
]);
|
|
4
|
+
export function normalizeUrl(value) {
|
|
5
|
+
const url = parseUrl(value);
|
|
6
|
+
url.search = '';
|
|
7
|
+
url.hash = '';
|
|
8
|
+
return url.toString();
|
|
9
|
+
}
|
|
10
|
+
export function getHostnameFromUrl(value) {
|
|
11
|
+
return parseUrl(value).hostname.toLowerCase();
|
|
12
|
+
}
|
|
13
|
+
export function getDomainFromUrl(value) {
|
|
14
|
+
const labels = getHostnameFromUrl(value).replace(/^www\./, '').split('.').filter(Boolean);
|
|
15
|
+
if (labels.length <= 2) {
|
|
16
|
+
return labels.join('.');
|
|
17
|
+
}
|
|
18
|
+
const suffixLength = isCommonCountryCodeSuffix(labels) ? 3 : 2;
|
|
19
|
+
return labels.slice(-suffixLength).join('.');
|
|
20
|
+
}
|
|
21
|
+
export function getFirstLevelDomainFromUrl(value) {
|
|
22
|
+
return getDomainFromUrl(value).split('.')[0] ?? '';
|
|
23
|
+
}
|
|
24
|
+
export function normalizeGitRepoUrl(value) {
|
|
25
|
+
const scpMatch = /^(?:[^@]+@)?([^:]+):(.+)$/.exec(value.trim());
|
|
26
|
+
const candidate = scpMatch
|
|
27
|
+
? `https://${scpMatch[1]}/${scpMatch[2]}`
|
|
28
|
+
: value.replace(/^git\+/, '').replace(/^git:\/\//, 'https://');
|
|
29
|
+
const url = parseUrl(candidate);
|
|
30
|
+
const pathParts = url.pathname.replace(/\.git$/, '').split('/').filter(Boolean);
|
|
31
|
+
if (pathParts.length < 2) {
|
|
32
|
+
throw new TypeError(`Expected a repository owner and name in URL: ${value}`);
|
|
33
|
+
}
|
|
34
|
+
return `https://${url.hostname.replace(/^www\./, '')}/${pathParts[0]}/${pathParts[1]}`;
|
|
35
|
+
}
|
|
36
|
+
function parseUrl(value) {
|
|
37
|
+
const normalized = value.trim();
|
|
38
|
+
if (!normalized) {
|
|
39
|
+
throw new TypeError('URL must not be empty');
|
|
40
|
+
}
|
|
41
|
+
return new URL(normalized.includes('://') ? normalized : `https://${normalized}`);
|
|
42
|
+
}
|
|
43
|
+
function isCommonCountryCodeSuffix(labels) {
|
|
44
|
+
const tld = labels.at(-1) ?? '';
|
|
45
|
+
const secondLevel = labels.at(-2) ?? '';
|
|
46
|
+
return tld.length === 2 && COMMON_COUNTRY_CODE_SECOND_LEVEL_DOMAINS.has(secondLevel);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@leettools/common",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Dependency-light TypeScript utilities and data primitives shared by LeetTools packages.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./config": {
|
|
14
|
+
"types": "./dist/config.d.ts",
|
|
15
|
+
"import": "./dist/config.js"
|
|
16
|
+
},
|
|
17
|
+
"./content": {
|
|
18
|
+
"types": "./dist/content.d.ts",
|
|
19
|
+
"import": "./dist/content.js"
|
|
20
|
+
},
|
|
21
|
+
"./csv": {
|
|
22
|
+
"types": "./dist/csv.d.ts",
|
|
23
|
+
"import": "./dist/csv.js"
|
|
24
|
+
},
|
|
25
|
+
"./deprecatied": {
|
|
26
|
+
"types": "./dist/deprecatied.d.ts",
|
|
27
|
+
"import": "./dist/deprecatied.js"
|
|
28
|
+
},
|
|
29
|
+
"./errors": {
|
|
30
|
+
"types": "./dist/errors.d.ts",
|
|
31
|
+
"import": "./dist/errors.js"
|
|
32
|
+
},
|
|
33
|
+
"./json": {
|
|
34
|
+
"types": "./dist/json.d.ts",
|
|
35
|
+
"import": "./dist/json.js"
|
|
36
|
+
},
|
|
37
|
+
"./node/dotenv_utils": {
|
|
38
|
+
"types": "./dist/node/dotenv_utils.d.ts",
|
|
39
|
+
"import": "./dist/node/dotenv_utils.js"
|
|
40
|
+
},
|
|
41
|
+
"./node/file_utils": {
|
|
42
|
+
"types": "./dist/node/file_utils.d.ts",
|
|
43
|
+
"import": "./dist/node/file_utils.js"
|
|
44
|
+
},
|
|
45
|
+
"./node/module_utils": {
|
|
46
|
+
"types": "./dist/node/module_utils.d.ts",
|
|
47
|
+
"import": "./dist/node/module_utils.js"
|
|
48
|
+
},
|
|
49
|
+
"./language": {
|
|
50
|
+
"types": "./dist/language.d.ts",
|
|
51
|
+
"import": "./dist/language.js"
|
|
52
|
+
},
|
|
53
|
+
"./registry": {
|
|
54
|
+
"types": "./dist/registry.d.ts",
|
|
55
|
+
"import": "./dist/registry.js"
|
|
56
|
+
},
|
|
57
|
+
"./template": {
|
|
58
|
+
"types": "./dist/template.d.ts",
|
|
59
|
+
"import": "./dist/template.js"
|
|
60
|
+
},
|
|
61
|
+
"./time": {
|
|
62
|
+
"types": "./dist/time.d.ts",
|
|
63
|
+
"import": "./dist/time.js"
|
|
64
|
+
},
|
|
65
|
+
"./tokenizer": {
|
|
66
|
+
"types": "./dist/tokenizer.d.ts",
|
|
67
|
+
"import": "./dist/tokenizer.js"
|
|
68
|
+
},
|
|
69
|
+
"./types": {
|
|
70
|
+
"types": "./dist/types.d.ts",
|
|
71
|
+
"import": "./dist/types.js"
|
|
72
|
+
},
|
|
73
|
+
"./url": {
|
|
74
|
+
"types": "./dist/url.d.ts",
|
|
75
|
+
"import": "./dist/url.js"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"files": [
|
|
79
|
+
"dist"
|
|
80
|
+
],
|
|
81
|
+
"publishConfig": {
|
|
82
|
+
"access": "public"
|
|
83
|
+
},
|
|
84
|
+
"scripts": {
|
|
85
|
+
"build": "tsc -p tsconfig.json",
|
|
86
|
+
"clean": "rm -rf dist",
|
|
87
|
+
"test": "pnpm build && node --test test/*.test.mjs"
|
|
88
|
+
}
|
|
89
|
+
}
|