@isik-kaplan/core 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 +22 -0
- package/dist/hooks/index.cjs +341 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +50 -0
- package/dist/hooks/index.d.ts +50 -0
- package/dist/hooks/index.js +312 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +466 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +62 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.js +404 -0
- package/dist/index.js.map +1 -0
- package/dist/next/cookies/index.d.ts +5 -0
- package/dist/next/cookies/index.js +21 -0
- package/dist/next/cookies/index.js.map +1 -0
- package/dist/next/middleware/index.cjs +66 -0
- package/dist/next/middleware/index.cjs.map +1 -0
- package/dist/next/middleware/index.d.cts +7 -0
- package/dist/next/middleware/index.d.ts +7 -0
- package/dist/next/middleware/index.js +37 -0
- package/dist/next/middleware/index.js.map +1 -0
- package/dist/node/index.cjs +173 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +57 -0
- package/dist/node/index.d.ts +57 -0
- package/dist/node/index.js +125 -0
- package/dist/node/index.js.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/node/index.ts
|
|
31
|
+
var node_exports = {};
|
|
32
|
+
__export(node_exports, {
|
|
33
|
+
ConfigError: () => ConfigError,
|
|
34
|
+
boolean: () => boolean,
|
|
35
|
+
caster: () => caster,
|
|
36
|
+
commaSeparatedFloatList: () => commaSeparatedFloatList,
|
|
37
|
+
commaSeparatedIntList: () => commaSeparatedIntList,
|
|
38
|
+
commaSeparatedList: () => commaSeparatedList,
|
|
39
|
+
config: () => config,
|
|
40
|
+
contextLocal: () => contextLocal,
|
|
41
|
+
float: () => float,
|
|
42
|
+
getFileAsString: () => getFileAsString,
|
|
43
|
+
integer: () => integer,
|
|
44
|
+
string: () => string
|
|
45
|
+
});
|
|
46
|
+
module.exports = __toCommonJS(node_exports);
|
|
47
|
+
|
|
48
|
+
// src/node/casters.ts
|
|
49
|
+
function caster(fn) {
|
|
50
|
+
return function(options = {}) {
|
|
51
|
+
const clone = ((value) => fn(value));
|
|
52
|
+
if ("missingDefault" in options) {
|
|
53
|
+
clone.missingDefault = options.missingDefault;
|
|
54
|
+
}
|
|
55
|
+
if ("errorDefault" in options) {
|
|
56
|
+
clone.errorDefault = options.errorDefault;
|
|
57
|
+
}
|
|
58
|
+
return clone;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function parseStrictInteger(value) {
|
|
62
|
+
if (value.trim() === "" || !Number.isInteger(Number(value))) {
|
|
63
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into an integer.`);
|
|
64
|
+
}
|
|
65
|
+
return Number(value);
|
|
66
|
+
}
|
|
67
|
+
function parseStrictFloat(value) {
|
|
68
|
+
if (value.trim() === "" || Number.isNaN(Number(value))) {
|
|
69
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a float.`);
|
|
70
|
+
}
|
|
71
|
+
return Number(value);
|
|
72
|
+
}
|
|
73
|
+
var string = caster((value) => value);
|
|
74
|
+
var integer = caster(parseStrictInteger);
|
|
75
|
+
var float = caster(parseStrictFloat);
|
|
76
|
+
var boolean = caster((value) => {
|
|
77
|
+
const truthy = ["true", "True", "1"];
|
|
78
|
+
const falsy = ["false", "False", "0"];
|
|
79
|
+
if (truthy.includes(value)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (falsy.includes(value)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a boolean.`);
|
|
86
|
+
});
|
|
87
|
+
var commaSeparatedList = caster((value) => value.split(","));
|
|
88
|
+
var commaSeparatedIntList = caster((value) => value.split(",").map(parseStrictInteger));
|
|
89
|
+
var commaSeparatedFloatList = caster((value) => value.split(",").map(parseStrictFloat));
|
|
90
|
+
|
|
91
|
+
// src/node/config.ts
|
|
92
|
+
var ConfigError = class extends Error {
|
|
93
|
+
};
|
|
94
|
+
function isCaster(value) {
|
|
95
|
+
return typeof value === "function";
|
|
96
|
+
}
|
|
97
|
+
function environmentKey(prefix, path2, sep) {
|
|
98
|
+
return [...prefix ? [prefix] : [], ...path2].join(sep);
|
|
99
|
+
}
|
|
100
|
+
function readLeaf(leafCaster, key) {
|
|
101
|
+
const rawValue = process.env[key];
|
|
102
|
+
if (rawValue === void 0) {
|
|
103
|
+
if ("missingDefault" in leafCaster) {
|
|
104
|
+
return leafCaster.missingDefault;
|
|
105
|
+
}
|
|
106
|
+
throw new ConfigError(
|
|
107
|
+
`Environment variable ${key} not found. Please set it or provide a missingDefault to your caster.`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
return leafCaster(rawValue);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if ("errorDefault" in leafCaster) {
|
|
114
|
+
return leafCaster.errorDefault;
|
|
115
|
+
}
|
|
116
|
+
throw new ConfigError(
|
|
117
|
+
`Error while parsing ${key}=${JSON.stringify(rawValue)}: ${error instanceof Error ? error.message : String(error)}. Please check the value and the caster, or provide an errorDefault to your caster.`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function build(schema, path2, prefix, sep) {
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
124
|
+
const keyPath = [...path2, key];
|
|
125
|
+
result[key] = isCaster(value) ? readLeaf(value, environmentKey(prefix, keyPath, sep)) : build(value, keyPath, prefix, sep);
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
function config(schema, options = {}) {
|
|
130
|
+
const { prefix, sep = "__" } = options;
|
|
131
|
+
return build(schema, [], prefix, sep);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// src/node/contextLocal.ts
|
|
135
|
+
var import_node_async_hooks = require("async_hooks");
|
|
136
|
+
var registry = /* @__PURE__ */ new Map();
|
|
137
|
+
function contextLocal(name) {
|
|
138
|
+
let storage = registry.get(name);
|
|
139
|
+
if (!storage) {
|
|
140
|
+
storage = new import_node_async_hooks.AsyncLocalStorage();
|
|
141
|
+
registry.set(name, storage);
|
|
142
|
+
}
|
|
143
|
+
return storage;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/node/getFileAsString.ts
|
|
147
|
+
var import_promises = __toESM(require("fs/promises"), 1);
|
|
148
|
+
var import_path = __toESM(require("path"), 1);
|
|
149
|
+
async function getFileAsString(filename) {
|
|
150
|
+
try {
|
|
151
|
+
const filePath = import_path.default.join(process.cwd(), filename);
|
|
152
|
+
return await import_promises.default.readFile(filePath, "utf8");
|
|
153
|
+
} catch (error) {
|
|
154
|
+
console.error(`Error reading file ${filename}:`, error);
|
|
155
|
+
return `Error reading file: ${error instanceof Error ? error.message : String(error)}`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
159
|
+
0 && (module.exports = {
|
|
160
|
+
ConfigError,
|
|
161
|
+
boolean,
|
|
162
|
+
caster,
|
|
163
|
+
commaSeparatedFloatList,
|
|
164
|
+
commaSeparatedIntList,
|
|
165
|
+
commaSeparatedList,
|
|
166
|
+
config,
|
|
167
|
+
contextLocal,
|
|
168
|
+
float,
|
|
169
|
+
getFileAsString,
|
|
170
|
+
integer,
|
|
171
|
+
string
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/node/index.ts","../../src/node/casters.ts","../../src/node/config.ts","../../src/node/contextLocal.ts","../../src/node/getFileAsString.ts"],"sourcesContent":["export * from './casters'\nexport * from './config'\nexport * from './contextLocal'\nexport * from './getFileAsString'\n","export type Caster<T> = ((value: string) => T) & { missingDefault?: T; errorDefault?: T }\n\nexport function caster<T>(fn: (value: string) => T) {\n return function (options: { missingDefault?: T; errorDefault?: T } = {}): Caster<T> {\n const clone = ((value: string) => fn(value)) as Caster<T>\n if ('missingDefault' in options) {\n clone.missingDefault = options.missingDefault\n }\n if ('errorDefault' in options) {\n clone.errorDefault = options.errorDefault\n }\n return clone\n }\n}\n\n// JS's Number()/parseInt()/parseFloat() don't throw on unparseable input the way Python's int()/\n// float() do (parseInt('123abc') silently returns 123, Number('') silently returns 0) - these\n// helpers add back the \"either it's a clean, fully-parsed number or it throws\" contract the\n// missingDefault/errorDefault fallback system above depends on.\nfunction parseStrictInteger(value: string): number {\n if (value.trim() === '' || !Number.isInteger(Number(value))) {\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into an integer.`)\n }\n return Number(value)\n}\n\nfunction parseStrictFloat(value: string): number {\n if (value.trim() === '' || Number.isNaN(Number(value))) {\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a float.`)\n }\n return Number(value)\n}\n\nexport const string = caster((value: string) => value)\n\nexport const integer = caster(parseStrictInteger)\n\nexport const float = caster(parseStrictFloat)\n\nexport const boolean = caster((value: string) => {\n const truthy = ['true', 'True', '1']\n const falsy = ['false', 'False', '0']\n if (truthy.includes(value)) {\n return true\n }\n if (falsy.includes(value)) {\n return false\n }\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a boolean.`)\n})\n\nexport const commaSeparatedList = caster((value: string) => value.split(','))\n\nexport const commaSeparatedIntList = caster((value: string) => value.split(',').map(parseStrictInteger))\n\nexport const commaSeparatedFloatList = caster((value: string) => value.split(',').map(parseStrictFloat))\n","import type { Caster } from './casters'\n\nexport class ConfigError extends Error {}\n\ntype Schema = { [key: string]: Caster<unknown> | Schema }\n\ntype InferConfig<S> = {\n [K in keyof S]: S[K] extends Caster<infer T> ? T : S[K] extends Schema ? InferConfig<S[K]> : never\n}\n\nfunction isCaster(value: unknown): value is Caster<unknown> {\n return typeof value === 'function'\n}\n\nfunction environmentKey(prefix: string | undefined, path: string[], sep: string): string {\n return [...(prefix ? [prefix] : []), ...path].join(sep)\n}\n\nfunction readLeaf<T>(leafCaster: Caster<T>, key: string): T {\n const rawValue = process.env[key]\n\n if (rawValue === undefined) {\n if ('missingDefault' in leafCaster) {\n return leafCaster.missingDefault as T\n }\n throw new ConfigError(\n `Environment variable ${key} not found. Please set it or provide a missingDefault to your caster.`\n )\n }\n\n try {\n return leafCaster(rawValue)\n } catch (error) {\n if ('errorDefault' in leafCaster) {\n return leafCaster.errorDefault as T\n }\n throw new ConfigError(\n `Error while parsing ${key}=${JSON.stringify(rawValue)}: ${error instanceof Error ? error.message : String(error)}. ` +\n 'Please check the value and the caster, or provide an errorDefault to your caster.'\n )\n }\n}\n\nfunction build<S extends Schema>(schema: S, path: string[], prefix: string | undefined, sep: string): InferConfig<S> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(schema)) {\n const keyPath = [...path, key]\n result[key] = isCaster(value)\n ? readLeaf(value, environmentKey(prefix, keyPath, sep))\n : build(value, keyPath, prefix, sep)\n }\n return result as InferConfig<S>\n}\n\nexport function config<S extends Schema>(schema: S, options: { prefix?: string; sep?: string } = {}): InferConfig<S> {\n const { prefix, sep = '__' } = options\n return build(schema, [], prefix, sep)\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nconst registry = new Map<string, AsyncLocalStorage<unknown>>()\n\nexport function contextLocal<T>(name: string): AsyncLocalStorage<T> {\n let storage = registry.get(name)\n if (!storage) {\n storage = new AsyncLocalStorage<T>()\n registry.set(name, storage)\n }\n return storage as AsyncLocalStorage<T>\n}\n","import fs from 'fs/promises'\nimport path from 'path'\n\nexport async function getFileAsString(filename: string): Promise<string> {\n try {\n const filePath = path.join(process.cwd(), filename)\n return await fs.readFile(filePath, 'utf8')\n } catch (error) {\n console.error(`Error reading file ${filename}:`, error)\n return `Error reading file: ${error instanceof Error ? error.message : String(error)}`\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,OAAU,IAA0B;AAClD,SAAO,SAAU,UAAoD,CAAC,GAAc;AAClF,UAAM,SAAS,CAAC,UAAkB,GAAG,KAAK;AAC1C,QAAI,oBAAoB,SAAS;AAC/B,YAAM,iBAAiB,QAAQ;AAAA,IACjC;AACA,QAAI,kBAAkB,SAAS;AAC7B,YAAM,eAAe,QAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AACF;AAMA,SAAS,mBAAmB,OAAuB;AACjD,MAAI,MAAM,KAAK,MAAM,MAAM,CAAC,OAAO,UAAU,OAAO,KAAK,CAAC,GAAG;AAC3D,UAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC,qCAAqC;AAAA,EACrF;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,MAAI,MAAM,KAAK,MAAM,MAAM,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG;AACtD,UAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC,kCAAkC;AAAA,EAClF;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,IAAM,SAAS,OAAO,CAAC,UAAkB,KAAK;AAE9C,IAAM,UAAU,OAAO,kBAAkB;AAEzC,IAAM,QAAQ,OAAO,gBAAgB;AAErC,IAAM,UAAU,OAAO,CAAC,UAAkB;AAC/C,QAAM,SAAS,CAAC,QAAQ,QAAQ,GAAG;AACnC,QAAM,QAAQ,CAAC,SAAS,SAAS,GAAG;AACpC,MAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC,oCAAoC;AACpF,CAAC;AAEM,IAAM,qBAAqB,OAAO,CAAC,UAAkB,MAAM,MAAM,GAAG,CAAC;AAErE,IAAM,wBAAwB,OAAO,CAAC,UAAkB,MAAM,MAAM,GAAG,EAAE,IAAI,kBAAkB,CAAC;AAEhG,IAAM,0BAA0B,OAAO,CAAC,UAAkB,MAAM,MAAM,GAAG,EAAE,IAAI,gBAAgB,CAAC;;;ACrDhG,IAAM,cAAN,cAA0B,MAAM;AAAC;AAQxC,SAAS,SAAS,OAA0C;AAC1D,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,eAAe,QAA4BA,OAAgB,KAAqB;AACvF,SAAO,CAAC,GAAI,SAAS,CAAC,MAAM,IAAI,CAAC,GAAI,GAAGA,KAAI,EAAE,KAAK,GAAG;AACxD;AAEA,SAAS,SAAY,YAAuB,KAAgB;AAC1D,QAAM,WAAW,QAAQ,IAAI,GAAG;AAEhC,MAAI,aAAa,QAAW;AAC1B,QAAI,oBAAoB,YAAY;AAClC,aAAO,WAAW;AAAA,IACpB;AACA,UAAM,IAAI;AAAA,MACR,wBAAwB,GAAG;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI;AACF,WAAO,WAAW,QAAQ;AAAA,EAC5B,SAAS,OAAO;AACd,QAAI,kBAAkB,YAAY;AAChC,aAAO,WAAW;AAAA,IACpB;AACA,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG,IAAI,KAAK,UAAU,QAAQ,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAEnH;AAAA,EACF;AACF;AAEA,SAAS,MAAwB,QAAWA,OAAgB,QAA4B,KAA6B;AACnH,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,UAAU,CAAC,GAAGA,OAAM,GAAG;AAC7B,WAAO,GAAG,IAAI,SAAS,KAAK,IACxB,SAAS,OAAO,eAAe,QAAQ,SAAS,GAAG,CAAC,IACpD,MAAM,OAAO,SAAS,QAAQ,GAAG;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,OAAyB,QAAW,UAA6C,CAAC,GAAmB;AACnH,QAAM,EAAE,QAAQ,MAAM,KAAK,IAAI;AAC/B,SAAO,MAAM,QAAQ,CAAC,GAAG,QAAQ,GAAG;AACtC;;;ACzDA,8BAAkC;AAElC,IAAM,WAAW,oBAAI,IAAwC;AAEtD,SAAS,aAAgB,MAAoC;AAClE,MAAI,UAAU,SAAS,IAAI,IAAI;AAC/B,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,0CAAqB;AACnC,aAAS,IAAI,MAAM,OAAO;AAAA,EAC5B;AACA,SAAO;AACT;;;ACXA,sBAAe;AACf,kBAAiB;AAEjB,eAAsB,gBAAgB,UAAmC;AACvE,MAAI;AACF,UAAM,WAAW,YAAAC,QAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAClD,WAAO,MAAM,gBAAAC,QAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,SAAS,OAAO;AACd,YAAQ,MAAM,sBAAsB,QAAQ,KAAK,KAAK;AACtD,WAAO,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,EACtF;AACF;","names":["path","path","fs"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
|
|
3
|
+
type Caster<T> = ((value: string) => T) & {
|
|
4
|
+
missingDefault?: T;
|
|
5
|
+
errorDefault?: T;
|
|
6
|
+
};
|
|
7
|
+
declare function caster<T>(fn: (value: string) => T): (options?: {
|
|
8
|
+
missingDefault?: T;
|
|
9
|
+
errorDefault?: T;
|
|
10
|
+
}) => Caster<T>;
|
|
11
|
+
declare const string: (options?: {
|
|
12
|
+
missingDefault?: string | undefined;
|
|
13
|
+
errorDefault?: string | undefined;
|
|
14
|
+
}) => Caster<string>;
|
|
15
|
+
declare const integer: (options?: {
|
|
16
|
+
missingDefault?: number | undefined;
|
|
17
|
+
errorDefault?: number | undefined;
|
|
18
|
+
}) => Caster<number>;
|
|
19
|
+
declare const float: (options?: {
|
|
20
|
+
missingDefault?: number | undefined;
|
|
21
|
+
errorDefault?: number | undefined;
|
|
22
|
+
}) => Caster<number>;
|
|
23
|
+
declare const boolean: (options?: {
|
|
24
|
+
missingDefault?: boolean | undefined;
|
|
25
|
+
errorDefault?: boolean | undefined;
|
|
26
|
+
}) => Caster<boolean>;
|
|
27
|
+
declare const commaSeparatedList: (options?: {
|
|
28
|
+
missingDefault?: string[] | undefined;
|
|
29
|
+
errorDefault?: string[] | undefined;
|
|
30
|
+
}) => Caster<string[]>;
|
|
31
|
+
declare const commaSeparatedIntList: (options?: {
|
|
32
|
+
missingDefault?: number[] | undefined;
|
|
33
|
+
errorDefault?: number[] | undefined;
|
|
34
|
+
}) => Caster<number[]>;
|
|
35
|
+
declare const commaSeparatedFloatList: (options?: {
|
|
36
|
+
missingDefault?: number[] | undefined;
|
|
37
|
+
errorDefault?: number[] | undefined;
|
|
38
|
+
}) => Caster<number[]>;
|
|
39
|
+
|
|
40
|
+
declare class ConfigError extends Error {
|
|
41
|
+
}
|
|
42
|
+
type Schema = {
|
|
43
|
+
[key: string]: Caster<unknown> | Schema;
|
|
44
|
+
};
|
|
45
|
+
type InferConfig<S> = {
|
|
46
|
+
[K in keyof S]: S[K] extends Caster<infer T> ? T : S[K] extends Schema ? InferConfig<S[K]> : never;
|
|
47
|
+
};
|
|
48
|
+
declare function config<S extends Schema>(schema: S, options?: {
|
|
49
|
+
prefix?: string;
|
|
50
|
+
sep?: string;
|
|
51
|
+
}): InferConfig<S>;
|
|
52
|
+
|
|
53
|
+
declare function contextLocal<T>(name: string): AsyncLocalStorage<T>;
|
|
54
|
+
|
|
55
|
+
declare function getFileAsString(filename: string): Promise<string>;
|
|
56
|
+
|
|
57
|
+
export { type Caster, ConfigError, boolean, caster, commaSeparatedFloatList, commaSeparatedIntList, commaSeparatedList, config, contextLocal, float, getFileAsString, integer, string };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
|
|
3
|
+
type Caster<T> = ((value: string) => T) & {
|
|
4
|
+
missingDefault?: T;
|
|
5
|
+
errorDefault?: T;
|
|
6
|
+
};
|
|
7
|
+
declare function caster<T>(fn: (value: string) => T): (options?: {
|
|
8
|
+
missingDefault?: T;
|
|
9
|
+
errorDefault?: T;
|
|
10
|
+
}) => Caster<T>;
|
|
11
|
+
declare const string: (options?: {
|
|
12
|
+
missingDefault?: string | undefined;
|
|
13
|
+
errorDefault?: string | undefined;
|
|
14
|
+
}) => Caster<string>;
|
|
15
|
+
declare const integer: (options?: {
|
|
16
|
+
missingDefault?: number | undefined;
|
|
17
|
+
errorDefault?: number | undefined;
|
|
18
|
+
}) => Caster<number>;
|
|
19
|
+
declare const float: (options?: {
|
|
20
|
+
missingDefault?: number | undefined;
|
|
21
|
+
errorDefault?: number | undefined;
|
|
22
|
+
}) => Caster<number>;
|
|
23
|
+
declare const boolean: (options?: {
|
|
24
|
+
missingDefault?: boolean | undefined;
|
|
25
|
+
errorDefault?: boolean | undefined;
|
|
26
|
+
}) => Caster<boolean>;
|
|
27
|
+
declare const commaSeparatedList: (options?: {
|
|
28
|
+
missingDefault?: string[] | undefined;
|
|
29
|
+
errorDefault?: string[] | undefined;
|
|
30
|
+
}) => Caster<string[]>;
|
|
31
|
+
declare const commaSeparatedIntList: (options?: {
|
|
32
|
+
missingDefault?: number[] | undefined;
|
|
33
|
+
errorDefault?: number[] | undefined;
|
|
34
|
+
}) => Caster<number[]>;
|
|
35
|
+
declare const commaSeparatedFloatList: (options?: {
|
|
36
|
+
missingDefault?: number[] | undefined;
|
|
37
|
+
errorDefault?: number[] | undefined;
|
|
38
|
+
}) => Caster<number[]>;
|
|
39
|
+
|
|
40
|
+
declare class ConfigError extends Error {
|
|
41
|
+
}
|
|
42
|
+
type Schema = {
|
|
43
|
+
[key: string]: Caster<unknown> | Schema;
|
|
44
|
+
};
|
|
45
|
+
type InferConfig<S> = {
|
|
46
|
+
[K in keyof S]: S[K] extends Caster<infer T> ? T : S[K] extends Schema ? InferConfig<S[K]> : never;
|
|
47
|
+
};
|
|
48
|
+
declare function config<S extends Schema>(schema: S, options?: {
|
|
49
|
+
prefix?: string;
|
|
50
|
+
sep?: string;
|
|
51
|
+
}): InferConfig<S>;
|
|
52
|
+
|
|
53
|
+
declare function contextLocal<T>(name: string): AsyncLocalStorage<T>;
|
|
54
|
+
|
|
55
|
+
declare function getFileAsString(filename: string): Promise<string>;
|
|
56
|
+
|
|
57
|
+
export { type Caster, ConfigError, boolean, caster, commaSeparatedFloatList, commaSeparatedIntList, commaSeparatedList, config, contextLocal, float, getFileAsString, integer, string };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// src/node/casters.ts
|
|
2
|
+
function caster(fn) {
|
|
3
|
+
return function(options = {}) {
|
|
4
|
+
const clone = ((value) => fn(value));
|
|
5
|
+
if ("missingDefault" in options) {
|
|
6
|
+
clone.missingDefault = options.missingDefault;
|
|
7
|
+
}
|
|
8
|
+
if ("errorDefault" in options) {
|
|
9
|
+
clone.errorDefault = options.errorDefault;
|
|
10
|
+
}
|
|
11
|
+
return clone;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function parseStrictInteger(value) {
|
|
15
|
+
if (value.trim() === "" || !Number.isInteger(Number(value))) {
|
|
16
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into an integer.`);
|
|
17
|
+
}
|
|
18
|
+
return Number(value);
|
|
19
|
+
}
|
|
20
|
+
function parseStrictFloat(value) {
|
|
21
|
+
if (value.trim() === "" || Number.isNaN(Number(value))) {
|
|
22
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a float.`);
|
|
23
|
+
}
|
|
24
|
+
return Number(value);
|
|
25
|
+
}
|
|
26
|
+
var string = caster((value) => value);
|
|
27
|
+
var integer = caster(parseStrictInteger);
|
|
28
|
+
var float = caster(parseStrictFloat);
|
|
29
|
+
var boolean = caster((value) => {
|
|
30
|
+
const truthy = ["true", "True", "1"];
|
|
31
|
+
const falsy = ["false", "False", "0"];
|
|
32
|
+
if (truthy.includes(value)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (falsy.includes(value)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a boolean.`);
|
|
39
|
+
});
|
|
40
|
+
var commaSeparatedList = caster((value) => value.split(","));
|
|
41
|
+
var commaSeparatedIntList = caster((value) => value.split(",").map(parseStrictInteger));
|
|
42
|
+
var commaSeparatedFloatList = caster((value) => value.split(",").map(parseStrictFloat));
|
|
43
|
+
|
|
44
|
+
// src/node/config.ts
|
|
45
|
+
var ConfigError = class extends Error {
|
|
46
|
+
};
|
|
47
|
+
function isCaster(value) {
|
|
48
|
+
return typeof value === "function";
|
|
49
|
+
}
|
|
50
|
+
function environmentKey(prefix, path2, sep) {
|
|
51
|
+
return [...prefix ? [prefix] : [], ...path2].join(sep);
|
|
52
|
+
}
|
|
53
|
+
function readLeaf(leafCaster, key) {
|
|
54
|
+
const rawValue = process.env[key];
|
|
55
|
+
if (rawValue === void 0) {
|
|
56
|
+
if ("missingDefault" in leafCaster) {
|
|
57
|
+
return leafCaster.missingDefault;
|
|
58
|
+
}
|
|
59
|
+
throw new ConfigError(
|
|
60
|
+
`Environment variable ${key} not found. Please set it or provide a missingDefault to your caster.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return leafCaster(rawValue);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if ("errorDefault" in leafCaster) {
|
|
67
|
+
return leafCaster.errorDefault;
|
|
68
|
+
}
|
|
69
|
+
throw new ConfigError(
|
|
70
|
+
`Error while parsing ${key}=${JSON.stringify(rawValue)}: ${error instanceof Error ? error.message : String(error)}. Please check the value and the caster, or provide an errorDefault to your caster.`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function build(schema, path2, prefix, sep) {
|
|
75
|
+
const result = {};
|
|
76
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
77
|
+
const keyPath = [...path2, key];
|
|
78
|
+
result[key] = isCaster(value) ? readLeaf(value, environmentKey(prefix, keyPath, sep)) : build(value, keyPath, prefix, sep);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function config(schema, options = {}) {
|
|
83
|
+
const { prefix, sep = "__" } = options;
|
|
84
|
+
return build(schema, [], prefix, sep);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// src/node/contextLocal.ts
|
|
88
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
89
|
+
var registry = /* @__PURE__ */ new Map();
|
|
90
|
+
function contextLocal(name) {
|
|
91
|
+
let storage = registry.get(name);
|
|
92
|
+
if (!storage) {
|
|
93
|
+
storage = new AsyncLocalStorage();
|
|
94
|
+
registry.set(name, storage);
|
|
95
|
+
}
|
|
96
|
+
return storage;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// src/node/getFileAsString.ts
|
|
100
|
+
import fs from "fs/promises";
|
|
101
|
+
import path from "path";
|
|
102
|
+
async function getFileAsString(filename) {
|
|
103
|
+
try {
|
|
104
|
+
const filePath = path.join(process.cwd(), filename);
|
|
105
|
+
return await fs.readFile(filePath, "utf8");
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(`Error reading file ${filename}:`, error);
|
|
108
|
+
return `Error reading file: ${error instanceof Error ? error.message : String(error)}`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export {
|
|
112
|
+
ConfigError,
|
|
113
|
+
boolean,
|
|
114
|
+
caster,
|
|
115
|
+
commaSeparatedFloatList,
|
|
116
|
+
commaSeparatedIntList,
|
|
117
|
+
commaSeparatedList,
|
|
118
|
+
config,
|
|
119
|
+
contextLocal,
|
|
120
|
+
float,
|
|
121
|
+
getFileAsString,
|
|
122
|
+
integer,
|
|
123
|
+
string
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/node/casters.ts","../../src/node/config.ts","../../src/node/contextLocal.ts","../../src/node/getFileAsString.ts"],"sourcesContent":["export type Caster<T> = ((value: string) => T) & { missingDefault?: T; errorDefault?: T }\n\nexport function caster<T>(fn: (value: string) => T) {\n return function (options: { missingDefault?: T; errorDefault?: T } = {}): Caster<T> {\n const clone = ((value: string) => fn(value)) as Caster<T>\n if ('missingDefault' in options) {\n clone.missingDefault = options.missingDefault\n }\n if ('errorDefault' in options) {\n clone.errorDefault = options.errorDefault\n }\n return clone\n }\n}\n\n// JS's Number()/parseInt()/parseFloat() don't throw on unparseable input the way Python's int()/\n// float() do (parseInt('123abc') silently returns 123, Number('') silently returns 0) - these\n// helpers add back the \"either it's a clean, fully-parsed number or it throws\" contract the\n// missingDefault/errorDefault fallback system above depends on.\nfunction parseStrictInteger(value: string): number {\n if (value.trim() === '' || !Number.isInteger(Number(value))) {\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into an integer.`)\n }\n return Number(value)\n}\n\nfunction parseStrictFloat(value: string): number {\n if (value.trim() === '' || Number.isNaN(Number(value))) {\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a float.`)\n }\n return Number(value)\n}\n\nexport const string = caster((value: string) => value)\n\nexport const integer = caster(parseStrictInteger)\n\nexport const float = caster(parseStrictFloat)\n\nexport const boolean = caster((value: string) => {\n const truthy = ['true', 'True', '1']\n const falsy = ['false', 'False', '0']\n if (truthy.includes(value)) {\n return true\n }\n if (falsy.includes(value)) {\n return false\n }\n throw new Error(`Value ${JSON.stringify(value)} can not be parsed into a boolean.`)\n})\n\nexport const commaSeparatedList = caster((value: string) => value.split(','))\n\nexport const commaSeparatedIntList = caster((value: string) => value.split(',').map(parseStrictInteger))\n\nexport const commaSeparatedFloatList = caster((value: string) => value.split(',').map(parseStrictFloat))\n","import type { Caster } from './casters'\n\nexport class ConfigError extends Error {}\n\ntype Schema = { [key: string]: Caster<unknown> | Schema }\n\ntype InferConfig<S> = {\n [K in keyof S]: S[K] extends Caster<infer T> ? T : S[K] extends Schema ? InferConfig<S[K]> : never\n}\n\nfunction isCaster(value: unknown): value is Caster<unknown> {\n return typeof value === 'function'\n}\n\nfunction environmentKey(prefix: string | undefined, path: string[], sep: string): string {\n return [...(prefix ? [prefix] : []), ...path].join(sep)\n}\n\nfunction readLeaf<T>(leafCaster: Caster<T>, key: string): T {\n const rawValue = process.env[key]\n\n if (rawValue === undefined) {\n if ('missingDefault' in leafCaster) {\n return leafCaster.missingDefault as T\n }\n throw new ConfigError(\n `Environment variable ${key} not found. Please set it or provide a missingDefault to your caster.`\n )\n }\n\n try {\n return leafCaster(rawValue)\n } catch (error) {\n if ('errorDefault' in leafCaster) {\n return leafCaster.errorDefault as T\n }\n throw new ConfigError(\n `Error while parsing ${key}=${JSON.stringify(rawValue)}: ${error instanceof Error ? error.message : String(error)}. ` +\n 'Please check the value and the caster, or provide an errorDefault to your caster.'\n )\n }\n}\n\nfunction build<S extends Schema>(schema: S, path: string[], prefix: string | undefined, sep: string): InferConfig<S> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(schema)) {\n const keyPath = [...path, key]\n result[key] = isCaster(value)\n ? readLeaf(value, environmentKey(prefix, keyPath, sep))\n : build(value, keyPath, prefix, sep)\n }\n return result as InferConfig<S>\n}\n\nexport function config<S extends Schema>(schema: S, options: { prefix?: string; sep?: string } = {}): InferConfig<S> {\n const { prefix, sep = '__' } = options\n return build(schema, [], prefix, sep)\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nconst registry = new Map<string, AsyncLocalStorage<unknown>>()\n\nexport function contextLocal<T>(name: string): AsyncLocalStorage<T> {\n let storage = registry.get(name)\n if (!storage) {\n storage = new AsyncLocalStorage<T>()\n registry.set(name, storage)\n }\n return storage as AsyncLocalStorage<T>\n}\n","import fs from 'fs/promises'\nimport path from 'path'\n\nexport async function getFileAsString(filename: string): Promise<string> {\n try {\n const filePath = path.join(process.cwd(), filename)\n return await fs.readFile(filePath, 'utf8')\n } catch (error) {\n console.error(`Error reading file ${filename}:`, error)\n return `Error reading file: ${error instanceof Error ? error.message : String(error)}`\n }\n}\n"],"mappings":"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","names":["path"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@isik-kaplan/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Everyday TypeScript utilities.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Işık Kaplan",
|
|
8
|
+
"email": "isik.kaplan@outlook.com"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/isik-kaplan/isik-ts",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/isik-kaplan/isik-ts"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"utility",
|
|
17
|
+
"typescript"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"main": "./dist/index.cjs",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"require": "./dist/index.cjs"
|
|
35
|
+
},
|
|
36
|
+
"./hooks": {
|
|
37
|
+
"types": "./dist/hooks/index.d.ts",
|
|
38
|
+
"import": "./dist/hooks/index.js",
|
|
39
|
+
"require": "./dist/hooks/index.cjs"
|
|
40
|
+
},
|
|
41
|
+
"./node": {
|
|
42
|
+
"types": "./dist/node/index.d.ts",
|
|
43
|
+
"import": "./dist/node/index.js",
|
|
44
|
+
"require": "./dist/node/index.cjs"
|
|
45
|
+
},
|
|
46
|
+
"./next/middleware": {
|
|
47
|
+
"types": "./dist/next/middleware/index.d.ts",
|
|
48
|
+
"import": "./dist/next/middleware/index.js",
|
|
49
|
+
"require": "./dist/next/middleware/index.cjs"
|
|
50
|
+
},
|
|
51
|
+
"./next/cookies": {
|
|
52
|
+
"types": "./dist/next/cookies/index.d.ts",
|
|
53
|
+
"import": "./dist/next/cookies/index.js"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsup --config tsup.config.ts && tsup --config tsup.next-cookies.config.ts",
|
|
58
|
+
"dev": "tsup --config tsup.config.ts --watch",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"test:coverage": "vitest run --coverage",
|
|
61
|
+
"lint:eslint": "eslint .",
|
|
62
|
+
"lint:types": "tsc --noEmit",
|
|
63
|
+
"lint:prettier": "prettier --check .",
|
|
64
|
+
"lint": "npm run lint:eslint && npm run lint:types && npm run lint:prettier",
|
|
65
|
+
"fix": "eslint . --fix && prettier --write .",
|
|
66
|
+
"prepare": "husky"
|
|
67
|
+
},
|
|
68
|
+
"lint-staged": {
|
|
69
|
+
"*.{ts,tsx}": [
|
|
70
|
+
"eslint --fix",
|
|
71
|
+
"prettier --write"
|
|
72
|
+
],
|
|
73
|
+
"*.{js,jsx,json,md,yml,yaml}": [
|
|
74
|
+
"prettier --write"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"date-fns": "^3.6.0"
|
|
79
|
+
},
|
|
80
|
+
"peerDependencies": {
|
|
81
|
+
"next": ">=14",
|
|
82
|
+
"react": ">=18"
|
|
83
|
+
},
|
|
84
|
+
"peerDependenciesMeta": {
|
|
85
|
+
"react": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
88
|
+
"next": {
|
|
89
|
+
"optional": true
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"devDependencies": {
|
|
93
|
+
"@eslint/eslintrc": "^3.3.6",
|
|
94
|
+
"@eslint/js": "^9.9.1",
|
|
95
|
+
"@fast-check/vitest": "^0.4.1",
|
|
96
|
+
"@testing-library/dom": "^10.4.1",
|
|
97
|
+
"@testing-library/react": "^16.3.2",
|
|
98
|
+
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
|
99
|
+
"@types/node": "^20.17.9",
|
|
100
|
+
"@types/react": "^19.1.1",
|
|
101
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
102
|
+
"eslint": "^9.9.1",
|
|
103
|
+
"eslint-config-prettier": "^9.1.0",
|
|
104
|
+
"eslint-config-standard": "^17.1.0",
|
|
105
|
+
"eslint-plugin-import": "^2.32.0",
|
|
106
|
+
"eslint-plugin-n": "^17.24.0",
|
|
107
|
+
"eslint-plugin-prettier": "^5.5.6",
|
|
108
|
+
"eslint-plugin-promise": "^7.3.0",
|
|
109
|
+
"eslint-plugin-react": "^7.37.5",
|
|
110
|
+
"fast-check": "^4.9.0",
|
|
111
|
+
"husky": "^9.1.7",
|
|
112
|
+
"jsdom": "^26.0.0",
|
|
113
|
+
"lint-staged": "^16.4.0",
|
|
114
|
+
"next": "^16.2.12",
|
|
115
|
+
"prettier": "^3.3.3",
|
|
116
|
+
"react": "^19.2.8",
|
|
117
|
+
"react-dom": "^19.2.8",
|
|
118
|
+
"tsup": "^8.3.0",
|
|
119
|
+
"typescript": "^5.5.4",
|
|
120
|
+
"typescript-eslint": "^8.3.0",
|
|
121
|
+
"vitest": "^4.1.10"
|
|
122
|
+
}
|
|
123
|
+
}
|