@hanlec/sdk 0.1.1
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/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +52 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +50 -0
- package/dist/cli.js.map +1 -0
- package/dist/files.d.ts +71 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +88 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -0
- package/dist/sql.d.ts +9 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +29 -0
- package/dist/sql.js.map +1 -0
- package/dist/vite.d.ts +3 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +72 -0
- package/dist/vite.js.map +1 -0
- package/dist/xjson.d.ts +29 -0
- package/dist/xjson.d.ts.map +1 -0
- package/dist/xjson.js +90 -0
- package/dist/xjson.js.map +1 -0
- package/package.json +33 -0
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":""}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as XJSON from "./xjson.js";
|
|
2
|
+
const BASE_URL = process.env.HANLEC_BASE_URL ?? "https://hanlec.com";
|
|
3
|
+
const ACCESS_TOKEN = process.env.HANLEC_ACCESS_TOKEN;
|
|
4
|
+
if (!ACCESS_TOKEN) {
|
|
5
|
+
throw new Error("Define HANLEC_ACCESS_TOKEN.");
|
|
6
|
+
}
|
|
7
|
+
/** @internal */
|
|
8
|
+
export async function request(path, opts) {
|
|
9
|
+
const headers = new Headers(opts?.headers);
|
|
10
|
+
headers.set("authorization", `Bearer ${ACCESS_TOKEN}`);
|
|
11
|
+
const { body, contentType } = prepareBody(opts?.body);
|
|
12
|
+
if (contentType && !headers.has("content-type")) {
|
|
13
|
+
headers.set("content-type", contentType);
|
|
14
|
+
}
|
|
15
|
+
let url = `${BASE_URL}/sdki${path}`;
|
|
16
|
+
if (opts?.params) {
|
|
17
|
+
const entries = Object.entries(opts.params).filter((e) => e[1] !== undefined);
|
|
18
|
+
if (entries.length)
|
|
19
|
+
url += `?${new URLSearchParams(entries)}`;
|
|
20
|
+
}
|
|
21
|
+
const res = await fetch(url, {
|
|
22
|
+
method: opts?.method ?? "GET",
|
|
23
|
+
headers,
|
|
24
|
+
body,
|
|
25
|
+
});
|
|
26
|
+
if (!res.ok) {
|
|
27
|
+
const body = (await res.json().catch(() => null));
|
|
28
|
+
throw new Error(body?.error ?? `Request failed (${res.status})`);
|
|
29
|
+
}
|
|
30
|
+
return res;
|
|
31
|
+
}
|
|
32
|
+
function prepareBody(body) {
|
|
33
|
+
if (body == null)
|
|
34
|
+
return { body, contentType: null };
|
|
35
|
+
if (typeof body === "string") {
|
|
36
|
+
return { body, contentType: "text/plain" };
|
|
37
|
+
}
|
|
38
|
+
if (body instanceof Blob) {
|
|
39
|
+
return { body, contentType: body.type ?? "application/octet-stream" };
|
|
40
|
+
}
|
|
41
|
+
if (body instanceof URLSearchParams) {
|
|
42
|
+
return { body, contentType: "application/x-www-form-urlencoded" };
|
|
43
|
+
}
|
|
44
|
+
if (body instanceof ReadableStream) {
|
|
45
|
+
return { body, contentType: "application/octet-stream" };
|
|
46
|
+
}
|
|
47
|
+
if (body instanceof ArrayBuffer || ArrayBuffer.isView(body)) {
|
|
48
|
+
return { body, contentType: "application/octet-stream" };
|
|
49
|
+
}
|
|
50
|
+
return { body: XJSON.stringify(body), contentType: "application/json" };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cac } from "cac";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { sql, sqlRaw } from "./sql.js";
|
|
6
|
+
const MIGRATIONS_DIR = path.resolve("migrations");
|
|
7
|
+
function getMigrationFiles() {
|
|
8
|
+
if (!fs.existsSync(MIGRATIONS_DIR))
|
|
9
|
+
return [];
|
|
10
|
+
return fs
|
|
11
|
+
.readdirSync(MIGRATIONS_DIR)
|
|
12
|
+
.filter((f) => f.endsWith(".sql"))
|
|
13
|
+
.sort();
|
|
14
|
+
}
|
|
15
|
+
const cli = cac("hanlec");
|
|
16
|
+
cli
|
|
17
|
+
.command("migration:new <name>", "Create a new migration file")
|
|
18
|
+
.action((name) => {
|
|
19
|
+
fs.mkdirSync(MIGRATIONS_DIR, { recursive: true });
|
|
20
|
+
const timestamp = Date.now();
|
|
21
|
+
const slug = name.replace(/[^a-zA-Z0-9]+/g, "_").replace(/(^_|_$)/g, "");
|
|
22
|
+
const filename = `${timestamp}_${slug}.sql`;
|
|
23
|
+
const filepath = path.join(MIGRATIONS_DIR, filename);
|
|
24
|
+
fs.writeFileSync(filepath, "", "utf-8");
|
|
25
|
+
console.log(`Created ${filepath}`);
|
|
26
|
+
});
|
|
27
|
+
cli.command("migrate", "Run pending migrations").action(async () => {
|
|
28
|
+
await sql `
|
|
29
|
+
CREATE TABLE IF NOT EXISTS hanlec_migrations (
|
|
30
|
+
name TEXT PRIMARY KEY,
|
|
31
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
32
|
+
)
|
|
33
|
+
`;
|
|
34
|
+
const applied = new Set((await sql `SELECT name FROM hanlec_migrations`).map((r) => r.name));
|
|
35
|
+
const pending = getMigrationFiles().filter((f) => !applied.has(f));
|
|
36
|
+
if (pending.length === 0) {
|
|
37
|
+
console.log("No pending migrations.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
for (const file of pending) {
|
|
41
|
+
const content = fs.readFileSync(path.join(MIGRATIONS_DIR, file), "utf-8");
|
|
42
|
+
console.log(`Applying ${file}...`);
|
|
43
|
+
await sqlRaw(content);
|
|
44
|
+
await sql `INSERT INTO hanlec_migrations (name) VALUES (${file})`;
|
|
45
|
+
}
|
|
46
|
+
console.log(`Applied ${pending.length} migration(s).`);
|
|
47
|
+
});
|
|
48
|
+
cli.help();
|
|
49
|
+
cli.parse();
|
|
50
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAElD,SAAS,iBAAiB;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9C,OAAO,EAAE;SACN,WAAW,CAAC,cAAc,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;AAE1B,GAAG;KACA,OAAO,CAAC,sBAAsB,EAAE,6BAA6B,CAAC;KAC9D,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;IACvB,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,IAAI,MAAM,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACrD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEL,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjE,MAAM,GAAG,CAAA;;;;;GAKR,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,CAAC,MAAM,GAAG,CAAkB,oCAAoC,CAAC,CAAC,GAAG,CACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CACd,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,GAAG,CAAA,gDAAgD,IAAI,GAAG,CAAC;IACnE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,EAAE,CAAC;AACX,GAAG,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface ListOptions {
|
|
2
|
+
prefix?: string;
|
|
3
|
+
limit?: number;
|
|
4
|
+
cursor?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ListResult {
|
|
7
|
+
keys: {
|
|
8
|
+
key: string;
|
|
9
|
+
size: number;
|
|
10
|
+
}[];
|
|
11
|
+
cursor?: string;
|
|
12
|
+
truncated: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* List objects in storage.
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const result = await files.list({ prefix: "uploads/" });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function list(options?: ListOptions): Promise<ListResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a files exists and get its metadata. Returns `null` if not found.
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* const meta = await files.head("avatar.png");
|
|
27
|
+
* if (meta) console.log(meta.size);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function head(key: string): Promise<{
|
|
31
|
+
size: number;
|
|
32
|
+
etag: string;
|
|
33
|
+
uploaded: string;
|
|
34
|
+
} | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Get an file from storage. Returns `null` if not found.
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* const data = await files.get("avatar.png");
|
|
40
|
+
* if (data) console.log(await data.text());
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function get(key: string): Promise<Response | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Upload a file to storage.
|
|
46
|
+
*
|
|
47
|
+
* ```ts
|
|
48
|
+
* await files.put("avatar.png", file);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function put(key: string, value: string | Blob): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete one or more files from storage.
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* await files.del("avatar.png");
|
|
57
|
+
* await files.del(["a.png", "b.png"]);
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function del(key: string | string[]): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Generate a short-lived public URL for a stored files. Safe to pass to the
|
|
63
|
+
* browser (e.g. as an `<img src>`).
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* const url = await files.publicUrl("avatar.png");
|
|
67
|
+
* // => "https://hanlec.com/sdki/dl?t=..."
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function publicUrl(key: string): Promise<string>;
|
|
71
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAUrE;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAIlE;AAED;;;;;;;GAOG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAI/D;AAED;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED;;;;;;;GAOG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/D;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI5D"}
|
package/dist/files.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { request } from "./api.js";
|
|
2
|
+
/**
|
|
3
|
+
* List objects in storage.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const result = await files.list({ prefix: "uploads/" });
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
export async function list(options) {
|
|
10
|
+
const res = await request("/files", {
|
|
11
|
+
method: "GET",
|
|
12
|
+
params: {
|
|
13
|
+
prefix: options?.prefix,
|
|
14
|
+
limit: options?.limit?.toString(),
|
|
15
|
+
cursor: options?.cursor,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
return res.json();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if a files exists and get its metadata. Returns `null` if not found.
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const meta = await files.head("avatar.png");
|
|
25
|
+
* if (meta) console.log(meta.size);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export async function head(key) {
|
|
29
|
+
const res = await request(`/files/${key}`, { method: "HEAD" });
|
|
30
|
+
if (res.status === 204)
|
|
31
|
+
return null;
|
|
32
|
+
return res.json();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get an file from storage. Returns `null` if not found.
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* const data = await files.get("avatar.png");
|
|
39
|
+
* if (data) console.log(await data.text());
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export async function get(key) {
|
|
43
|
+
const res = await request(`/files/${key}`, { method: "GET" });
|
|
44
|
+
if (res.status === 204)
|
|
45
|
+
return null;
|
|
46
|
+
return res;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Upload a file to storage.
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* await files.put("avatar.png", file);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export async function put(key, value) {
|
|
56
|
+
await request(`/files/${key}`, { method: "PUT", body: value });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Delete one or more files from storage.
|
|
60
|
+
*
|
|
61
|
+
* ```ts
|
|
62
|
+
* await files.del("avatar.png");
|
|
63
|
+
* await files.del(["a.png", "b.png"]);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export async function del(key) {
|
|
67
|
+
if (Array.isArray(key)) {
|
|
68
|
+
await Promise.all(key.map((k) => request(`/files/${k}`, { method: "DELETE" })));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
await request(`/files/${key}`, { method: "DELETE" });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate a short-lived public URL for a stored files. Safe to pass to the
|
|
76
|
+
* browser (e.g. as an `<img src>`).
|
|
77
|
+
*
|
|
78
|
+
* ```ts
|
|
79
|
+
* const url = await files.publicUrl("avatar.png");
|
|
80
|
+
* // => "https://hanlec.com/sdki/dl?t=..."
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export async function publicUrl(key) {
|
|
84
|
+
const res = await request(`/files/${key}`, { method: "POST" });
|
|
85
|
+
const data = (await res.json());
|
|
86
|
+
return data.url;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAcnC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAqB;IAC9C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,KAAK;QACb,MAAM,EAAE;YACN,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;YACjC,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,EAAyB,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,GAAW;IAEX,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAW,EAAE,KAAoB;IACzD,MAAM,OAAO,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAsB;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,GAAG,CACf,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoB,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";mBAYuB,OAAO;;AAD9B,wBAIE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createRequestHandler } from "react-router";
|
|
2
|
+
// @ts-expect-error
|
|
3
|
+
import * as build from "virtual:react-router/server-build";
|
|
4
|
+
const handler = createRequestHandler({
|
|
5
|
+
...build,
|
|
6
|
+
// TODO(vitor): CSRF. Em prod talvez seja possível fazer com isto venha do
|
|
7
|
+
// ambiente? v8_viteEnvironmentApi na Cloudflare?
|
|
8
|
+
allowedActionOrigins: ["**"],
|
|
9
|
+
});
|
|
10
|
+
export default {
|
|
11
|
+
async fetch(request) {
|
|
12
|
+
return handler(request);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,mBAAmB;AACnB,OAAO,KAAK,KAAK,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,GAAG,oBAAoB,CAAC;IACnC,GAAG,KAAK;IACR,0EAA0E;IAC1E,iDAAiD;IACjD,oBAAoB,EAAE,CAAC,IAAI,CAAC;CAC7B,CAAC,CAAC;AAEH,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC"}
|
package/dist/sql.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tagged template literal for SQL queries.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* const users = await sql`SELECT * FROM users WHERE id = ${id}`;
|
|
6
|
+
* ```
|
|
7
|
+
*/
|
|
8
|
+
export declare function sql<T = Record<string, unknown>>(strings: TemplateStringsArray, ...values: unknown[]): Promise<T[]>;
|
|
9
|
+
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,CAAC,EAAE,CAAC,CAad"}
|
package/dist/sql.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { request } from "./api.js";
|
|
2
|
+
import * as XJSON from "./xjson.js";
|
|
3
|
+
/**
|
|
4
|
+
* Tagged template literal for SQL queries.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const users = await sql`SELECT * FROM users WHERE id = ${id}`;
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export async function sql(strings, ...values) {
|
|
11
|
+
let query = strings[0];
|
|
12
|
+
for (let i = 0; i < values.length; i++) {
|
|
13
|
+
query += `$${i + 1}` + strings[i + 1];
|
|
14
|
+
}
|
|
15
|
+
const res = await request("/sql", {
|
|
16
|
+
method: "POST",
|
|
17
|
+
body: { query, params: values },
|
|
18
|
+
});
|
|
19
|
+
const body = XJSON.parse(await res.text());
|
|
20
|
+
return body.rows;
|
|
21
|
+
}
|
|
22
|
+
/** @internal */
|
|
23
|
+
export async function sqlRaw(query) {
|
|
24
|
+
await request("/sql", {
|
|
25
|
+
method: "POST",
|
|
26
|
+
body: { query, params: [] },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sql.js.map
|
package/dist/sql.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../src/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AAMpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,OAA6B,EAC7B,GAAG,MAAiB;IAEpB,IAAI,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;KAChC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa;IACxC,MAAM,OAAO,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;KAC5B,CAAC,CAAC;AACL,CAAC"}
|
package/dist/vite.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,wBAAgB,MAAM,IAAI,MAAM,EAAE,CAiEjC"}
|
package/dist/vite.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createRequest, sendResponse } from "@remix-run/node-fetch-server";
|
|
2
|
+
import { consoleForwardPlugin } from "vite-console-forward-plugin";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const IS_SANDBOX = !!process.env.HANLEC_IS_SANDBOX;
|
|
5
|
+
const SERVER = path.join(import.meta.dirname, "server.js");
|
|
6
|
+
export function hanlec() {
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
name: "hanlec:server",
|
|
10
|
+
config(_config, env) {
|
|
11
|
+
return {
|
|
12
|
+
ssr: {
|
|
13
|
+
noExternal: env.command === "build" ? true : undefined,
|
|
14
|
+
},
|
|
15
|
+
environments: {
|
|
16
|
+
ssr: {
|
|
17
|
+
build: {
|
|
18
|
+
rollupOptions: {
|
|
19
|
+
input: SERVER,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
configureServer(server) {
|
|
27
|
+
return async () => {
|
|
28
|
+
const mod = await server.ssrLoadModule(SERVER);
|
|
29
|
+
server.middlewares.use(async (req, res, next) => {
|
|
30
|
+
try {
|
|
31
|
+
const request = createRequest(req, res);
|
|
32
|
+
const response = await mod.default.fetch(request);
|
|
33
|
+
await sendResponse(res, response);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
next(e);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
...(IS_SANDBOX
|
|
43
|
+
? [
|
|
44
|
+
{
|
|
45
|
+
name: "hanlec:sandbox",
|
|
46
|
+
config() {
|
|
47
|
+
return {
|
|
48
|
+
clearScreen: false,
|
|
49
|
+
server: {
|
|
50
|
+
host: "0.0.0.0",
|
|
51
|
+
port: 4000,
|
|
52
|
+
strictPort: true,
|
|
53
|
+
allowedHosts: true,
|
|
54
|
+
cors: true,
|
|
55
|
+
watch: {
|
|
56
|
+
usePolling: true,
|
|
57
|
+
interval: 100,
|
|
58
|
+
awaitWriteFinish: {
|
|
59
|
+
stabilityThreshold: 150,
|
|
60
|
+
pollInterval: 50,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
consoleForwardPlugin(),
|
|
68
|
+
]
|
|
69
|
+
: []),
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=vite.js.map
|
package/dist/vite.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACnD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAE3D,MAAM,UAAU,MAAM;IACpB,OAAO;QACL;YACE,IAAI,EAAE,eAAe;YACrB,MAAM,CAAC,OAAO,EAAE,GAAG;gBACjB,OAAO;oBACL,GAAG,EAAE;wBACH,UAAU,EAAE,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;qBACvD;oBACD,YAAY,EAAE;wBACZ,GAAG,EAAE;4BACH,KAAK,EAAE;gCACL,aAAa,EAAE;oCACb,KAAK,EAAE,MAAM;iCACd;6BACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,eAAe,CAAC,MAAM;gBACpB,OAAO,KAAK,IAAI,EAAE;oBAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAE/C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;wBAC9C,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;4BACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BAClD,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;wBACpC,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,IAAI,CAAC,CAAC,CAAC,CAAC;wBACV,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;YACJ,CAAC;SACF;QACD,GAAG,CAAC,UAAU;YACZ,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,gBAAgB;oBACtB,MAAM;wBACJ,OAAO;4BACL,WAAW,EAAE,KAAK;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,SAAS;gCACf,IAAI,EAAE,IAAI;gCACV,UAAU,EAAE,IAAI;gCAChB,YAAY,EAAE,IAAI;gCAClB,IAAI,EAAE,IAAI;gCACV,KAAK,EAAE;oCACL,UAAU,EAAE,IAAI;oCAChB,QAAQ,EAAE,GAAG;oCACb,gBAAgB,EAAE;wCAChB,kBAAkB,EAAE,GAAG;wCACvB,YAAY,EAAE,EAAE;qCACjB;iCACF;6BACF;yBACF,CAAC;oBACJ,CAAC;iBACe;gBAClB,oBAAoB,EAAE;aACvB;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC"}
|
package/dist/xjson.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file EXtended JSON. Uses replacer/reviver pair that preserves JS types
|
|
3
|
+
* across serialization.
|
|
4
|
+
*
|
|
5
|
+
* Inspired by React Flight's `$`-prefix tagging scheme. Tagged strings:
|
|
6
|
+
*
|
|
7
|
+
* $D<iso> Date
|
|
8
|
+
* $n<digits> BigInt
|
|
9
|
+
* $B<base64> Uint8Array / Buffer
|
|
10
|
+
* $Infinity Infinity
|
|
11
|
+
* $-Infinity -Infinity
|
|
12
|
+
* $NaN NaN
|
|
13
|
+
* $-0 -0
|
|
14
|
+
* $undefined undefined
|
|
15
|
+
* $$... escaped literal string that starts with $
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Converts a JavaScript value to an EXtended JavaScript Object Notation (XJSON)
|
|
19
|
+
* string.
|
|
20
|
+
*/
|
|
21
|
+
export declare function stringify(value: any, space?: string | number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Converts an EXtended JavaScript Object Notation (XJSON) string into an
|
|
24
|
+
* object.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parse(text: string): any;
|
|
27
|
+
export declare function replacer(this: Record<string, unknown>, _key: string, value: unknown): unknown;
|
|
28
|
+
export declare function reviver(_key: string, value: unknown): unknown;
|
|
29
|
+
//# sourceMappingURL=xjson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xjson.d.ts","sourceRoot":"","sources":["../src/xjson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAErE;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAEvC;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,OAAO,CAgCT;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAwB7D"}
|
package/dist/xjson.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file EXtended JSON. Uses replacer/reviver pair that preserves JS types
|
|
3
|
+
* across serialization.
|
|
4
|
+
*
|
|
5
|
+
* Inspired by React Flight's `$`-prefix tagging scheme. Tagged strings:
|
|
6
|
+
*
|
|
7
|
+
* $D<iso> Date
|
|
8
|
+
* $n<digits> BigInt
|
|
9
|
+
* $B<base64> Uint8Array / Buffer
|
|
10
|
+
* $Infinity Infinity
|
|
11
|
+
* $-Infinity -Infinity
|
|
12
|
+
* $NaN NaN
|
|
13
|
+
* $-0 -0
|
|
14
|
+
* $undefined undefined
|
|
15
|
+
* $$... escaped literal string that starts with $
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Converts a JavaScript value to an EXtended JavaScript Object Notation (XJSON)
|
|
19
|
+
* string.
|
|
20
|
+
*/
|
|
21
|
+
export function stringify(value, space) {
|
|
22
|
+
return JSON.stringify(value, replacer, space);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Converts an EXtended JavaScript Object Notation (XJSON) string into an
|
|
26
|
+
* object.
|
|
27
|
+
*/
|
|
28
|
+
export function parse(text) {
|
|
29
|
+
return JSON.parse(text, reviver);
|
|
30
|
+
}
|
|
31
|
+
export function replacer(_key, value) {
|
|
32
|
+
if (typeof value === "bigint") {
|
|
33
|
+
return `$n${value}`;
|
|
34
|
+
}
|
|
35
|
+
if (typeof value === "undefined") {
|
|
36
|
+
return "$undefined";
|
|
37
|
+
}
|
|
38
|
+
if (typeof value === "number") {
|
|
39
|
+
if (Number.isNaN(value))
|
|
40
|
+
return "$NaN";
|
|
41
|
+
if (value === Infinity)
|
|
42
|
+
return "$Infinity";
|
|
43
|
+
if (value === -Infinity)
|
|
44
|
+
return "$-Infinity";
|
|
45
|
+
if (Object.is(value, -0))
|
|
46
|
+
return "$-0";
|
|
47
|
+
}
|
|
48
|
+
// Date — `this[_key]` is the raw value before `.toJSON()` converts it
|
|
49
|
+
const raw = this[_key];
|
|
50
|
+
if (raw instanceof Date) {
|
|
51
|
+
return `$D${value}`;
|
|
52
|
+
}
|
|
53
|
+
if (raw instanceof Uint8Array) {
|
|
54
|
+
return `$B${Buffer.from(raw).toString("base64")}`;
|
|
55
|
+
}
|
|
56
|
+
// Escape strings that start with $ so the reviver doesn't mis-tag them
|
|
57
|
+
if (typeof value === "string" && value.startsWith("$")) {
|
|
58
|
+
return `$${value}`;
|
|
59
|
+
}
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
export function reviver(_key, value) {
|
|
63
|
+
if (typeof value !== "string" || !value.startsWith("$")) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
if (value === "$undefined")
|
|
67
|
+
return undefined;
|
|
68
|
+
if (value === "$NaN")
|
|
69
|
+
return NaN;
|
|
70
|
+
if (value === "$Infinity")
|
|
71
|
+
return Infinity;
|
|
72
|
+
if (value === "$-Infinity")
|
|
73
|
+
return -Infinity;
|
|
74
|
+
if (value === "$-0")
|
|
75
|
+
return -0;
|
|
76
|
+
const tag = value[1];
|
|
77
|
+
if (tag === "D")
|
|
78
|
+
return new Date(value.slice(2));
|
|
79
|
+
if (tag === "n")
|
|
80
|
+
return BigInt(value.slice(2));
|
|
81
|
+
if (tag === "B") {
|
|
82
|
+
const bytes = Buffer.from(value.slice(2), "base64");
|
|
83
|
+
return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
84
|
+
}
|
|
85
|
+
// $$... → unescape to $...
|
|
86
|
+
if (tag === "$")
|
|
87
|
+
return value.slice(1);
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=xjson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xjson.js","sourceRoot":"","sources":["../src/xjson.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hanlec/sdk",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"hanlec": "./dist/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./xjson": "./dist/xjson.js",
|
|
11
|
+
"./vite": "./dist/vite.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "rm -rf dist && tsc"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@remix-run/node-fetch-server": "^0.13.0",
|
|
21
|
+
"cac": "^6.7.14",
|
|
22
|
+
"vite-console-forward-plugin": "^2.0.1"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@react-router/dev": "^7.14.0",
|
|
26
|
+
"react-router": "7.x",
|
|
27
|
+
"vite": "7.x"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^24.12.0",
|
|
31
|
+
"typescript": "^5.9.3"
|
|
32
|
+
}
|
|
33
|
+
}
|