@yongdall/load-configuration 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.mts CHANGED
@@ -1,4 +1,10 @@
1
1
  //#region cli/load-configuration/index.d.mts
2
+ /**
3
+ * @template {object} T
4
+ * @param {string} path
5
+ * @returns {Promise<[string, T] | null>}
6
+ */
7
+ declare function loadConfigurationWithPath<T extends object>(path: string): Promise<[string, T] | null>;
2
8
  /**
3
9
  * @template {object} T
4
10
  * @param {string} path
@@ -6,4 +12,4 @@
6
12
  */
7
13
  declare function loadConfiguration<T extends object>(path: string): Promise<T | null>;
8
14
  //#endregion
9
- export { loadConfiguration as default };
15
+ export { loadConfiguration as default, loadConfigurationWithPath };
package/index.mjs CHANGED
@@ -54,23 +54,41 @@ const loaders = [
54
54
  /**
55
55
  * @template {object} T
56
56
  * @param {string} path
57
- * @returns {Promise<T | null>}
57
+ * @returns {Promise<[path: string, loader: <T>(path: string) => Promise<T | null>] | null>}
58
58
  */
59
- async function loadConfiguration(path) {
59
+ async function find(path) {
60
60
  const ext = (await fsPromises.stat(path).catch(() => null))?.isFile() ? pathFn.extname(path).toLowerCase() : "";
61
61
  let loader = loaders.find((v) => v[0] === ext)?.[1];
62
- if (!loader) for (const [e, l] of loaders) {
62
+ if (loader) return [path, loader];
63
+ for (const [e, l] of loaders) {
63
64
  const p = path + e;
64
- if ((await fsPromises.stat(p).catch(() => null))?.isFile()) {
65
- loader = l;
66
- path = p;
67
- break;
68
- }
65
+ if ((await fsPromises.stat(p).catch(() => null))?.isFile()) return [p, l];
69
66
  }
70
- if (!loader) return null;
71
- return loader(path).then((v) => typeof v === "object" ? v : null);
67
+ return null;
68
+ }
69
+ /**
70
+ * @template {object} T
71
+ * @param {string} path
72
+ * @returns {Promise<[string, T] | null>}
73
+ */
74
+ async function loadConfigurationWithPath(path) {
75
+ const result = await find(path);
76
+ if (!result) return null;
77
+ const [filepath, loader] = result;
78
+ return Promise.all([fsPromises.realpath(filepath), loader(filepath).then((v) => typeof v === "object" ? v : null)]);
79
+ }
80
+ /**
81
+ * @template {object} T
82
+ * @param {string} path
83
+ * @returns {Promise<T | null>}
84
+ */
85
+ async function loadConfiguration(path) {
86
+ const result = await find(path);
87
+ if (!result) return null;
88
+ const [filepath, loader] = result;
89
+ return loader(filepath).then((v) => typeof v === "object" ? v : null);
72
90
  }
73
91
 
74
92
  //#endregion
75
- export { loadConfiguration as default };
93
+ export { loadConfiguration as default, loadConfigurationWithPath };
76
94
  //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../cli/load-configuration/index.mjs"],"sourcesContent":["import * as fsPromises from 'node:fs/promises';\nimport * as pathFn from 'node:path';\nimport * as yaml from 'yaml';\nimport * as toml from 'smol-toml';\n\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadToml(path) {\n\t/** @type {any} */\n\tconst value = toml.parse(await fsPromises.readFile(path, 'utf-8'));\n\treturn value;\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadYaml(path) {\n\treturn yaml.parse(await fsPromises.readFile(path, 'utf-8'));\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadJson(path) {\n\treturn JSON.parse(await fsPromises.readFile(path, 'utf-8'));\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nfunction loadMjs(path) {\n\treturn import(path).then(v => {\n\t\tif ('default' in v) { return v.default}\n\t\treturn v;\n\t});\n}\n/** @type {[string, <T>(path: string) => Promise<T | null>][]} */\nconst loaders = [\n\t['.mjs', loadMjs],\n\t['.json', loadJson],\n\t['.yml', loadYaml],\n\t['.yaml', loadYaml],\n\t['.toml', loadToml],\n];\n/**\n * @template {object} T\n * @param {string} path \n * @returns {Promise<T | null>}\n */\n\nexport default async function loadConfiguration(path) {\n\tconst stat = await fsPromises.stat(path).catch(() => null);\n\tconst ext = stat?.isFile() ? pathFn.extname(path).toLowerCase() : '';\n\tlet loader = loaders.find(v => v[0] === ext)?.[1];\n\tif (!loader) {\n\t\tfor(const [e, l] of loaders) {\n\t\t\tconst p = path + e;\n\t\t\tconst stat = await fsPromises.stat(p).catch(() => null);\n\t\t\tif (stat?.isFile()) {\n\t\t\t\tloader = l;\n\t\t\t\tpath = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!loader) { return null }\n\treturn loader(path).then(v => typeof v === 'object' ? v : null)\n}\n"],"mappings":";;;;;;;;;;;;AAWA,eAAe,SAAS,MAAM;AAG7B,QADc,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AASnE,eAAe,SAAS,MAAM;AAC7B,QAAO,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AAQ5D,eAAe,SAAS,MAAM;AAC7B,QAAO,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AAQ5D,SAAS,QAAQ,MAAM;AACtB,QAAO,OAAO,MAAM,MAAK,MAAK;AAC7B,MAAI,aAAa,EAAK,QAAO,EAAE;AAC/B,SAAO;GACN;;;AAGH,MAAM,UAAU;CACf,CAAC,QAAQ,QAAQ;CACjB,CAAC,SAAS,SAAS;CACnB,CAAC,QAAQ,SAAS;CAClB,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;CACnB;;;;;;AAOD,eAA8B,kBAAkB,MAAM;CAErD,MAAM,OADO,MAAM,WAAW,KAAK,KAAK,CAAC,YAAY,KAAK,GACxC,QAAQ,GAAG,OAAO,QAAQ,KAAK,CAAC,aAAa,GAAG;CAClE,IAAI,SAAS,QAAQ,MAAK,MAAK,EAAE,OAAO,IAAI,GAAG;AAC/C,KAAI,CAAC,OACJ,MAAI,MAAM,CAAC,GAAG,MAAM,SAAS;EAC5B,MAAM,IAAI,OAAO;AAEjB,OADa,MAAM,WAAW,KAAK,EAAE,CAAC,YAAY,KAAK,GAC7C,QAAQ,EAAE;AACnB,YAAS;AACT,UAAO;AACP;;;AAIH,KAAI,CAAC,OAAU,QAAO;AACtB,QAAO,OAAO,KAAK,CAAC,MAAK,MAAK,OAAO,MAAM,WAAW,IAAI,KAAK"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../cli/load-configuration/index.mjs"],"sourcesContent":["import * as fsPromises from 'node:fs/promises';\nimport * as pathFn from 'node:path';\nimport * as yaml from 'yaml';\nimport * as toml from 'smol-toml';\n\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadToml(path) {\n\t/** @type {any} */\n\tconst value = toml.parse(await fsPromises.readFile(path, 'utf-8'));\n\treturn value;\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadYaml(path) {\n\treturn yaml.parse(await fsPromises.readFile(path, 'utf-8'));\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nasync function loadJson(path) {\n\treturn JSON.parse(await fsPromises.readFile(path, 'utf-8'));\n}\n/**\n * \n * @template T\n * @param {string} path\n * @returns {Promise<T>}\n */\nfunction loadMjs(path) {\n\treturn import(path).then(v => {\n\t\tif ('default' in v) { return v.default; }\n\t\treturn v;\n\t});\n}\n/** @type {[string, <T>(path: string) => Promise<T | null>][]} */\nconst loaders = [\n\t['.mjs', loadMjs],\n\t['.json', loadJson],\n\t['.yml', loadYaml],\n\t['.yaml', loadYaml],\n\t['.toml', loadToml],\n];\n\n/**\n * @template {object} T\n * @param {string} path \n * @returns {Promise<[path: string, loader: <T>(path: string) => Promise<T | null>] | null>}\n */\n\nasync function find(path) {\n\tconst stat = await fsPromises.stat(path).catch(() => null);\n\tconst ext = stat?.isFile() ? pathFn.extname(path).toLowerCase() : '';\n\tlet loader = loaders.find(v => v[0] === ext)?.[1];\n\tif (loader) { return [path, loader]; }\n\tfor (const [e, l] of loaders) {\n\t\tconst p = path + e;\n\t\tconst stat = await fsPromises.stat(p).catch(() => null);\n\t\tif (stat?.isFile()) {\n\t\t\treturn [p, l];\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * @template {object} T\n * @param {string} path \n * @returns {Promise<[string, T] | null>}\n */\n\nexport async function loadConfigurationWithPath(path) {\n\tconst result = await find(path);\n\tif (!result) { return null; }\n\tconst [filepath, loader] = result;\n\treturn Promise.all([\n\t\tfsPromises.realpath(filepath),\n\t\tloader(filepath).then(v => typeof v === 'object' ? v : null),\n\t]);\n}\n\n/**\n * @template {object} T\n * @param {string} path \n * @returns {Promise<T | null>}\n */\n\nexport default async function loadConfiguration(path) {\n\tconst result = await find(path);\n\tif (!result) { return null; }\n\tconst [filepath, loader] = result;\n\treturn loader(filepath).then(v => typeof v === 'object' ? v : null);\n}\n"],"mappings":";;;;;;;;;;;;AAWA,eAAe,SAAS,MAAM;AAG7B,QADc,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AASnE,eAAe,SAAS,MAAM;AAC7B,QAAO,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AAQ5D,eAAe,SAAS,MAAM;AAC7B,QAAO,KAAK,MAAM,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;;;;;;;;AAQ5D,SAAS,QAAQ,MAAM;AACtB,QAAO,OAAO,MAAM,MAAK,MAAK;AAC7B,MAAI,aAAa,EAAK,QAAO,EAAE;AAC/B,SAAO;GACN;;;AAGH,MAAM,UAAU;CACf,CAAC,QAAQ,QAAQ;CACjB,CAAC,SAAS,SAAS;CACnB,CAAC,QAAQ,SAAS;CAClB,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;CACnB;;;;;;AAQD,eAAe,KAAK,MAAM;CAEzB,MAAM,OADO,MAAM,WAAW,KAAK,KAAK,CAAC,YAAY,KAAK,GACxC,QAAQ,GAAG,OAAO,QAAQ,KAAK,CAAC,aAAa,GAAG;CAClE,IAAI,SAAS,QAAQ,MAAK,MAAK,EAAE,OAAO,IAAI,GAAG;AAC/C,KAAI,OAAU,QAAO,CAAC,MAAM,OAAO;AACnC,MAAK,MAAM,CAAC,GAAG,MAAM,SAAS;EAC7B,MAAM,IAAI,OAAO;AAEjB,OADa,MAAM,WAAW,KAAK,EAAE,CAAC,YAAY,KAAK,GAC7C,QAAQ,CACjB,QAAO,CAAC,GAAG,EAAE;;AAGf,QAAO;;;;;;;AASR,eAAsB,0BAA0B,MAAM;CACrD,MAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,KAAI,CAAC,OAAU,QAAO;CACtB,MAAM,CAAC,UAAU,UAAU;AAC3B,QAAO,QAAQ,IAAI,CAClB,WAAW,SAAS,SAAS,EAC7B,OAAO,SAAS,CAAC,MAAK,MAAK,OAAO,MAAM,WAAW,IAAI,KAAK,CAC5D,CAAC;;;;;;;AASH,eAA8B,kBAAkB,MAAM;CACrD,MAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,KAAI,CAAC,OAAU,QAAO;CACtB,MAAM,CAAC,UAAU,UAAU;AAC3B,QAAO,OAAO,SAAS,CAAC,MAAK,MAAK,OAAO,MAAM,WAAW,IAAI,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yongdall/load-configuration",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "load-configuration.yongdall": "./bin.mjs"