functype-os 0.1.0 → 0.3.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/dist/config/ConfigResolver.d.ts +14 -4
- package/dist/config/ConfigResolver.js +1 -1
- package/dist/config/ConfigResolver.js.map +1 -1
- package/dist/env/Env.js.map +1 -1
- package/dist/fs/Fs.d.ts +10 -5
- package/dist/fs/Fs.js +1 -1
- package/dist/fs/Fs.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/platform/Platform.d.ts +11 -2
- package/dist/platform/Platform.js +1 -1
- package/dist/platform/Platform.js.map +1 -1
- package/dist/platform/index.d.ts +2 -2
- package/package.json +18 -16
|
@@ -1,16 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ConfigError } from "../errors/errors.js";
|
|
2
|
+
import { Either, List, Option, TaskResult } from "functype";
|
|
2
3
|
|
|
3
4
|
//#region src/config/ConfigResolver.d.ts
|
|
4
5
|
declare const ConfigResolver: {
|
|
5
6
|
resolve: (options: {
|
|
6
|
-
candidates: readonly string[];
|
|
7
|
+
readonly candidates: readonly string[];
|
|
7
8
|
}) => TaskResult<Option<string>>;
|
|
8
9
|
resolveRequired: (options: {
|
|
9
|
-
candidates: readonly string[];
|
|
10
|
+
readonly candidates: readonly string[];
|
|
10
11
|
}) => TaskResult<string>;
|
|
11
12
|
resolveAll: (options: {
|
|
12
|
-
candidates: readonly string[];
|
|
13
|
+
readonly candidates: readonly string[];
|
|
13
14
|
}) => TaskResult<List<string>>;
|
|
15
|
+
resolveSync: (options: {
|
|
16
|
+
readonly candidates: readonly string[];
|
|
17
|
+
}) => Option<string>;
|
|
18
|
+
resolveRequiredSync: (options: {
|
|
19
|
+
readonly candidates: readonly string[];
|
|
20
|
+
}) => Either<ConfigError, string>;
|
|
21
|
+
resolveAllSync: (options: {
|
|
22
|
+
readonly candidates: readonly string[];
|
|
23
|
+
}) => List<string>;
|
|
14
24
|
};
|
|
15
25
|
//#endregion
|
|
16
26
|
export { ConfigResolver };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ConfigError as e}from"../errors/errors.js";import{Fs as t}from"../fs/Fs.js";import{expandPath as n}from"../path/PathExpander.js";import{Err as r,
|
|
1
|
+
import{ConfigError as e}from"../errors/errors.js";import{Fs as t}from"../fs/Fs.js";import{expandPath as n}from"../path/PathExpander.js";import{Err as r,Left as i,List as a,Ok as o,Option as s,Right as c}from"functype";const l=e=>n(e).fold(()=>s(void 0),e=>s(e)),u={resolve:async e=>{for(let n of e.candidates){let e=l(n);if(e.isNone())continue;let r=await t.exists(e.orThrow());if(!r.isErr()&&r.value)return o(e)}return o(s(void 0))},resolveRequired:async t=>{let n=await u.resolve(t);if(n.isErr())return r(n.error);let i=n.orThrow();return i.isSome()?o(i.orThrow()):r(e(t.candidates))},resolveAll:async e=>{let n=e.candidates.reduce((e,t)=>{let n=l(t);return n.isNone()?e:[...e,n.orThrow()]},[]),r=[];for(let e of n){let n=await t.exists(e);n.isOk()&&n.value&&r.push(e)}return o(a(r))},resolveSync:e=>{for(let n of e.candidates){let e=l(n);if(!e.isNone()&&t.existsSync(e.orThrow()))return e}return s(void 0)},resolveRequiredSync:t=>u.resolveSync(t).fold(()=>i(e(t.candidates)),e=>c(e)),resolveAllSync:e=>a(e.candidates.reduce((e,n)=>{let r=l(n);if(r.isNone())return e;let i=r.orThrow();return t.existsSync(i)?[...e,i]:e},[]))};export{u as ConfigResolver};
|
|
2
2
|
//# sourceMappingURL=ConfigResolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigResolver.js","names":[],"sources":["../../src/config/ConfigResolver.ts"],"sourcesContent":["import type { TaskResult } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\nimport { ConfigError } from \"../errors/errors\"\nimport { Fs } from \"../fs/Fs\"\nimport { expandPath } from \"../path/PathExpander\"\n\nconst tryExpandPath = (candidate: string): string
|
|
1
|
+
{"version":3,"file":"ConfigResolver.js","names":["ConfigErrorConstructor"],"sources":["../../src/config/ConfigResolver.ts"],"sourcesContent":["import type { Either, TaskResult } from \"functype\"\nimport { Err, Left, List, Ok, Option, Right } from \"functype\"\n\nimport type { ConfigError } from \"../errors/errors\"\nimport { ConfigError as ConfigErrorConstructor } from \"../errors/errors\"\nimport { Fs } from \"../fs/Fs\"\nimport { expandPath } from \"../path/PathExpander\"\n\nconst tryExpandPath = (candidate: string): Option<string> => {\n const result = expandPath(candidate)\n return result.fold(\n () => Option<string>(undefined),\n (v) => Option(v),\n )\n}\n\nexport const ConfigResolver = {\n // Async methods — return TaskResult<T>\n\n resolve: async (options: { readonly candidates: readonly string[] }): TaskResult<Option<string>> => {\n for (const candidate of options.candidates) {\n const expanded = tryExpandPath(candidate)\n if (expanded.isNone()) continue\n\n const existsResult = await Fs.exists(expanded.orThrow())\n if (existsResult.isErr()) continue\n if (existsResult.value) {\n return Ok(expanded)\n }\n }\n return Ok(Option<string>(undefined))\n },\n\n resolveRequired: async (options: { readonly candidates: readonly string[] }): TaskResult<string> => {\n const result = await ConfigResolver.resolve(options)\n if (result.isErr()) return Err(result.error)\n\n const optValue = result.orThrow()\n if (optValue.isSome()) {\n return Ok(optValue.orThrow())\n }\n\n return Err(ConfigErrorConstructor(options.candidates))\n },\n\n resolveAll: async (options: { readonly candidates: readonly string[] }): TaskResult<List<string>> => {\n const found: readonly string[] = options.candidates.reduce<readonly string[]>((acc, candidate) => {\n const expanded = tryExpandPath(candidate)\n if (expanded.isNone()) return acc\n return [...acc, expanded.orThrow()]\n }, [])\n\n const results: string[] = []\n for (const expanded of found) {\n const existsResult = await Fs.exists(expanded)\n if (existsResult.isOk() && existsResult.value) {\n results.push(expanded)\n }\n }\n\n return Ok(List(results))\n },\n\n // Sync methods — return Either<ConfigError, T>\n\n resolveSync: (options: { readonly candidates: readonly string[] }): Option<string> => {\n for (const candidate of options.candidates) {\n const expanded = tryExpandPath(candidate)\n if (expanded.isNone()) continue\n if (Fs.existsSync(expanded.orThrow())) {\n return expanded\n }\n }\n return Option<string>(undefined)\n },\n\n resolveRequiredSync: (options: { readonly candidates: readonly string[] }): Either<ConfigError, string> => {\n const result = ConfigResolver.resolveSync(options)\n return result.fold(\n () => Left(ConfigErrorConstructor(options.candidates)),\n (v) => Right(v),\n )\n },\n\n resolveAllSync: (options: { readonly candidates: readonly string[] }): List<string> => {\n return List(\n options.candidates.reduce<readonly string[]>((acc, candidate) => {\n const expanded = tryExpandPath(candidate)\n if (expanded.isNone()) return acc\n const path = expanded.orThrow()\n return Fs.existsSync(path) ? [...acc, path] : acc\n }, []),\n )\n },\n}\n"],"mappings":"0NAQA,MAAM,EAAiB,GACN,EAAW,EAAU,CACtB,SACN,EAAe,IAAA,GAAU,CAC9B,GAAM,EAAO,EAAE,CACjB,CAGU,EAAiB,CAG5B,QAAS,KAAO,IAAoF,CAClG,IAAK,IAAM,KAAa,EAAQ,WAAY,CAC1C,IAAM,EAAW,EAAc,EAAU,CACzC,GAAI,EAAS,QAAQ,CAAE,SAEvB,IAAM,EAAe,MAAM,EAAG,OAAO,EAAS,SAAS,CAAC,CACpD,MAAa,OAAO,EACpB,EAAa,MACf,OAAO,EAAG,EAAS,CAGvB,OAAO,EAAG,EAAe,IAAA,GAAU,CAAC,EAGtC,gBAAiB,KAAO,IAA4E,CAClG,IAAM,EAAS,MAAM,EAAe,QAAQ,EAAQ,CACpD,GAAI,EAAO,OAAO,CAAE,OAAO,EAAI,EAAO,MAAM,CAE5C,IAAM,EAAW,EAAO,SAAS,CAKjC,OAJI,EAAS,QAAQ,CACZ,EAAG,EAAS,SAAS,CAAC,CAGxB,EAAIA,EAAuB,EAAQ,WAAW,CAAC,EAGxD,WAAY,KAAO,IAAkF,CACnG,IAAM,EAA2B,EAAQ,WAAW,QAA2B,EAAK,IAAc,CAChG,IAAM,EAAW,EAAc,EAAU,CAEzC,OADI,EAAS,QAAQ,CAAS,EACvB,CAAC,GAAG,EAAK,EAAS,SAAS,CAAC,EAClC,EAAE,CAAC,CAEA,EAAoB,EAAE,CAC5B,IAAK,IAAM,KAAY,EAAO,CAC5B,IAAM,EAAe,MAAM,EAAG,OAAO,EAAS,CAC1C,EAAa,MAAM,EAAI,EAAa,OACtC,EAAQ,KAAK,EAAS,CAI1B,OAAO,EAAG,EAAK,EAAQ,CAAC,EAK1B,YAAc,GAAwE,CACpF,IAAK,IAAM,KAAa,EAAQ,WAAY,CAC1C,IAAM,EAAW,EAAc,EAAU,CACrC,MAAS,QAAQ,EACjB,EAAG,WAAW,EAAS,SAAS,CAAC,CACnC,OAAO,EAGX,OAAO,EAAe,IAAA,GAAU,EAGlC,oBAAsB,GACL,EAAe,YAAY,EAAQ,CACpC,SACN,EAAKA,EAAuB,EAAQ,WAAW,CAAC,CACrD,GAAM,EAAM,EAAE,CAChB,CAGH,eAAiB,GACR,EACL,EAAQ,WAAW,QAA2B,EAAK,IAAc,CAC/D,IAAM,EAAW,EAAc,EAAU,CACzC,GAAI,EAAS,QAAQ,CAAE,OAAO,EAC9B,IAAM,EAAO,EAAS,SAAS,CAC/B,OAAO,EAAG,WAAW,EAAK,CAAG,CAAC,GAAG,EAAK,EAAK,CAAG,GAC7C,EAAE,CAAC,CACP,CAEJ"}
|
package/dist/env/Env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Env.js","names":[],"sources":["../../src/env/Env.ts"],"sourcesContent":["import type { Either } from \"functype\"\nimport { Left, List, Option, Right } from \"functype\"\n\nimport { EnvError } from \"../errors/errors\"\n\nconst EnvConstructor = (name: string): Option<string> => Option(process.env[name])\n\nconst EnvCompanion = {\n get: (name: string): Option<string> => Option(process.env[name]),\n\n getRequired: (name: string): Either<EnvError, string> => {\n const value = process.env[name]\n return value !== undefined ? Right(value) : Left(EnvError(name))\n },\n\n getOrDefault: (name: string, defaultValue: string): string => process.env[name] ?? defaultValue,\n\n has: (name: string): boolean => process.env[name] !== undefined,\n\n entries: (): List<readonly [string, string]> => {\n const pairs: Array<readonly [string, string]
|
|
1
|
+
{"version":3,"file":"Env.js","names":[],"sources":["../../src/env/Env.ts"],"sourcesContent":["import type { Either } from \"functype\"\nimport { Left, List, Option, Right } from \"functype\"\n\nimport { EnvError } from \"../errors/errors\"\n\nconst EnvConstructor = (name: string): Option<string> => Option(process.env[name])\n\nconst EnvCompanion = {\n get: (name: string): Option<string> => Option(process.env[name]),\n\n getRequired: (name: string): Either<EnvError, string> => {\n const value = process.env[name]\n return value !== undefined ? Right(value) : Left(EnvError(name))\n },\n\n getOrDefault: (name: string, defaultValue: string): string => process.env[name] ?? defaultValue,\n\n has: (name: string): boolean => process.env[name] !== undefined,\n\n entries: (): List<readonly [string, string]> => {\n const pairs: Readonly<Array<readonly [string, string]>> = Object.entries(process.env)\n .filter((entry): entry is [string, string] => entry[1] !== undefined)\n .map(([k, v]) => [k, v] as const)\n return List(pairs)\n },\n}\n\nexport const Env: typeof EnvConstructor & typeof EnvCompanion = Object.assign(EnvConstructor, EnvCompanion)\n"],"mappings":"gHA2BA,MAAa,EAAmD,OAAO,OAtB/C,GAAiC,EAAO,QAAQ,IAAI,GAAM,CAE7D,CACnB,IAAM,GAAiC,EAAO,QAAQ,IAAI,GAAM,CAEhE,YAAc,GAA2C,CACvD,IAAM,EAAQ,QAAQ,IAAI,GAC1B,OAAO,IAAU,IAAA,GAA2B,EAAK,EAAS,EAAK,CAAC,CAAnC,EAAM,EAAM,EAG3C,cAAe,EAAc,IAAiC,QAAQ,IAAI,IAAS,EAEnF,IAAM,GAA0B,QAAQ,IAAI,KAAU,IAAA,GAEtD,YAIS,EAHmD,OAAO,QAAQ,QAAQ,IAAI,CAClF,OAAQ,GAAqC,EAAM,KAAO,IAAA,GAAU,CACpE,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,EAAE,CAAU,CACjB,CAErB,CAE0G"}
|
package/dist/fs/Fs.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FsError } from "../errors/errors.js";
|
|
2
|
+
import { Either, List, Option, TaskResult } from "functype";
|
|
2
3
|
|
|
3
4
|
//#region src/fs/Fs.d.ts
|
|
4
5
|
declare const Fs: {
|
|
5
|
-
exists: (
|
|
6
|
-
readFile: (
|
|
7
|
-
readFileOpt: (
|
|
8
|
-
readdir: (
|
|
6
|
+
exists: (p: string) => TaskResult<boolean>;
|
|
7
|
+
readFile: (p: string, encoding?: BufferEncoding) => TaskResult<string>;
|
|
8
|
+
readFileOpt: (p: string, encoding?: BufferEncoding) => TaskResult<Option<string>>;
|
|
9
|
+
readdir: (p: string) => TaskResult<List<string>>;
|
|
10
|
+
existsSync: (p: string) => boolean;
|
|
11
|
+
readFileSync: (p: string, encoding?: BufferEncoding) => Either<FsError, string>;
|
|
12
|
+
readFileOptSync: (p: string, encoding?: BufferEncoding) => Either<FsError, Option<string>>;
|
|
13
|
+
readdirSync: (p: string) => Either<FsError, List<string>>;
|
|
9
14
|
};
|
|
10
15
|
//#endregion
|
|
11
16
|
export { Fs };
|
package/dist/fs/Fs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{FsError as e}from"../errors/errors.js";import{Err as t,
|
|
1
|
+
import{FsError as e}from"../errors/errors.js";import{Err as t,Left as n,List as r,Ok as i,Option as a,Right as o}from"functype";import*as s from"node:fs";import*as c from"node:fs/promises";const l=(t,n,r)=>e(t,n,r instanceof Error?r:Error(String(r))),u={exists:async e=>{try{return await c.access(e),i(!0)}catch{return i(!1)}},readFile:async(e,n=`utf8`)=>{try{return i(await c.readFile(e,{encoding:n}))}catch(n){return t(l(e,`readFile`,n))}},readFileOpt:async(e,n=`utf8`)=>{try{return i(a(await c.readFile(e,{encoding:n})))}catch(n){return n instanceof Error&&`code`in n&&n.code===`ENOENT`?i(a(void 0)):t(l(e,`readFile`,n))}},readdir:async e=>{try{return i(r(await c.readdir(e)))}catch(n){return t(l(e,`readdir`,n))}},existsSync:e=>{try{return s.accessSync(e),!0}catch{return!1}},readFileSync:(e,t=`utf8`)=>{try{return o(s.readFileSync(e,{encoding:t}))}catch(t){return n(l(e,`readFileSync`,t))}},readFileOptSync:(e,t=`utf8`)=>{try{return o(a(s.readFileSync(e,{encoding:t})))}catch(t){return t instanceof Error&&`code`in t&&t.code===`ENOENT`?o(a(void 0)):n(l(e,`readFileOptSync`,t))}},readdirSync:e=>{try{return o(r(s.readdirSync(e)))}catch(t){return n(l(e,`readdirSync`,t))}}};export{u as Fs};
|
|
2
2
|
//# sourceMappingURL=Fs.js.map
|
package/dist/fs/Fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fs.js","names":[],"sources":["../../src/fs/Fs.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\"\n\nimport type { TaskResult } from \"functype\"\nimport { Err, List, Ok, Option } from \"functype\"\n\nimport { FsError } from \"../errors/errors\"\n\nexport const Fs = {\n exists: async (
|
|
1
|
+
{"version":3,"file":"Fs.js","names":[],"sources":["../../src/fs/Fs.ts"],"sourcesContent":["import * as fsSync from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\n\nimport type { Either, TaskResult } from \"functype\"\nimport { Err, Left, List, Ok, Option, Right } from \"functype\"\n\nimport { FsError } from \"../errors/errors\"\n\nconst toFsError = (p: string, op: string, error: unknown): FsError =>\n FsError(p, op, error instanceof Error ? error : new Error(String(error)))\n\nexport const Fs = {\n // Async methods — return TaskResult<T>\n\n exists: async (p: string): TaskResult<boolean> => {\n try {\n await fs.access(p)\n return Ok(true)\n } catch {\n return Ok(false)\n }\n },\n\n readFile: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<string> => {\n try {\n return Ok(await fs.readFile(p, { encoding }))\n } catch (error) {\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n readFileOpt: async (p: string, encoding: BufferEncoding = \"utf8\"): TaskResult<Option<string>> => {\n try {\n return Ok(Option(await fs.readFile(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Ok(Option<string>(undefined))\n }\n return Err(toFsError(p, \"readFile\", error))\n }\n },\n\n readdir: async (p: string): TaskResult<List<string>> => {\n try {\n return Ok(List(await fs.readdir(p)))\n } catch (error) {\n return Err(toFsError(p, \"readdir\", error))\n }\n },\n\n // Sync methods — return Either<FsError, T>\n\n existsSync: (p: string): boolean => {\n try {\n fsSync.accessSync(p)\n return true\n } catch {\n return false\n }\n },\n\n readFileSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, string> => {\n try {\n return Right(fsSync.readFileSync(p, { encoding }))\n } catch (error) {\n return Left(toFsError(p, \"readFileSync\", error))\n }\n },\n\n readFileOptSync: (p: string, encoding: BufferEncoding = \"utf8\"): Either<FsError, Option<string>> => {\n try {\n return Right(Option(fsSync.readFileSync(p, { encoding })))\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return Right(Option<string>(undefined))\n }\n return Left(toFsError(p, \"readFileOptSync\", error))\n }\n },\n\n readdirSync: (p: string): Either<FsError, List<string>> => {\n try {\n return Right(List(fsSync.readdirSync(p)))\n } catch (error) {\n return Left(toFsError(p, \"readdirSync\", error))\n }\n },\n}\n"],"mappings":"6LAQA,MAAM,GAAa,EAAW,EAAY,IACxC,EAAQ,EAAG,EAAI,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAAC,CAE9D,EAAK,CAGhB,OAAQ,KAAO,IAAmC,CAChD,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAE,CACX,EAAG,GAAK,MACT,CACN,OAAO,EAAG,GAAM,GAIpB,SAAU,MAAO,EAAW,EAA2B,SAA+B,CACpF,GAAI,CACF,OAAO,EAAG,MAAM,EAAG,SAAS,EAAG,CAAE,WAAU,CAAC,CAAC,OACtC,EAAO,CACd,OAAO,EAAI,EAAU,EAAG,WAAY,EAAM,CAAC,GAI/C,YAAa,MAAO,EAAW,EAA2B,SAAuC,CAC/F,GAAI,CACF,OAAO,EAAG,EAAO,MAAM,EAAG,SAAS,EAAG,CAAE,WAAU,CAAC,CAAC,CAAC,OAC9C,EAAO,CAId,OAHI,aAAiB,OAAS,SAAU,GAAS,EAAM,OAAS,SACvD,EAAG,EAAe,IAAA,GAAU,CAAC,CAE/B,EAAI,EAAU,EAAG,WAAY,EAAM,CAAC,GAI/C,QAAS,KAAO,IAAwC,CACtD,GAAI,CACF,OAAO,EAAG,EAAK,MAAM,EAAG,QAAQ,EAAE,CAAC,CAAC,OAC7B,EAAO,CACd,OAAO,EAAI,EAAU,EAAG,UAAW,EAAM,CAAC,GAM9C,WAAa,GAAuB,CAClC,GAAI,CAEF,OADA,EAAO,WAAW,EAAE,CACb,QACD,CACN,MAAO,KAIX,cAAe,EAAW,EAA2B,SAAoC,CACvF,GAAI,CACF,OAAO,EAAM,EAAO,aAAa,EAAG,CAAE,WAAU,CAAC,CAAC,OAC3C,EAAO,CACd,OAAO,EAAK,EAAU,EAAG,eAAgB,EAAM,CAAC,GAIpD,iBAAkB,EAAW,EAA2B,SAA4C,CAClG,GAAI,CACF,OAAO,EAAM,EAAO,EAAO,aAAa,EAAG,CAAE,WAAU,CAAC,CAAC,CAAC,OACnD,EAAO,CAId,OAHI,aAAiB,OAAS,SAAU,GAAS,EAAM,OAAS,SACvD,EAAM,EAAe,IAAA,GAAU,CAAC,CAElC,EAAK,EAAU,EAAG,kBAAmB,EAAM,CAAC,GAIvD,YAAc,GAA6C,CACzD,GAAI,CACF,OAAO,EAAM,EAAK,EAAO,YAAY,EAAE,CAAC,CAAC,OAClC,EAAO,CACd,OAAO,EAAK,EAAU,EAAG,cAAe,EAAM,CAAC,GAGpD"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { ConfigResolver } from "./config/ConfigResolver.js";
|
|
2
1
|
import { ConfigError, EnvError, FsError, OsError, PathError } from "./errors/errors.js";
|
|
2
|
+
import { ConfigResolver } from "./config/ConfigResolver.js";
|
|
3
3
|
import { Env } from "./env/Env.js";
|
|
4
4
|
import { Fs } from "./fs/Fs.js";
|
|
5
5
|
import { Path, expandPath, expandTilde, expandVars } from "./path/PathExpander.js";
|
|
6
|
-
import { Platform, UserInfo } from "./platform/Platform.js";
|
|
7
|
-
export { ConfigError, ConfigResolver, Env, EnvError, Fs, FsError, type OsError, Path, PathError, Platform, type UserInfo, expandPath, expandTilde, expandVars };
|
|
6
|
+
import { CloudProvider, CloudStorageDir, Platform, UserInfo } from "./platform/Platform.js";
|
|
7
|
+
export { type CloudProvider, type CloudStorageDir, ConfigError, ConfigResolver, Env, EnvError, Fs, FsError, type OsError, Path, PathError, Platform, type UserInfo, expandPath, expandTilde, expandVars };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Option } from "functype";
|
|
1
|
+
import { List, Option } from "functype";
|
|
2
2
|
|
|
3
3
|
//#region src/platform/Platform.d.ts
|
|
4
4
|
type UserInfo = {
|
|
@@ -8,6 +8,12 @@ type UserInfo = {
|
|
|
8
8
|
readonly shell: string | null;
|
|
9
9
|
readonly homedir: string;
|
|
10
10
|
};
|
|
11
|
+
type CloudProvider = "onedrive" | "gdrive" | "dropbox" | "icloud";
|
|
12
|
+
type CloudStorageDir = {
|
|
13
|
+
readonly provider: CloudProvider;
|
|
14
|
+
readonly path: string;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
};
|
|
11
17
|
declare const Platform: {
|
|
12
18
|
os: () => "darwin" | "linux" | "win32" | string;
|
|
13
19
|
arch: () => string;
|
|
@@ -25,7 +31,10 @@ declare const Platform: {
|
|
|
25
31
|
isWSL: () => boolean;
|
|
26
32
|
isCI: () => boolean;
|
|
27
33
|
isContainer: () => boolean;
|
|
34
|
+
windowsHomeDir: () => Option<string>;
|
|
35
|
+
homeDirs: () => List<string>;
|
|
36
|
+
cloudStorageDirs: (home?: string) => List<CloudStorageDir>;
|
|
28
37
|
};
|
|
29
38
|
//#endregion
|
|
30
|
-
export { Platform, UserInfo };
|
|
39
|
+
export { CloudProvider, CloudStorageDir, Platform, UserInfo };
|
|
31
40
|
//# sourceMappingURL=Platform.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Option as
|
|
1
|
+
import{List as e,Option as t}from"functype";import*as n from"node:fs";import*as r from"node:os";import*as i from"node:path";import{execSync as a}from"node:child_process";const o=()=>{try{return n.statSync(`/.dockerenv`),!0}catch{return!1}},s=()=>{try{return n.readFileSync(`/proc/self/cgroup`,`utf8`).includes(`docker`)}catch{return!1}},c=e=>{let t={};return()=>(`value`in t||(t.value=e()),t.value)},l=c(()=>o()||s()),u=c(()=>{try{return n.readFileSync(`/proc/self/cgroup`,`utf8`).includes(`kube`)}catch{return!1}}),d=c(()=>{try{let e=n.readFileSync(`/proc/version`,`utf8`);return e.includes(`Microsoft`)||e.includes(`WSL`)}catch{return!1}}),f=c(()=>process.env.CI!==void 0||process.env.GITHUB_ACTIONS!==void 0||process.env.GITLAB_CI!==void 0||process.env.CIRCLECI!==void 0||process.env.JENKINS_URL!==void 0||process.env.TRAVIS!==void 0||process.env.BUILDKITE!==void 0),p=new Set([`all users`,`default`,`default user`,`public`]),m=e=>{let t=e.toLowerCase();return!!(p.has(t)||t.startsWith(`defaultuser`)||t.startsWith(`desktop.`)||t.startsWith(`wsiaccount`))},h=e=>{try{return n.statSync(e).isDirectory()}catch{return!1}},g=e=>{try{return n.readdirSync(e).filter(t=>!m(t)&&h(i.join(e,t)))}catch{return}},_=(e,n)=>{try{let e=a(`cmd.exe /c echo %USERPROFILE%`,{timeout:3e3,encoding:`utf8`}).trim().match(/^([A-Za-z]):\\(.*)$/);if(e){let n=`/mnt/${e[1].toLowerCase()}/${e[2].replace(/\\/g,`/`)}`;if(h(n))return t(n)}}catch{}return t(n)},v=c(()=>{if(!d())return t(void 0);let e=`/mnt/c/Users`,n=g(e);return n===void 0?t(void 0):n.length===1?t(i.join(e,n[0])):n.length>1?_(e,i.join(e,n[0])):t(void 0)}),y=e=>{if(e===`OneDrive`||e.startsWith(`OneDrive `)||e.startsWith(`OneDrive-`))return{provider:`onedrive`,label:e};if(e===`Google Drive`)return{provider:`gdrive`,label:e};if(e===`Dropbox`)return{provider:`dropbox`,label:e}},b=e=>{let t=[];try{let r=n.readdirSync(e);for(let n of r){let r=i.join(e,n),a=y(n);a&&h(r)&&t.push({provider:a.provider,path:r,label:a.label})}}catch{}let r=i.join(e,`Library`,`CloudStorage`);try{let e=n.readdirSync(r);for(let n of e){let e=i.join(r,n);h(e)&&(n.startsWith(`OneDrive`)?t.push({provider:`onedrive`,path:e,label:n}):n.startsWith(`GoogleDrive`)&&t.push({provider:`gdrive`,path:e,label:n}))}}catch{}let a=i.join(e,`Library`,`Mobile Documents`,`com~apple~CloudDocs`);return h(a)&&t.push({provider:`icloud`,path:a,label:`iCloud Drive`}),t},x={os:()=>process.platform,arch:()=>process.arch,homeDir:()=>r.homedir(),tmpDir:()=>r.tmpdir(),hostname:()=>r.hostname(),eol:()=>r.EOL,pathSep:()=>i.sep,isWindows:()=>process.platform===`win32`,isMac:()=>process.platform===`darwin`,isLinux:()=>process.platform===`linux`,userInfo:()=>{try{let e=r.userInfo();return t({username:e.username,uid:e.uid,gid:e.gid,shell:e.shell,homedir:e.homedir})}catch{return t(void 0)}},isDocker:()=>l(),isKubernetes:()=>u(),isWSL:()=>d(),isCI:()=>f(),isContainer:()=>x.isDocker()||x.isKubernetes(),windowsHomeDir:()=>v(),homeDirs:()=>{let t=[r.homedir()];return x.windowsHomeDir().forEach(e=>{e!==r.homedir()&&t.push(e)}),e(t)},cloudStorageDirs:t=>{if(t!==void 0)return e(b(t));let n=[],r=new Set;return x.homeDirs().forEach(e=>{for(let t of b(e))r.has(t.path)||(r.add(t.path),n.push(t))}),e(n)}};export{x as Platform};
|
|
2
2
|
//# sourceMappingURL=Platform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.js","names":[],"sources":["../../src/platform/Platform.ts"],"sourcesContent":["import * as fs from \"node:fs\"\nimport * as os from \"node:os\"\nimport * as path from \"node:path\"\n\nimport { Option } from \"functype\"\n\nexport type UserInfo = {\n readonly username: string\n readonly uid: number\n readonly gid: number\n readonly shell: string | null\n readonly homedir: string\n}\n\nconst hasDockerEnv = (): boolean => {\n try {\n fs.statSync(\"/.dockerenv\")\n return true\n } catch {\n return false\n }\n}\nconst hasDockerCGroup = (): boolean => {\n try {\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"docker\")\n } catch {\n return false\n }\n}\n\nconst memo = <T>(fn: () => T): (() => T) => {\n const cache: { value?: T } = {}\n return () => {\n if (!(\"value\" in cache)) {\n cache.value = fn()\n }\n return cache.value as T\n }\n}\n\nconst cachedIsDocker = memo(() => hasDockerEnv() || hasDockerCGroup())\nconst cachedIsKube = memo(() => {\n try {\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"kube\")\n } catch {\n return false\n }\n})\nconst cachedIsWSL = memo(() => {\n try {\n const version = fs.readFileSync(\"/proc/version\", \"utf8\")\n return version.includes(\"Microsoft\") || version.includes(\"WSL\")\n } catch {\n return false\n }\n})\nconst cachedIsCI = memo(\n () =>\n process.env[\"CI\"] !== undefined ||\n process.env[\"GITHUB_ACTIONS\"] !== undefined ||\n process.env[\"GITLAB_CI\"] !== undefined ||\n process.env[\"CIRCLECI\"] !== undefined ||\n process.env[\"JENKINS_URL\"] !== undefined ||\n process.env[\"TRAVIS\"] !== undefined ||\n process.env[\"BUILDKITE\"] !== undefined,\n)\n\nexport const Platform = {\n os: (): \"darwin\" | \"linux\" | \"win32\" | string => process.platform,\n arch: (): string => process.arch,\n homeDir: (): string => os.homedir(),\n tmpDir: (): string => os.tmpdir(),\n hostname: (): string => os.hostname(),\n eol: (): string => os.EOL,\n pathSep: (): string => path.sep,\n\n isWindows: (): boolean => process.platform === \"win32\",\n isMac: (): boolean => process.platform === \"darwin\",\n isLinux: (): boolean => process.platform === \"linux\",\n\n userInfo: (): Option<UserInfo> => {\n try {\n const info = os.userInfo()\n return Option({\n username: info.username,\n uid: info.uid,\n gid: info.gid,\n shell: info.shell,\n homedir: info.homedir,\n })\n } catch {\n return Option<UserInfo>(undefined)\n }\n },\n\n isDocker: (): boolean => cachedIsDocker(),\n isKubernetes: (): boolean => cachedIsKube(),\n isWSL: (): boolean => cachedIsWSL(),\n isCI: (): boolean => cachedIsCI(),\n\n isContainer: (): boolean => Platform.isDocker() || Platform.isKubernetes(),\n}\n"],"mappings":"kHAcA,MAAM,MAA8B,CAClC,GAAI,CAEF,OADA,EAAG,SAAS,cAAc,CACnB,QACD,CACN,MAAO,KAGL,MAAiC,CACrC,GAAI,CACF,OAAO,EAAG,aAAa,oBAAqB,OAAO,CAAC,SAAS,SAAS,MAChE,CACN,MAAO,KAIL,EAAW,GAA2B,CAC1C,IAAM,EAAuB,EAAE,CAC/B,WACQ,UAAW,IACf,EAAM,MAAQ,GAAI,EAEb,EAAM,QAIX,EAAiB,MAAW,GAAc,EAAI,GAAiB,CAAC,CAChE,EAAe,MAAW,CAC9B,GAAI,CACF,OAAO,EAAG,aAAa,oBAAqB,OAAO,CAAC,SAAS,OAAO,MAC9D,CACN,MAAO,KAET,CACI,EAAc,MAAW,CAC7B,GAAI,CACF,IAAM,EAAU,EAAG,aAAa,gBAAiB,OAAO,CACxD,OAAO,EAAQ,SAAS,YAAY,EAAI,EAAQ,SAAS,MAAM,MACzD,CACN,MAAO,KAET,CACI,EAAa,MAEf,QAAQ,IAAI,KAAU,IAAA,IACtB,QAAQ,IAAI,iBAAsB,IAAA,IAClC,QAAQ,IAAI,YAAiB,IAAA,IAC7B,QAAQ,IAAI,WAAgB,IAAA,IAC5B,QAAQ,IAAI,cAAmB,IAAA,IAC/B,QAAQ,IAAI,SAAc,IAAA,IAC1B,QAAQ,IAAI,YAAiB,IAAA,GAChC,CAEY,EAAW,CACtB,OAAiD,QAAQ,SACzD,SAAoB,QAAQ,KAC5B,YAAuB,EAAG,SAAS,CACnC,WAAsB,EAAG,QAAQ,CACjC,aAAwB,EAAG,UAAU,CACrC,QAAmB,EAAG,IACtB,YAAuB,EAAK,IAE5B,cAA0B,QAAQ,WAAa,QAC/C,UAAsB,QAAQ,WAAa,SAC3C,YAAwB,QAAQ,WAAa,QAE7C,aAAkC,CAChC,GAAI,CACF,IAAM,EAAO,EAAG,UAAU,CAC1B,OAAO,EAAO,CACZ,SAAU,EAAK,SACf,IAAK,EAAK,IACV,IAAK,EAAK,IACV,MAAO,EAAK,MACZ,QAAS,EAAK,QACf,CAAC,MACI,CACN,OAAO,EAAiB,IAAA,GAAU,GAItC,aAAyB,GAAgB,CACzC,iBAA6B,GAAc,CAC3C,UAAsB,GAAa,CACnC,SAAqB,GAAY,CAEjC,gBAA4B,EAAS,UAAU,EAAI,EAAS,cAAc,CAC3E"}
|
|
1
|
+
{"version":3,"file":"Platform.js","names":[],"sources":["../../src/platform/Platform.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport * as fs from \"node:fs\"\nimport * as os from \"node:os\"\nimport * as path from \"node:path\"\n\nimport { List, Option } from \"functype\"\n\nexport type UserInfo = {\n readonly username: string\n readonly uid: number\n readonly gid: number\n readonly shell: string | null\n readonly homedir: string\n}\n\nexport type CloudProvider = \"onedrive\" | \"gdrive\" | \"dropbox\" | \"icloud\"\n\nexport type CloudStorageDir = {\n readonly provider: CloudProvider\n readonly path: string\n readonly label: string\n}\n\nconst hasDockerEnv = (): boolean => {\n try {\n fs.statSync(\"/.dockerenv\")\n return true\n } catch {\n return false\n }\n}\nconst hasDockerCGroup = (): boolean => {\n try {\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"docker\")\n } catch {\n return false\n }\n}\n\nconst memo = <T>(fn: () => T): (() => T) => {\n const cache: { value?: T } = {}\n return () => {\n if (!(\"value\" in cache)) {\n cache.value = fn()\n }\n return cache.value as T\n }\n}\n\nconst cachedIsDocker = memo(() => hasDockerEnv() || hasDockerCGroup())\nconst cachedIsKube = memo(() => {\n try {\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"kube\")\n } catch {\n return false\n }\n})\nconst cachedIsWSL = memo(() => {\n try {\n const version = fs.readFileSync(\"/proc/version\", \"utf8\")\n return version.includes(\"Microsoft\") || version.includes(\"WSL\")\n } catch {\n return false\n }\n})\nconst cachedIsCI = memo(\n () =>\n process.env[\"CI\"] !== undefined ||\n process.env[\"GITHUB_ACTIONS\"] !== undefined ||\n process.env[\"GITLAB_CI\"] !== undefined ||\n process.env[\"CIRCLECI\"] !== undefined ||\n process.env[\"JENKINS_URL\"] !== undefined ||\n process.env[\"TRAVIS\"] !== undefined ||\n process.env[\"BUILDKITE\"] !== undefined,\n)\n\nconst SYSTEM_ACCOUNTS = new Set([\"all users\", \"default\", \"default user\", \"public\"])\n\nconst isSystemAccount = (name: string): boolean => {\n const lower = name.toLowerCase()\n if (SYSTEM_ACCOUNTS.has(lower)) return true\n if (lower.startsWith(\"defaultuser\") || lower.startsWith(\"desktop.\") || lower.startsWith(\"wsiaccount\")) return true\n return false\n}\n\nconst isDirectory = (p: string): boolean => {\n try {\n return fs.statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n\nconst readRealUsers = (usersDir: string): readonly string[] | undefined => {\n try {\n const entries = fs.readdirSync(usersDir)\n return entries.filter((name) => !isSystemAccount(name) && isDirectory(path.join(usersDir, name)))\n } catch {\n return undefined\n }\n}\n\nconst resolveViaCmdExe = (usersDir: string, fallback: string): Option<string> => {\n try {\n const raw = execSync(\"cmd.exe /c echo %USERPROFILE%\", { timeout: 3000, encoding: \"utf8\" }).trim()\n // Convert Windows path C:\\Users\\foo → /mnt/c/Users/foo\n const match = raw.match(/^([A-Za-z]):\\\\(.*)$/)\n if (match) {\n const drive = match[1].toLowerCase()\n const rest = match[2].replace(/\\\\/g, \"/\")\n const wslPath = `/mnt/${drive}/${rest}`\n if (isDirectory(wslPath)) {\n return Option(wslPath)\n }\n }\n } catch {\n // cmd.exe failed, fall through to best guess\n }\n return Option(fallback)\n}\n\nconst resolveWindowsHome = (): Option<string> => {\n if (!cachedIsWSL()) return Option<string>(undefined)\n\n const usersDir = \"/mnt/c/Users\"\n const realUsers = readRealUsers(usersDir)\n if (realUsers === undefined) return Option<string>(undefined)\n\n if (realUsers.length === 1) {\n return Option(path.join(usersDir, realUsers[0]))\n }\n\n if (realUsers.length > 1) {\n return resolveViaCmdExe(usersDir, path.join(usersDir, realUsers[0]))\n }\n\n return Option<string>(undefined)\n}\n\nconst cachedWindowsHome = memo(resolveWindowsHome)\n\nconst detectCloudProvider = (name: string): { provider: CloudProvider; label: string } | undefined => {\n if (name === \"OneDrive\" || name.startsWith(\"OneDrive \") || name.startsWith(\"OneDrive-\")) {\n return { provider: \"onedrive\", label: name }\n }\n if (name === \"Google Drive\") {\n return { provider: \"gdrive\", label: name }\n }\n if (name === \"Dropbox\") {\n return { provider: \"dropbox\", label: name }\n }\n return undefined\n}\n\nconst scanCloudStorageDirs = (home: string): CloudStorageDir[] => {\n const results: CloudStorageDir[] = []\n\n // Direct home children\n try {\n const entries = fs.readdirSync(home)\n for (const name of entries) {\n const fullPath = path.join(home, name)\n const detection = detectCloudProvider(name)\n if (detection && isDirectory(fullPath)) {\n results.push({ provider: detection.provider, path: fullPath, label: detection.label })\n }\n }\n } catch {\n // home dir may not exist or be readable\n }\n\n // macOS Library/CloudStorage children\n const cloudStoragePath = path.join(home, \"Library\", \"CloudStorage\")\n try {\n const entries = fs.readdirSync(cloudStoragePath)\n for (const name of entries) {\n const fullPath = path.join(cloudStoragePath, name)\n if (!isDirectory(fullPath)) continue\n if (name.startsWith(\"OneDrive\")) {\n results.push({ provider: \"onedrive\", path: fullPath, label: name })\n } else if (name.startsWith(\"GoogleDrive\")) {\n results.push({ provider: \"gdrive\", path: fullPath, label: name })\n }\n }\n } catch {\n // Library/CloudStorage may not exist\n }\n\n // macOS iCloud fixed path\n const icloudPath = path.join(home, \"Library\", \"Mobile Documents\", \"com~apple~CloudDocs\")\n if (isDirectory(icloudPath)) {\n results.push({ provider: \"icloud\", path: icloudPath, label: \"iCloud Drive\" })\n }\n\n return results\n}\n\nexport const Platform = {\n os: (): \"darwin\" | \"linux\" | \"win32\" | string => process.platform,\n arch: (): string => process.arch,\n homeDir: (): string => os.homedir(),\n tmpDir: (): string => os.tmpdir(),\n hostname: (): string => os.hostname(),\n eol: (): string => os.EOL,\n pathSep: (): string => path.sep,\n\n isWindows: (): boolean => process.platform === \"win32\",\n isMac: (): boolean => process.platform === \"darwin\",\n isLinux: (): boolean => process.platform === \"linux\",\n\n userInfo: (): Option<UserInfo> => {\n try {\n const info = os.userInfo()\n return Option({\n username: info.username,\n uid: info.uid,\n gid: info.gid,\n shell: info.shell,\n homedir: info.homedir,\n })\n } catch {\n return Option<UserInfo>(undefined)\n }\n },\n\n isDocker: (): boolean => cachedIsDocker(),\n isKubernetes: (): boolean => cachedIsKube(),\n isWSL: (): boolean => cachedIsWSL(),\n isCI: (): boolean => cachedIsCI(),\n\n isContainer: (): boolean => Platform.isDocker() || Platform.isKubernetes(),\n\n windowsHomeDir: (): Option<string> => cachedWindowsHome(),\n\n homeDirs: (): List<string> => {\n const homes: string[] = [os.homedir()]\n Platform.windowsHomeDir().forEach((winHome) => {\n if (winHome !== os.homedir()) {\n homes.push(winHome)\n }\n })\n return List(homes)\n },\n\n cloudStorageDirs: (home?: string): List<CloudStorageDir> => {\n if (home !== undefined) {\n return List(scanCloudStorageDirs(home))\n }\n const allDirs: CloudStorageDir[] = []\n const seenPaths = new Set<string>()\n Platform.homeDirs().forEach((h) => {\n for (const dir of scanCloudStorageDirs(h)) {\n if (!seenPaths.has(dir.path)) {\n seenPaths.add(dir.path)\n allDirs.push(dir)\n }\n }\n })\n return List(allDirs)\n },\n}\n"],"mappings":"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"}
|
package/dist/platform/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Platform, UserInfo } from "./Platform.js";
|
|
2
|
-
export { Platform, type UserInfo };
|
|
1
|
+
import { CloudProvider, CloudStorageDir, Platform, UserInfo } from "./Platform.js";
|
|
2
|
+
export { type CloudProvider, type CloudStorageDir, Platform, type UserInfo };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "functype-os",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Functional OS utilities using functype data structures — env vars, path expansion, file ops, platform detection",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"functype",
|
|
@@ -18,11 +18,25 @@
|
|
|
18
18
|
"type": "git",
|
|
19
19
|
"url": "https://github.com/jordanburke/functype-os"
|
|
20
20
|
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"validate": "ts-builds validate",
|
|
23
|
+
"format": "ts-builds format",
|
|
24
|
+
"format:check": "ts-builds format:check",
|
|
25
|
+
"lint": "ts-builds lint",
|
|
26
|
+
"lint:check": "ts-builds lint:check",
|
|
27
|
+
"typecheck": "ts-builds typecheck",
|
|
28
|
+
"test": "ts-builds test",
|
|
29
|
+
"test:watch": "ts-builds test:watch",
|
|
30
|
+
"test:coverage": "ts-builds test:coverage",
|
|
31
|
+
"build": "ts-builds build",
|
|
32
|
+
"dev": "ts-builds dev",
|
|
33
|
+
"prepublishOnly": "pnpm validate"
|
|
34
|
+
},
|
|
21
35
|
"peerDependencies": {
|
|
22
36
|
"functype": ">=0.49.0"
|
|
23
37
|
},
|
|
24
38
|
"devDependencies": {
|
|
25
|
-
"@types/node": "^24.
|
|
39
|
+
"@types/node": "^24.12.0",
|
|
26
40
|
"eslint-config-prettier": "^10.1.8",
|
|
27
41
|
"functype": "^0.49.0",
|
|
28
42
|
"ts-builds": "^2.5.0",
|
|
@@ -75,20 +89,8 @@
|
|
|
75
89
|
"dist"
|
|
76
90
|
],
|
|
77
91
|
"prettier": "ts-builds/prettier",
|
|
92
|
+
"packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
|
|
78
93
|
"engines": {
|
|
79
94
|
"node": ">=18.0.0"
|
|
80
|
-
},
|
|
81
|
-
"scripts": {
|
|
82
|
-
"validate": "ts-builds validate",
|
|
83
|
-
"format": "ts-builds format",
|
|
84
|
-
"format:check": "ts-builds format:check",
|
|
85
|
-
"lint": "ts-builds lint",
|
|
86
|
-
"lint:check": "ts-builds lint:check",
|
|
87
|
-
"typecheck": "ts-builds typecheck",
|
|
88
|
-
"test": "ts-builds test",
|
|
89
|
-
"test:watch": "ts-builds test:watch",
|
|
90
|
-
"test:coverage": "ts-builds test:coverage",
|
|
91
|
-
"build": "ts-builds build",
|
|
92
|
-
"dev": "ts-builds dev"
|
|
93
95
|
}
|
|
94
|
-
}
|
|
96
|
+
}
|