@shivaedev/sql 0.46.3 → 0.46.4
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/CHANGELOG.md +6 -0
- package/dist/databaseAddress.d.ts.map +1 -1
- package/dist/databaseAddress.js +34 -18
- package/dist/databaseAddress.js.map +1 -1
- package/package.json +8 -8
- package/src/databaseAddress.ts +36 -18
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"databaseAddress.d.ts","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"databaseAddress.d.ts","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAgBlC,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,CAyBrG"}
|
package/dist/databaseAddress.js
CHANGED
|
@@ -1,25 +1,41 @@
|
|
|
1
1
|
import { Redacted } from "effect";
|
|
2
|
+
function isDecodableHost(hostname) {
|
|
3
|
+
const runs = hostname.match(/(?:%[\da-f]{2})+/giu) ?? [];
|
|
4
|
+
if (hostname.replace(/(?:%[\da-f]{2})+/giu, "").includes("%")) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const encoder = new TextEncoder();
|
|
8
|
+
const decoder = new TextDecoder();
|
|
9
|
+
return runs.every((run) => {
|
|
10
|
+
const bytes = Uint8Array.from(run.match(/[\da-f]{2}/giu) ?? [], (byte) => Number.parseInt(byte, 16));
|
|
11
|
+
const decoded = encoder.encode(decoder.decode(bytes));
|
|
12
|
+
return decoded.length === bytes.length && decoded.every((byte, index) => byte === bytes[index]);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
2
15
|
export function databaseAddress(value) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return {};
|
|
15
|
-
}
|
|
16
|
-
return {
|
|
17
|
-
...(host === "" && !url.searchParams.has("host") ? {} : { host }),
|
|
18
|
-
...(port === undefined ? {} : { port }),
|
|
19
|
-
};
|
|
16
|
+
const address = Redacted.value(value);
|
|
17
|
+
if (!URL.canParse(address)) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
const url = new URL(address);
|
|
21
|
+
if (url.protocol !== "postgres:" && url.protocol !== "postgresql:") {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
const rawHostname = url.hostname.startsWith("[") ? url.hostname.slice(1, -1) : url.hostname;
|
|
25
|
+
if (!isDecodableHost(rawHostname)) {
|
|
26
|
+
return {};
|
|
20
27
|
}
|
|
21
|
-
|
|
28
|
+
const hostname = decodeURIComponent(rawHostname);
|
|
29
|
+
// PgConnection applies query parameters in order, after the authority.
|
|
30
|
+
const host = url.searchParams.getAll("host").at(-1) ?? hostname;
|
|
31
|
+
const rawPort = url.searchParams.getAll("port").at(-1) ?? url.port;
|
|
32
|
+
const port = rawPort === "" ? undefined : Number(rawPort);
|
|
33
|
+
if (host.includes(",") || (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65_535))) {
|
|
22
34
|
return {};
|
|
23
35
|
}
|
|
36
|
+
return {
|
|
37
|
+
...(host === "" && !url.searchParams.has("host") ? {} : { host }),
|
|
38
|
+
...(port === undefined ? {} : { port }),
|
|
39
|
+
};
|
|
24
40
|
}
|
|
25
41
|
//# sourceMappingURL=databaseAddress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"databaseAddress.js","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,
|
|
1
|
+
{"version":3,"file":"databaseAddress.js","sourceRoot":"","sources":["../src/databaseAddress.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/sql",
|
|
3
|
-
"version": "0.46.
|
|
3
|
+
"version": "0.46.4",
|
|
4
4
|
"description": "Schema-derived repositories over native Effect SQL",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect"
|
|
@@ -44,18 +44,18 @@
|
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@shivaedev/changes": "0.11.1",
|
|
47
|
-
"@shivaedev/service": "0.
|
|
47
|
+
"@shivaedev/service": "0.9.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@effect/platform-node": "4.1.1",
|
|
51
51
|
"@effect/sql-pg": "4.1.1",
|
|
52
52
|
"@effect/sql-sqlite-node": "4.1.1",
|
|
53
|
-
"@shivaedev/contract": "0.43.
|
|
54
|
-
"@shivaedev/jobs": "0.
|
|
55
|
-
"@shivaedev/quality": "0.
|
|
56
|
-
"@shivaedev/test-kits": "0.10.
|
|
57
|
-
"@shivaedev/test-sql": "0.24.
|
|
58
|
-
"@shivaedev/test-story": "0.45.
|
|
53
|
+
"@shivaedev/contract": "0.43.4",
|
|
54
|
+
"@shivaedev/jobs": "0.42.0",
|
|
55
|
+
"@shivaedev/quality": "0.74.3",
|
|
56
|
+
"@shivaedev/test-kits": "0.10.7",
|
|
57
|
+
"@shivaedev/test-sql": "0.24.8",
|
|
58
|
+
"@shivaedev/test-story": "0.45.6",
|
|
59
59
|
"@types/node": "24.19.2",
|
|
60
60
|
"effect": "4.1.1",
|
|
61
61
|
"typescript": "7.0.2",
|
package/src/databaseAddress.ts
CHANGED
|
@@ -1,25 +1,43 @@
|
|
|
1
1
|
import type { PgPoolConfig } from "@effect/sql-pg/PgClient";
|
|
2
2
|
import { Redacted } from "effect";
|
|
3
3
|
|
|
4
|
+
function isDecodableHost(hostname: string): boolean {
|
|
5
|
+
const runs = hostname.match(/(?:%[\da-f]{2})+/giu) ?? [];
|
|
6
|
+
if (hostname.replace(/(?:%[\da-f]{2})+/giu, "").includes("%")) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const encoder = new TextEncoder();
|
|
10
|
+
const decoder = new TextDecoder();
|
|
11
|
+
return runs.every((run) => {
|
|
12
|
+
const bytes = Uint8Array.from(run.match(/[\da-f]{2}/giu) ?? [], (byte) => Number.parseInt(byte, 16));
|
|
13
|
+
const decoded = encoder.encode(decoder.decode(bytes));
|
|
14
|
+
return decoded.length === bytes.length && decoded.every((byte, index) => byte === bytes[index]);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
4
18
|
export function databaseAddress(value: Redacted.Redacted<string>): Pick<PgPoolConfig, "host" | "port"> {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
const address = Redacted.value(value);
|
|
20
|
+
if (!URL.canParse(address)) {
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
const url = new URL(address);
|
|
24
|
+
if (url.protocol !== "postgres:" && url.protocol !== "postgresql:") {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const rawHostname = url.hostname.startsWith("[") ? url.hostname.slice(1, -1) : url.hostname;
|
|
28
|
+
if (!isDecodableHost(rawHostname)) {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
const hostname = decodeURIComponent(rawHostname);
|
|
32
|
+
// PgConnection applies query parameters in order, after the authority.
|
|
33
|
+
const host = url.searchParams.getAll("host").at(-1) ?? hostname;
|
|
34
|
+
const rawPort = url.searchParams.getAll("port").at(-1) ?? url.port;
|
|
35
|
+
const port = rawPort === "" ? undefined : Number(rawPort);
|
|
36
|
+
if (host.includes(",") || (port !== undefined && (!Number.isInteger(port) || port < 1 || port > 65_535))) {
|
|
23
37
|
return {};
|
|
24
38
|
}
|
|
39
|
+
return {
|
|
40
|
+
...(host === "" && !url.searchParams.has("host") ? {} : { host }),
|
|
41
|
+
...(port === undefined ? {} : { port }),
|
|
42
|
+
};
|
|
25
43
|
}
|