@mxfb/tools 0.0.37 → 0.0.43

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.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as Comp from './components/Comp/index.js'
2
+ import * as wipTennis from './utils/agnostic/_WIP_tennis/index.js'
2
3
  import * as absoluteModulo from './utils/agnostic/absolute-modulo/index.js'
3
4
  import * as array from './utils/agnostic/array/index.js'
4
5
  import * as assert from './utils/agnostic/assert/index.js'
@@ -34,6 +35,7 @@ import * as selectorToElement from './utils/agnostic/selector-to-element/index.j
34
35
  import * as silentLog from './utils/agnostic/silent-log/index.js'
35
36
  import * as strToNodes from './utils/agnostic/str-to-nodes/index.js'
36
37
  import * as stringMatches from './utils/agnostic/string-matches/index.js'
38
+ import * as stringNormalizeIndent from './utils/agnostic/string-normalize-indent/index.js'
37
39
  import * as throttleDebounce from './utils/agnostic/throttle-debounce/index.js'
38
40
  import * as toAlphanum from './utils/agnostic/to-alphanum/index.js'
39
41
  import * as transition from './utils/agnostic/transition/index.js'
@@ -41,11 +43,14 @@ import * as wait from './utils/agnostic/wait/index.js'
41
43
  import * as dynamicCss from './utils/browser/dynamic-css/index.js'
42
44
  import * as getCurrentDownlink from './utils/browser/get-current-downlink/index.js'
43
45
  import * as getNodeAncestors from './utils/browser/get-node-ancestors/index.js'
46
+ import * as image from './utils/node/image/index.js'
44
47
  import * as isInDirectory from './utils/node/is-in-directory/index.js'
45
48
  import * as listSubpaths from './utils/node/list-subpaths/index.js'
49
+ import * as mxfbCliConfig from './utils/node/mxfb-cli-config/index.js'
46
50
  import * as processExit from './utils/node/process-exit/index.js'
47
51
  import * as readWriteFile from './utils/node/read-write-file/index.js'
48
52
  export { Comp }
53
+ export { wipTennis }
49
54
  export { absoluteModulo }
50
55
  export { array }
51
56
  export { assert }
@@ -81,6 +86,7 @@ export { selectorToElement }
81
86
  export { silentLog }
82
87
  export { strToNodes }
83
88
  export { stringMatches }
89
+ export { stringNormalizeIndent }
84
90
  export { throttleDebounce }
85
91
  export { toAlphanum }
86
92
  export { transition }
@@ -88,7 +94,9 @@ export { wait }
88
94
  export { dynamicCss }
89
95
  export { getCurrentDownlink }
90
96
  export { getNodeAncestors }
97
+ export { image }
91
98
  export { isInDirectory }
92
99
  export { listSubpaths }
100
+ export { mxfbCliConfig }
93
101
  export { processExit }
94
102
  export { readWriteFile }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxfb/tools",
3
- "version": "0.0.37",
3
+ "version": "0.0.43",
4
4
  "description": "",
5
5
  "author": "Maxime Fabas",
6
6
  "license": "ISC",
@@ -11,14 +11,21 @@
11
11
  "type": "module",
12
12
  "main": "index.js",
13
13
  "module": "index.js",
14
+ "dependencies": {},
14
15
  "peerDependencies": {
15
16
  "chalk": "^5.3.0",
17
+ "fs-extra": "^11.2.0",
18
+ "get-image-colors": "^4.0.1",
16
19
  "jsdom": "^24.0.0",
20
+ "node-fetch": "^3.3.2",
17
21
  "react": "^18.2.0",
18
- "react-dom": "^18.2.0"
22
+ "react-dom": "^18.2.0",
23
+ "sharp": "^0.33.3"
19
24
  },
20
25
  "devDependencies": {
21
26
  "@types/chalk": "^2.2.0",
27
+ "@types/fs-extra": "^11.0.4",
28
+ "@types/get-image-colors": "^4.0.5",
22
29
  "@types/jsdom": "^21.1.6",
23
30
  "@types/node": "^20.12.5",
24
31
  "@types/prompts": "^2.4.9",
@@ -0,0 +1,2 @@
1
+ export declare namespace Tennis {
2
+ }
@@ -0,0 +1 @@
1
+ var i;(f=>{function s(S){let _=[0,0];return S.forEach(e=>{if(_.includes(5))return;let r=e?0:1,t=e?1:0,n=_[r],o=_[t];if(!(o===5||n===5)){if(o===4&&n===3){_[t]=3;return}if(o===3&&n===4){_[r]=5;return}if(n===3){_[r]=5;return}_[r]++}}),_}function a(S){let[_,e]=S;return _===5?!0:e===5?!1:null}function d(S){let _=[0,0],e=!1;return S.forEach(r=>{if(e||_.includes(7))return;let[t,n]=_;if(t>=6&&n<5||n<=6&&t<5)return;let o=s(r),c=a(o);if(c===!0){_[0]++;return}if(c===!1){_[1]++;return}e=!0}),_}})(i||={});export{i as Tennis};
@@ -1 +1 @@
1
- export default function isInEnum<E extends Object>(enumObj: E, value: unknown): value is E[keyof E];
1
+ export default function isInEnum<E extends Record<string, string | number>>(enumObj: E, value: string | number): value is E[keyof E];
@@ -1 +1 @@
1
- function u(e,n){return Object.values(e).includes(n)}export{u as default};
1
+ function l(s,n){let t=Object.keys(s),c=Object.values(s).filter(e=>typeof e=="number");return t.filter(e=>!c.includes(parseInt(e,10))).map(e=>s[e]).includes(n)}export{l as default};
@@ -1,6 +1,11 @@
1
- type FuncRecord = Record<string, (...args: any[]) => any>;
2
- type UnwrapPromise<PromiseOrNot> = PromiseOrNot extends Promise<infer Resolved> ? Resolved : PromiseOrNot;
3
- export default function recordFormat<Format extends FuncRecord>(input: Record<string, unknown>, format: Format): Promise<{
4
- [Key in keyof Format]: UnwrapPromise<ReturnType<Format[Key]>>;
5
- }>;
6
- export {};
1
+ export type FormatKey<Input extends {} = any> = keyof Input | string;
2
+ export type InputValue<Input extends {}, Key extends FormatKey<Input>> = Input extends Record<Key, infer V> ? V : undefined;
3
+ export type FormatterFunc<I, O> = (val: I) => O | Promise<O>;
4
+ export type Format<Input extends {} = any> = {
5
+ [Key in FormatKey<Input>]: FormatterFunc<InputValue<Input, Key>, any>;
6
+ };
7
+ export type UnwrapPromise<PromiseOrNot> = PromiseOrNot extends Promise<infer Resolved> ? Resolved : PromiseOrNot;
8
+ export type Formatted<F extends Format<{}>> = {
9
+ [Key in keyof F]: UnwrapPromise<ReturnType<F[Key]>>;
10
+ };
11
+ export default function recordFormat<I extends {}, F extends Format<I>>(input: I, format: F): Promise<Formatted<F>>;
@@ -1 +1 @@
1
- async function y(n,s){let e={},r=[];return Object.entries(s).forEach(async([o,a])=>{let i=n[o],t=a(i);r.push(t);let m=await t;e[o]=m}),await Promise.all(r),e}export{y as default};
1
+ async function a(o,n){let t={};for(let e in n){let r=n[e];typeof r=="function"?t[e]=await r(o[e]):t[e]=r}return t}export{a as default};
@@ -0,0 +1 @@
1
+ export default function stringNormalizeIndent(input: string, indentLevel?: number): string;
@@ -0,0 +1,3 @@
1
+ function r(i,t=0){let s=" ".repeat(t);return i.split(`
2
+ `).map(e=>e.replace(/^\s*/igm,"")).map(e=>{let n=e.match(/^\|+/igm)?.[0].length??0,p=e.slice(n);return" ".repeat(n)+p}).map(e=>s+e).join(`
3
+ `)}export{r as default};
@@ -0,0 +1,9 @@
1
+ export declare function getImageColorsFromUrl(url: string): Promise<string[]>;
2
+ export declare const compressorExtensions: {
3
+ jpgExtensions: string[];
4
+ pngExtensions: string[];
5
+ webpExtensions: string[];
6
+ avifExtensions: string[];
7
+ heifExtensions: string[];
8
+ };
9
+ export declare function compressImages(src: string, preExtension: string, sizes?: number[], qualities?: number[] | number): Promise<void>;
@@ -0,0 +1 @@
1
+ import f from"node:path";import v from"node-fetch";import z from"get-image-colors";import g from"fs-extra";import A from"sharp";async function U(o){let n=await(await v(o)).blob(),s=await n.arrayBuffer(),p=Buffer.from(s);return(await z(p,n.type)).map(c=>c.hex())}var P={jpgExtensions:[".jpg",".jpeg"],pngExtensions:[".png"],webpExtensions:[".wepb"],avifExtensions:[".avif",".avifs"],heifExtensions:[".heif",".heifs",".hif"]};async function W(o,a,n=[],s=100){if(!f.isAbsolute(o))throw new Error("Source path must be absolute.");let p=await g.readdir(o),{jpgExtensions:m,pngExtensions:u,webpExtensions:c,avifExtensions:d,heifExtensions:h}=P,$=[...m,...u,...c,...d,...h].flat();for(let w of p){let E=f.join(o,w);if((await g.stat(E)).isDirectory())continue;let t=f.extname(w);if(!$.includes(t.toLowerCase()))continue;let b=w.replace(new RegExp(`${t}$`),""),x=b.split(".").slice(1).slice(-1)[0]??"";if((x===""?x:`.${x}`)===a)continue;let F=b.replace(new RegExp(`${a}$`),"");for(let y in n){let l=n[y],j=`${F}.${l}${a}${t}`,e=f.join(o,j),i=Array.isArray(s)?s[y]??s.slice(-1)[0]??100:s,r=A(E).withMetadata().resize(l,l,{fit:"inside",withoutEnlargement:!0});m.includes(t)&&await r.jpeg({quality:i}).toFile(e),u.includes(t)&&await r.png({quality:i}).toFile(e),c.includes(t)&&await r.webp({quality:i}).toFile(e),d.includes(t)&&await r.avif({quality:i}).toFile(e),h.includes(t)&&await r.heif({quality:i}).toFile(e),console.log(e),console.log("size",l),console.log("quality",i),console.log("poids",(await g.stat(e)).size)}}}export{W as compressImages,P as compressorExtensions,U as getImageColorsFromUrl};
@@ -0,0 +1,19 @@
1
+ export type Config = {
2
+ mxfb_projects_sync?: {
3
+ lm_path?: string;
4
+ mxfb_path?: string;
5
+ };
6
+ };
7
+ export declare const emptyConfigObj: Config;
8
+ export declare function createConfigFile(force?: boolean): Promise<true | Error>;
9
+ declare const deletionSecurityPhrase = "THIS IS A DESTRUCTIVE AND DEFINITIVE ACTION";
10
+ export declare function deleteConfigDir(security: typeof deletionSecurityPhrase): Promise<true | Error>;
11
+ export declare function deleteConfigFile(security: typeof deletionSecurityPhrase): Promise<true | Error>;
12
+ export declare function ensureConfigFile(): Promise<true | Error>;
13
+ export declare function getConfigFile(): Promise<string | Error>;
14
+ export declare function validateConfigObj(configObj: any): configObj is Config;
15
+ export declare function parseConfigFile(fileContents: string): Config | Error;
16
+ export declare function getConfig(create?: boolean): Promise<Config | Error>;
17
+ export type ConfigUpdater = Partial<Config> | ((curr: Config) => Config);
18
+ export declare function updateConfig(updater: ConfigUpdater, create?: boolean): Promise<true | Error>;
19
+ export {};
@@ -0,0 +1,2 @@
1
+ import u from"node:os";import{promises as n}from"node:fs";import a from"node:path";var g=u.homedir(),f=a.join(g,".config/mxfb-cli"),o=a.join(f,"config.json"),p={};async function y(t=!1){await n.mkdir(f,{recursive:!0});try{if(await n.stat(o),t===!0)throw"create anyway";return!0}catch{try{return await n.writeFile(o,`${JSON.stringify(p,null,2)}
2
+ `,{encoding:"utf-8"}),!0}catch(e){return e instanceof Error?e:typeof e=="string"?new Error(e):new Error(`${e}`)}}}var s="THIS IS A DESTRUCTIVE AND DEFINITIVE ACTION";async function P(t){return t!==s?new Error("You must provide the security phrase"):(await n.rm(f,{recursive:!0,force:!0}),!0)}async function b(t){return t!==s?new Error("You must provide the security phrase"):(await n.rm(f),!0)}async function l(){try{return await n.stat(o),!0}catch{try{let r=await y();if(r instanceof Error)throw r;return!0}catch(r){return r instanceof Error?r:typeof r=="string"?new Error(r):new Error(`${r}`)}}}async function E(){try{return await n.readFile(o,{encoding:"utf-8"})}catch(t){return t instanceof Error?t:typeof t=="string"?new Error(t):new Error(`${t}`)}}function w(t){return!0}function m(t){try{let r=JSON.parse(t);if(!w(r))throw new Error(`Invalid config file shape: ${t}`);return r}catch(r){return r instanceof Error?r:typeof r=="string"?new Error(r):new Error(`${r}`)}}async function C(t=!1){if(t){let i=await l();if(i!==!0)return i}let r=await E();if(r instanceof Error)return r;let e=m(r);return e instanceof Error,e}async function F(t,r=!1){let e=await C(r);if(e instanceof Error)return e;let i=typeof t=="function"?t(e):{...e,...t},c=JSON.stringify(i,null,2);return await n.writeFile(o,c,{encoding:"utf-8"}),!0}export{y as createConfigFile,P as deleteConfigDir,b as deleteConfigFile,p as emptyConfigObj,l as ensureConfigFile,C as getConfig,E as getConfigFile,m as parseConfigFile,F as updateConfig,w as validateConfigObj};
@@ -8,5 +8,5 @@ type WriteFileData = Parameters<typeof fs.writeFile>[1];
8
8
  type ReadOptions = Parameters<typeof fs.readFile>[1];
9
9
  type WriteOptions = Parameters<typeof fs.writeFile>[2];
10
10
  export type EditorFunc = (curr: ReadFileData) => WriteFileData;
11
- export default function readWriteFile(path: Path, editor: EditorFunc, ...options: [ReadOptions?, WriteOptions?]): Promise<string | NodeJS.ArrayBufferView | Iterable<string | NodeJS.ArrayBufferView> | AsyncIterable<string | NodeJS.ArrayBufferView> | import("stream").Stream>;
11
+ export default function readWriteFile(path: Path, editor: EditorFunc, ...options: [ReadOptions?, WriteOptions?]): Promise<string | import("stream").Stream | NodeJS.ArrayBufferView | Iterable<string | NodeJS.ArrayBufferView> | AsyncIterable<string | NodeJS.ArrayBufferView>>;
12
12
  export {};