marwajs-dom 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 +21 -0
- package/README.md +311 -0
- package/dist/fx.d.ts +25 -0
- package/dist/fx.d.ts.map +1 -0
- package/dist/fx.js +196 -0
- package/dist/fx.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +435 -0
- package/dist/index.js.map +1 -0
- package/dist/net.d.ts +54 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +188 -0
- package/dist/net.js.map +1 -0
- package/dist/store.d.ts +13 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +94 -0
- package/dist/store.js.map +1 -0
- package/package.json +72 -0
package/dist/net.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// @marwajs/dom/net
|
|
2
|
+
// Minimal fetch client with single-word verbs, JSON helpers, timeout, and interceptors.
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// import { net } from "@marwajs/dom/net";
|
|
6
|
+
// const api = net("https://api.example.com", { headers: { Authorization: "Bearer X" } });
|
|
7
|
+
// const { data } = await api.get("/users", { q: "john" }).json();
|
|
8
|
+
// const r = await api.post("/items", { name: "A" }).json();
|
|
9
|
+
function qs(obj) {
|
|
10
|
+
if (!obj)
|
|
11
|
+
return "";
|
|
12
|
+
const p = Object.entries(obj)
|
|
13
|
+
.filter(([, v]) => v !== undefined && v !== null)
|
|
14
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
|
|
15
|
+
.join("&");
|
|
16
|
+
return p ? `?${p}` : "";
|
|
17
|
+
}
|
|
18
|
+
function isSafeUrl(url) {
|
|
19
|
+
try {
|
|
20
|
+
const u = new URL(url);
|
|
21
|
+
return u.protocol === "http:" || u.protocol === "https:";
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const SAFE_EXTRA_KEYS = [
|
|
28
|
+
"body",
|
|
29
|
+
"cache",
|
|
30
|
+
"credentials",
|
|
31
|
+
"keepalive",
|
|
32
|
+
"referrer",
|
|
33
|
+
"referrerPolicy",
|
|
34
|
+
"signal",
|
|
35
|
+
"window",
|
|
36
|
+
];
|
|
37
|
+
function safeExtra(extra) {
|
|
38
|
+
if (!extra)
|
|
39
|
+
return {};
|
|
40
|
+
const out = {};
|
|
41
|
+
for (const k of SAFE_EXTRA_KEYS) {
|
|
42
|
+
if (k in extra)
|
|
43
|
+
out[k] = extra[k];
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
function join(base, path) {
|
|
48
|
+
if (!base)
|
|
49
|
+
return path;
|
|
50
|
+
if (/^https?:\/\//i.test(path)) {
|
|
51
|
+
throw new Error("net: absolute path URLs are not allowed; use the base URL instead");
|
|
52
|
+
}
|
|
53
|
+
return base.replace(/\/+$/, "") + "/" + path.replace(/^\/+/, "");
|
|
54
|
+
}
|
|
55
|
+
class Reply {
|
|
56
|
+
constructor(res) {
|
|
57
|
+
this.res = res;
|
|
58
|
+
}
|
|
59
|
+
ok() {
|
|
60
|
+
if (!this.res.ok)
|
|
61
|
+
throw new Error(`${this.res.status} ${this.res.statusText}`);
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
async json() {
|
|
65
|
+
return { data: (await this.res.json()), res: this.res };
|
|
66
|
+
}
|
|
67
|
+
async text() {
|
|
68
|
+
return { data: await this.res.text(), res: this.res };
|
|
69
|
+
}
|
|
70
|
+
async blob() {
|
|
71
|
+
return { data: await this.res.blob(), res: this.res };
|
|
72
|
+
}
|
|
73
|
+
async bytes() {
|
|
74
|
+
return {
|
|
75
|
+
data: new Uint8Array(await this.res.arrayBuffer()),
|
|
76
|
+
res: this.res,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function net(base, init = {}) {
|
|
81
|
+
if (base && !isSafeUrl(base))
|
|
82
|
+
throw new Error("net: base must be a safe http(s) URL");
|
|
83
|
+
let _base = base ?? init.base ?? "";
|
|
84
|
+
if (_base && !isSafeUrl(_base))
|
|
85
|
+
throw new Error("net: base must be a safe http(s) URL");
|
|
86
|
+
let _headers = new Headers(init.headers ?? {});
|
|
87
|
+
let _query = init.query;
|
|
88
|
+
let _timeout = init.timeout ?? 15000;
|
|
89
|
+
const _pending = new Set();
|
|
90
|
+
const _use = [];
|
|
91
|
+
const _after = [];
|
|
92
|
+
const _trap = [];
|
|
93
|
+
function compose(path, method, body, extra, query) {
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const mergedQuery = { ..._query, ...query };
|
|
96
|
+
const url = join(_base, path) + qs(mergedQuery);
|
|
97
|
+
const isJSON = body != null &&
|
|
98
|
+
typeof body !== "string" &&
|
|
99
|
+
!(body instanceof FormData) &&
|
|
100
|
+
!(body instanceof Blob);
|
|
101
|
+
const headers = new Headers(_headers);
|
|
102
|
+
if (isJSON)
|
|
103
|
+
headers.set("Content-Type", "application/json");
|
|
104
|
+
const init = {
|
|
105
|
+
method,
|
|
106
|
+
headers,
|
|
107
|
+
body: body == null
|
|
108
|
+
? undefined
|
|
109
|
+
: isJSON
|
|
110
|
+
? JSON.stringify(body)
|
|
111
|
+
: body,
|
|
112
|
+
signal: controller.signal,
|
|
113
|
+
...safeExtra(extra),
|
|
114
|
+
};
|
|
115
|
+
return { url, init, controller };
|
|
116
|
+
}
|
|
117
|
+
async function run(req) {
|
|
118
|
+
for (const f of _use)
|
|
119
|
+
await f(req);
|
|
120
|
+
_pending.add(req.controller);
|
|
121
|
+
let timer;
|
|
122
|
+
if (_timeout > 0) {
|
|
123
|
+
timer = setTimeout(() => req.controller.abort(), _timeout);
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const res = await fetch(req.url, req.init);
|
|
127
|
+
for (const f of _after)
|
|
128
|
+
await f(res, req);
|
|
129
|
+
return new Reply(res);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
for (const f of _trap)
|
|
133
|
+
await f(err, req);
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
_pending.delete(req.controller);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const client = {
|
|
142
|
+
get: (path, query, extra) => run(compose(path, "GET", undefined, extra, query)),
|
|
143
|
+
head: (path, query, extra) => run(compose(path, "HEAD", undefined, extra, query)),
|
|
144
|
+
post: (path, body, extra) => run(compose(path, "POST", body, extra)),
|
|
145
|
+
put: (path, body, extra) => run(compose(path, "PUT", body, extra)),
|
|
146
|
+
patch: (path, body, extra) => run(compose(path, "PATCH", body, extra)),
|
|
147
|
+
del: (path, queryOrBody, extra) => {
|
|
148
|
+
if (queryOrBody &&
|
|
149
|
+
typeof queryOrBody === "object" &&
|
|
150
|
+
!(queryOrBody instanceof Blob) &&
|
|
151
|
+
!(queryOrBody instanceof FormData)) {
|
|
152
|
+
// prefer body for DELETE; but allow query via 'init'
|
|
153
|
+
return run(compose(path, "DELETE", queryOrBody, extra));
|
|
154
|
+
}
|
|
155
|
+
return run(compose(path, "DELETE", undefined, extra, queryOrBody));
|
|
156
|
+
},
|
|
157
|
+
use(fn) {
|
|
158
|
+
_use.push(fn);
|
|
159
|
+
return this;
|
|
160
|
+
},
|
|
161
|
+
after(fn) {
|
|
162
|
+
_after.push(fn);
|
|
163
|
+
return this;
|
|
164
|
+
},
|
|
165
|
+
trap(fn) {
|
|
166
|
+
_trap.push(fn);
|
|
167
|
+
return this;
|
|
168
|
+
},
|
|
169
|
+
abort() {
|
|
170
|
+
_pending.forEach((c) => c.abort());
|
|
171
|
+
_pending.clear();
|
|
172
|
+
},
|
|
173
|
+
header(name, value) {
|
|
174
|
+
_headers.set(name, value);
|
|
175
|
+
return this;
|
|
176
|
+
},
|
|
177
|
+
base(url) {
|
|
178
|
+
_base = url;
|
|
179
|
+
return this;
|
|
180
|
+
},
|
|
181
|
+
timeout(ms) {
|
|
182
|
+
_timeout = ms;
|
|
183
|
+
return this;
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
return client;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=net.js.map
|
package/dist/net.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"net.js","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,wFAAwF;AACxF,EAAE;AACF,SAAS;AACT,4CAA4C;AAC5C,4FAA4F;AAC5F,oEAAoE;AACpE,8DAA8D;AAwB9D,SAAS,EAAE,CAAC,GAAW;IACrB,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;SAChD,GAAG,CACF,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CACxE;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAA0B;IAC7C,MAAM;IACN,OAAO;IACP,aAAa;IACb,WAAW;IACX,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF,SAAS,SAAS,CAAC,KAA8B;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,KAAK;YAAG,GAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,IAAI,CAAC,IAAwB,EAAE,IAAY;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,KAAK;IACT,YAAqB,GAAa;QAAb,QAAG,GAAH,GAAG,CAAU;IAAG,CAAC;IACtC,EAAE;QACA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,KAAK;QACT,OAAO;YACL,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAClD,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;IACJ,CAAC;CACF;AAyBD,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,OAAgB,EAAE;IACnD,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,IAAI,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAY,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,GAAsB,IAAI,CAAC,KAAK,CAAC;IAC3C,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC5C,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,SAAS,OAAO,CACd,IAAY,EACZ,MAAc,EACd,IAAc,EACd,KAAmB,EACnB,KAAa;QAEb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,MAAM,GACV,IAAI,IAAI,IAAI;YACZ,OAAO,IAAI,KAAK,QAAQ;YACxB,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;YAC3B,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO;YACP,IAAI,EACF,IAAI,IAAI,IAAI;gBACV,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM;oBACN,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBACtB,CAAC,CAAE,IAAY;YACrB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,GAAG,SAAS,CAAC,KAAK,CAAC;SACpB,CAAC;QACF,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,GAAQ;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,KAAU,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAW;QACrB,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC1B,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC3B,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACpE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACtE,GAAG,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;YAChC,IACE,WAAW;gBACX,OAAO,WAAW,KAAK,QAAQ;gBAC/B,CAAC,CAAC,WAAW,YAAY,IAAI,CAAC;gBAC9B,CAAC,CAAC,WAAW,YAAY,QAAQ,CAAC,EAClC,CAAC;gBACD,qDAAqD;gBACrD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,GAAG,CACR,OAAO,CACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,KAAK,EACL,WAAgC,CACjC,CACF,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,EAAe;YACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,EAAe;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,EAAe;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK;YACH,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,IAAY,EAAE,KAAa;YAChC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAW;YACd,KAAK,GAAG,GAAG,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,EAAU;YAChB,QAAQ,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type Scope = "local" | "session";
|
|
2
|
+
export interface Store {
|
|
3
|
+
get<T = string>(key: string, fallback?: T): T | null;
|
|
4
|
+
set<T = unknown>(key: string, value: T): this;
|
|
5
|
+
rm(key: string): this;
|
|
6
|
+
has(key: string): boolean;
|
|
7
|
+
all<T = unknown>(): Record<string, T>;
|
|
8
|
+
clear(): this;
|
|
9
|
+
}
|
|
10
|
+
/** Create a namespaced storage */
|
|
11
|
+
export declare function store(scope?: Scope, ns?: string): Store;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAMA,KAAK,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjC,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACrD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC9C,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,KAAK,IAAI,IAAI,CAAC;CACf;AAcD,kCAAkC;AAClC,wBAAgB,KAAK,CAAC,KAAK,GAAE,KAAe,EAAE,EAAE,SAAK,GAAG,KAAK,CA+E5D"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// @marwajs/dom/store
|
|
2
|
+
// Fluent, namespaced wrapper for local/session storage.
|
|
3
|
+
// Usage:
|
|
4
|
+
// import { store } from "@marwajs/dom/store";
|
|
5
|
+
// const s = store("local", "app:"); s.set("token", "abc"); s.get("token");
|
|
6
|
+
function raw(scope) {
|
|
7
|
+
return scope === "session" ? window.sessionStorage : window.localStorage;
|
|
8
|
+
}
|
|
9
|
+
function safe(fn, fallback) {
|
|
10
|
+
try {
|
|
11
|
+
return fn();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return fallback;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Create a namespaced storage */
|
|
18
|
+
export function store(scope = "local", ns = "") {
|
|
19
|
+
const R = raw(scope);
|
|
20
|
+
const keyOf = (k) => (ns ? ns + k : k);
|
|
21
|
+
return {
|
|
22
|
+
get(key, fallback) {
|
|
23
|
+
return safe(() => {
|
|
24
|
+
const v = R.getItem(keyOf(key));
|
|
25
|
+
if (v == null)
|
|
26
|
+
return fallback ?? null;
|
|
27
|
+
if (typeof v === "string" && !v.startsWith("{")) {
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(v);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return v;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
return JSON.parse(v);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return v;
|
|
40
|
+
}
|
|
41
|
+
}, fallback ?? null);
|
|
42
|
+
},
|
|
43
|
+
set(key, value) {
|
|
44
|
+
safe(() => R.setItem(keyOf(key), typeof value === "string" ? value : JSON.stringify(value)), undefined);
|
|
45
|
+
return this;
|
|
46
|
+
},
|
|
47
|
+
rm(key) {
|
|
48
|
+
safe(() => R.removeItem(keyOf(key)), undefined);
|
|
49
|
+
return this;
|
|
50
|
+
},
|
|
51
|
+
has(key) {
|
|
52
|
+
return safe(() => R.getItem(keyOf(key)) != null, false);
|
|
53
|
+
},
|
|
54
|
+
all() {
|
|
55
|
+
return safe(() => {
|
|
56
|
+
const out = {};
|
|
57
|
+
for (let i = 0; i < R.length; i++) {
|
|
58
|
+
const k = R.key(i);
|
|
59
|
+
if (ns && !k.startsWith(ns))
|
|
60
|
+
continue;
|
|
61
|
+
const short = ns ? k.slice(ns.length) : k;
|
|
62
|
+
const v = R.getItem(k);
|
|
63
|
+
if (v == null) {
|
|
64
|
+
out[short] = null;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
out[short] = JSON.parse(v);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
out[short] = v;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}, {});
|
|
76
|
+
},
|
|
77
|
+
clear() {
|
|
78
|
+
if (!ns) {
|
|
79
|
+
safe(() => R.clear(), undefined);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const keys = [];
|
|
83
|
+
for (let i = 0; i < R.length; i++) {
|
|
84
|
+
const k = R.key(i);
|
|
85
|
+
if (k.startsWith(ns))
|
|
86
|
+
keys.push(k);
|
|
87
|
+
}
|
|
88
|
+
keys.forEach((k) => safe(() => R.removeItem(k), undefined));
|
|
89
|
+
}
|
|
90
|
+
return this;
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "marwajs-dom",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Fluent, single-word, chainable DOM utilities + fx/store/net add-ons.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"dom",
|
|
7
|
+
"fluent",
|
|
8
|
+
"utility",
|
|
9
|
+
"typescript",
|
|
10
|
+
"esm",
|
|
11
|
+
"micro"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Mohammad Emran <memran.dhk@gmail.com>",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/memran/marwajs-dom"
|
|
18
|
+
},
|
|
19
|
+
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./fx": {
|
|
27
|
+
"types": "./dist/fx.d.ts",
|
|
28
|
+
"import": "./dist/fx.js"
|
|
29
|
+
},
|
|
30
|
+
"./store": {
|
|
31
|
+
"types": "./dist/store.d.ts",
|
|
32
|
+
"import": "./dist/store.js"
|
|
33
|
+
},
|
|
34
|
+
"./net": {
|
|
35
|
+
"types": "./dist/net.d.ts",
|
|
36
|
+
"import": "./dist/net.js"
|
|
37
|
+
},
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"main": "./dist/index.js",
|
|
41
|
+
"module": "./dist/index.js",
|
|
42
|
+
"types": "./dist/index.d.ts",
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsc -p tsconfig.json",
|
|
50
|
+
"clean": "rimraf dist",
|
|
51
|
+
"dev": "tsc -w -p tsconfig.json",
|
|
52
|
+
"prepare": "npm run build",
|
|
53
|
+
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
54
|
+
"format": "prettier -w \"src/**/*.{ts,tsx,md}\"",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"test:watch": "vitest"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^22.19.17",
|
|
60
|
+
"@typescript-eslint/eslint-plugin": "^8.58.1",
|
|
61
|
+
"@typescript-eslint/parser": "^8.58.1",
|
|
62
|
+
"eslint": "^9.10.0",
|
|
63
|
+
"happy-dom": "^20.8.9",
|
|
64
|
+
"prettier": "^3.3.3",
|
|
65
|
+
"rimraf": "^6.0.1",
|
|
66
|
+
"typescript": "^5.6.3",
|
|
67
|
+
"vitest": "^4.1.4"
|
|
68
|
+
},
|
|
69
|
+
"engines": {
|
|
70
|
+
"node": ">=18"
|
|
71
|
+
}
|
|
72
|
+
}
|