@servicetitan/folder-lint 33.1.1 → 34.0.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/dist/folderSchema.d.ts.map +1 -1
- package/dist/folderSchema.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/folderSchema.test.ts +1 -1
- package/src/folderSchema.ts +2 -3
- package/src/index.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folderSchema.d.ts","sourceRoot":"","sources":["../src/folderSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"folderSchema.d.ts","sourceRoot":"","sources":["../src/folderSchema.ts"],"names":[],"mappings":"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"}
|
package/dist/folderSchema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/folderSchema.ts"],"sourcesContent":["import { glob } from 'glob';\nimport { minimatch } from 'minimatch';\n\nimport {\n allowedFolderNameFailure,\n allowedExtensionsFailure,\n allowedFilesFailure,\n folderNamingConventionFailure,\n Failure,\n fileNamingConventionFailure,\n} from './failures';\nimport { getFileBasename, getFileExtension } from './file';\nimport { alwaysLazy, MaybeLazy, memoizeConst } from './lazy';\nimport { NamingConvention } from './namingConvention';\n\n/**\n * `Folder` represents tree-like folder schema\n */\nexport interface Folder {\n /**\n * folder name, it is ignored for the root Folder\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n name: string;\n\n /**\n * defaults to undefined\n * has to be set at least on the root Folder\n */\n namingConvention?: NamingConvention;\n\n /**\n * defaults to []\n */\n children?: MaybeLazy<Folder> | MaybeLazy<Folder>[];\n\n /**\n * defaults to ['*']\n * used to check full file name with extension\n * no path before filename is captured\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n allowedFiles?: string | string[];\n\n /**\n * defaults to value in previous node or empty array if no previous value\n * used to check only the part that starts after first dot\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n allowedExtensions?: string | string[];\n\n /**\n * defaults to true, but takes effect only if allowedExtensions is not undefined\n * if false parent extensions are getting concatenated with current ones\n */\n overrideExtensions?: boolean;\n\n /**\n * defaults to false\n * if true then all content will be considered valid.\n */\n ignore?: boolean;\n}\n\nexport interface ParentFolder extends Folder {\n namingConvention: NamingConvention;\n}\n\nexport type RootFolder = MaybeLazy<ParentFolder>;\n\nexport function checkPath(rawCfg: RootFolder) {\n const cfg = canonicalizeConfig(alwaysLazy(rawCfg));\n const memoCfg = memoizeConfig(cfg)();\n\n return (filename: string): Failure[] => {\n const pathParts = splitFilename(filename);\n return checkFolder(memoCfg, pathParts, '<root>');\n };\n}\n\nexport function canonicalizeConfig(lazyFolder: () => ParentFolder): LazyCanonicalFolder {\n return (): CanonicalFolder => {\n const folder = lazyFolder();\n\n const allowedExtensions = alwaysArray(folder.allowedExtensions);\n\n const children = alwaysArray(folder.children)\n .map(alwaysLazy)\n .map(lazyChild => () => inheritNamingConvention(folder.namingConvention, lazyChild()))\n .map(lazyChild => () => inheritAllowedExtensions(allowedExtensions, lazyChild()))\n .map(canonicalizeConfig);\n\n return {\n ...folder,\n\n allowedExtensions,\n children,\n\n ignore: !!folder.ignore,\n allowedFiles: canonicalizeAllowedFiles(folder.allowedFiles),\n };\n };\n}\n\nexport function memoizeConfig(lazyFolder: LazyCanonicalFolder): LazyCanonicalFolder {\n return memoizeConst(() => {\n const folder = lazyFolder();\n const children = folder.children.map(memoizeConfig);\n\n return {\n ...folder,\n children,\n };\n });\n}\n\nexport function canonicalizeAllowedFiles(files: string | string[] = ['*']): string[] {\n return alwaysArray(files);\n}\n\nexport function alwaysArray<T>(es: T | T[] = []): T[] {\n return Array.isArray(es) ? es : [es];\n}\n\nexport interface CanonicalFolder extends ParentFolder {\n children: LazyCanonicalFolder[];\n allowedFiles: string[];\n allowedExtensions: string[];\n ignore: boolean;\n}\n\nexport type LazyCanonicalFolder = () => CanonicalFolder;\n\nexport function inheritNamingConvention<T extends Folder>(\n parentNamingConvention: NamingConvention,\n child: T\n): RequiredProp<T, 'namingConvention'> {\n return {\n ...(child as any),\n namingConvention: child.namingConvention ?? parentNamingConvention,\n };\n}\n\nexport function inheritAllowedExtensions<T extends Folder>(\n parentAllowedExtensions: string[],\n child: T\n): RequiredProp<T, 'allowedExtensions'> {\n const overrideExtensions =\n child.overrideExtensions !== false && child.allowedExtensions !== undefined;\n\n const childAllowedExtensions = alwaysArray(child.allowedExtensions);\n\n const allowedExtensions = overrideExtensions\n ? childAllowedExtensions\n : [...parentAllowedExtensions, ...childAllowedExtensions];\n\n return {\n ...(child as any),\n allowedExtensions,\n };\n}\n\nexport function splitFilename(filename: string): string[] {\n const path = filename\n .replace(/\\\\/g, '/')\n .split('/')\n .filter(s => s.length > 0);\n\n if (path.length < 1) {\n return [''];\n }\n\n return path;\n}\n\nexport function isAllowedFolderName(pattern: string, folderName: string): boolean {\n return minimatch(folderName, pattern);\n}\n\nexport function checkFolder(\n cfg: CanonicalFolder,\n subPath: string[],\n folderName: string\n): Failure[] {\n if (cfg.ignore) {\n return [];\n }\n\n const isLastFolderInPath = subPath.length === 1;\n\n if (isLastFolderInPath) {\n const [fileName] = subPath;\n return [\n ...checkFileNamingConvention(cfg.namingConvention, fileName, folderName),\n ...checkFileName(cfg.allowedFiles, fileName, folderName),\n ...checkFileExt(cfg.allowedExtensions, fileName, folderName),\n ];\n }\n\n const [childFolderName, ...restPath] = subPath;\n\n const children = cfg.children\n .map(c => c()) // load children\n .sort(compareByMagicInName);\n\n const allowedChild = children.find(childCfg =>\n isAllowedFolderName(childCfg.name, childFolderName)\n );\n\n if (!allowedChild) {\n return [\n allowedFolderNameFailure({\n folderName: childFolderName,\n parentName: folderName,\n allowedNames: children.map(c => c.name),\n }),\n ];\n }\n\n return [\n ...checkFolderNamingConvention(cfg.namingConvention, childFolderName, folderName),\n ...checkFolder(allowedChild, restPath, childFolderName),\n ];\n}\n\nexport function checkFolderNamingConvention(\n namingConvention: NamingConvention,\n folderName: string,\n parentName: string\n): Failure[] {\n if (!NamingConvention.check(namingConvention, folderName)) {\n return [folderNamingConventionFailure({ folderName, parentName, namingConvention })];\n }\n\n return [];\n}\n\nexport function checkFileName(\n allowedFiles: string[],\n fileName: string,\n folderName: string\n): Failure[] {\n const isMatch = allowedFiles.some(af => minimatch(fileName, af));\n\n if (!isMatch) {\n return [allowedFilesFailure({ fileName, folderName, allowedFiles })];\n }\n\n return [];\n}\n\nexport function checkFileNamingConvention(\n namingConvention: NamingConvention,\n fileName: string,\n folderName: string\n): Failure[] {\n if (!NamingConvention.check(namingConvention, getFileBasename(fileName))) {\n return [fileNamingConventionFailure({ fileName, folderName, namingConvention })];\n }\n\n return [];\n}\n\nexport function checkFileExt(\n allowedExtensions: string[],\n fileName: string,\n folderName: string\n): Failure[] {\n const fileExt = getFileExtension(fileName);\n const isMatch = allowedExtensions.some(ae => minimatch(fileExt, ae));\n\n if (!isMatch) {\n return [allowedExtensionsFailure({ fileName, folderName, allowedExtensions })];\n }\n\n return [];\n}\n\nexport function compareByMagicInName<T extends { name: string }>(a: T, b: T) {\n return +glob.hasMagic(a.name) - +glob.hasMagic(b.name);\n}\n\n/**\n * Make K properties in T required\n */\ntype RequiredProp<T, K extends keyof T> = T & Required<Pick<T, K>>; // = T & { [P in K]-?: T[P]; };\n"],"names":["alwaysArray","canonicalizeAllowedFiles","canonicalizeConfig","checkFileExt","checkFileName","checkFileNamingConvention","checkFolder","checkFolderNamingConvention","checkPath","compareByMagicInName","inheritAllowedExtensions","inheritNamingConvention","isAllowedFolderName","memoizeConfig","splitFilename","rawCfg","cfg","alwaysLazy","memoCfg","filename","pathParts","lazyFolder","folder","allowedExtensions","children","map","lazyChild","namingConvention","ignore","allowedFiles","memoizeConst","files","es","Array","isArray","parentNamingConvention","child","parentAllowedExtensions","overrideExtensions","undefined","childAllowedExtensions","path","replace","split","filter","s","length","pattern","folderName","minimatch","subPath","isLastFolderInPath","fileName","childFolderName","restPath","c","sort","allowedChild","find","childCfg","name","allowedFolderNameFailure","parentName","allowedNames","NamingConvention","check","folderNamingConventionFailure","isMatch","some","af","allowedFilesFailure","getFileBasename","fileNamingConventionFailure","fileExt","getFileExtension","ae","allowedExtensionsFailure","a","b","glob","hasMagic"],"mappings":";;;;;;;;;;;QA2HgBA;eAAAA;;QAJAC;eAAAA;;QApCAC;eAAAA;;QAuLAC;eAAAA;;QA1BAC;eAAAA;;QAcAC;eAAAA;;QAxEAC;eAAAA;;QA8CAC;eAAAA;;QA3JAC;eAAAA;;QAgNAC;eAAAA;;QAvIAC;eAAAA;;QAVAC;eAAAA;;QA0CAC;eAAAA;;QAvEAC;eAAAA;;QA0DAC;eAAAA;;;sBArKK;2BACK;0BASnB;sBAC2C;sBACE;kCACnB;AA4D1B,SAASN,UAAUO,MAAkB;IACxC,MAAMC,MAAMd,mBAAmBe,IAAAA,gBAAU,EAACF;IAC1C,MAAMG,UAAUL,cAAcG;IAE9B,OAAO,CAACG;QACJ,MAAMC,YAAYN,cAAcK;QAChC,OAAOb,YAAYY,SAASE,WAAW;IAC3C;AACJ;AAEO,SAASlB,mBAAmBmB,UAA8B;IAC7D,OAAO;QACH,MAAMC,SAASD;QAEf,MAAME,oBAAoBvB,YAAYsB,OAAOC,iBAAiB;QAE9D,MAAMC,WAAWxB,YAAYsB,OAAOE,QAAQ,EACvCC,GAAG,CAACR,gBAAU,EACdQ,GAAG,CAACC,CAAAA,YAAa,IAAMf,wBAAwBW,OAAOK,gBAAgB,EAAED,cACxED,GAAG,CAACC,CAAAA,YAAa,IAAMhB,yBAAyBa,mBAAmBG,cACnED,GAAG,CAACvB;QAET,OAAO;YACH,GAAGoB,MAAM;YAETC;YACAC;YAEAI,QAAQ,CAAC,CAACN,OAAOM,MAAM;YACvBC,cAAc5B,yBAAyBqB,OAAOO,YAAY;QAC9D;IACJ;AACJ;AAEO,SAAShB,cAAcQ,UAA+B;IACzD,OAAOS,IAAAA,kBAAY,EAAC;QAChB,MAAMR,SAASD;QACf,MAAMG,WAAWF,OAAOE,QAAQ,CAACC,GAAG,CAACZ;QAErC,OAAO;YACH,GAAGS,MAAM;YACTE;QACJ;IACJ;AACJ;AAEO,SAASvB,yBAAyB8B,QAA2B;IAAC;CAAI;IACrE,OAAO/B,YAAY+B;AACvB;AAEO,SAAS/B,YAAegC,KAAc,EAAE;IAC3C,OAAOC,MAAMC,OAAO,CAACF,MAAMA,KAAK;QAACA;KAAG;AACxC;AAWO,SAASrB,wBACZwB,sBAAwC,EACxCC,KAAQ;QAIcA;IAFtB,OAAO;QACH,GAAIA,KAAK;QACTT,kBAAkBS,CAAAA,0BAAAA,MAAMT,gBAAgB,cAAtBS,qCAAAA,0BAA0BD;IAChD;AACJ;AAEO,SAASzB,yBACZ2B,uBAAiC,EACjCD,KAAQ;IAER,MAAME,qBACFF,MAAME,kBAAkB,KAAK,SAASF,MAAMb,iBAAiB,KAAKgB;IAEtE,MAAMC,yBAAyBxC,YAAYoC,MAAMb,iBAAiB;IAElE,MAAMA,oBAAoBe,qBACpBE,yBACA;WAAIH;WAA4BG;KAAuB;IAE7D,OAAO;QACH,GAAIJ,KAAK;QACTb;IACJ;AACJ;AAEO,SAAST,cAAcK,QAAgB;IAC1C,MAAMsB,OAAOtB,SACRuB,OAAO,CAAC,OAAO,KACfC,KAAK,CAAC,KACNC,MAAM,CAACC,CAAAA,IAAKA,EAAEC,MAAM,GAAG;IAE5B,IAAIL,KAAKK,MAAM,GAAG,GAAG;QACjB,OAAO;YAAC;SAAG;IACf;IAEA,OAAOL;AACX;AAEO,SAAS7B,oBAAoBmC,OAAe,EAAEC,UAAkB;IACnE,OAAOC,IAAAA,oBAAS,EAACD,YAAYD;AACjC;AAEO,SAASzC,YACZU,GAAoB,EACpBkC,OAAiB,EACjBF,UAAkB;IAElB,IAAIhC,IAAIY,MAAM,EAAE;QACZ,OAAO,EAAE;IACb;IAEA,MAAMuB,qBAAqBD,QAAQJ,MAAM,KAAK;IAE9C,IAAIK,oBAAoB;QACpB,MAAM,CAACC,SAAS,GAAGF;QACnB,OAAO;eACA7C,0BAA0BW,IAAIW,gBAAgB,EAAEyB,UAAUJ;eAC1D5C,cAAcY,IAAIa,YAAY,EAAEuB,UAAUJ;eAC1C7C,aAAaa,IAAIO,iBAAiB,EAAE6B,UAAUJ;SACpD;IACL;IAEA,MAAM,CAACK,iBAAiB,GAAGC,SAAS,GAAGJ;IAEvC,MAAM1B,WAAWR,IAAIQ,QAAQ,CACxBC,GAAG,CAAC8B,CAAAA,IAAKA,KAAK,gBAAgB;KAC9BC,IAAI,CAAC/C;IAEV,MAAMgD,eAAejC,SAASkC,IAAI,CAACC,CAAAA,WAC/B/C,oBAAoB+C,SAASC,IAAI,EAAEP;IAGvC,IAAI,CAACI,cAAc;QACf,OAAO;YACHI,IAAAA,kCAAwB,EAAC;gBACrBb,YAAYK;gBACZS,YAAYd;gBACZe,cAAcvC,SAASC,GAAG,CAAC8B,CAAAA,IAAKA,EAAEK,IAAI;YAC1C;SACH;IACL;IAEA,OAAO;WACArD,4BAA4BS,IAAIW,gBAAgB,EAAE0B,iBAAiBL;WACnE1C,YAAYmD,cAAcH,UAAUD;KAC1C;AACL;AAEO,SAAS9C,4BACZoB,gBAAkC,EAClCqB,UAAkB,EAClBc,UAAkB;IAElB,IAAI,CAACE,kCAAgB,CAACC,KAAK,CAACtC,kBAAkBqB,aAAa;QACvD,OAAO;YAACkB,IAAAA,uCAA6B,EAAC;gBAAElB;gBAAYc;gBAAYnC;YAAiB;SAAG;IACxF;IAEA,OAAO,EAAE;AACb;AAEO,SAASvB,cACZyB,YAAsB,EACtBuB,QAAgB,EAChBJ,UAAkB;IAElB,MAAMmB,UAAUtC,aAAauC,IAAI,CAACC,CAAAA,KAAMpB,IAAAA,oBAAS,EAACG,UAAUiB;IAE5D,IAAI,CAACF,SAAS;QACV,OAAO;YAACG,IAAAA,6BAAmB,EAAC;gBAAElB;gBAAUJ;gBAAYnB;YAAa;SAAG;IACxE;IAEA,OAAO,EAAE;AACb;AAEO,SAASxB,0BACZsB,gBAAkC,EAClCyB,QAAgB,EAChBJ,UAAkB;IAElB,IAAI,CAACgB,kCAAgB,CAACC,KAAK,CAACtC,kBAAkB4C,IAAAA,qBAAe,EAACnB,YAAY;QACtE,OAAO;YAACoB,IAAAA,qCAA2B,EAAC;gBAAEpB;gBAAUJ;gBAAYrB;YAAiB;SAAG;IACpF;IAEA,OAAO,EAAE;AACb;AAEO,SAASxB,aACZoB,iBAA2B,EAC3B6B,QAAgB,EAChBJ,UAAkB;IAElB,MAAMyB,UAAUC,IAAAA,sBAAgB,EAACtB;IACjC,MAAMe,UAAU5C,kBAAkB6C,IAAI,CAACO,CAAAA,KAAM1B,IAAAA,oBAAS,EAACwB,SAASE;IAEhE,IAAI,CAACR,SAAS;QACV,OAAO;YAACS,IAAAA,kCAAwB,EAAC;gBAAExB;gBAAUJ;gBAAYzB;YAAkB;SAAG;IAClF;IAEA,OAAO,EAAE;AACb;AAEO,SAASd,qBAAiDoE,CAAI,EAAEC,CAAI;IACvE,OAAO,CAACC,UAAI,CAACC,QAAQ,CAACH,EAAEjB,IAAI,IAAI,CAACmB,UAAI,CAACC,QAAQ,CAACF,EAAElB,IAAI;AACzD;CAKoE,+BAA+B"}
|
|
1
|
+
{"version":3,"sources":["../src/folderSchema.ts"],"sourcesContent":["import { glob } from 'glob';\nimport { minimatch } from 'minimatch';\nimport {\n allowedExtensionsFailure,\n allowedFilesFailure,\n allowedFolderNameFailure,\n Failure,\n fileNamingConventionFailure,\n folderNamingConventionFailure,\n} from './failures';\nimport { getFileBasename, getFileExtension } from './file';\nimport { alwaysLazy, MaybeLazy, memoizeConst } from './lazy';\nimport { NamingConvention } from './namingConvention';\n\n/**\n * `Folder` represents tree-like folder schema\n */\nexport interface Folder {\n /**\n * folder name, it is ignored for the root Folder\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n name: string;\n\n /**\n * defaults to undefined\n * has to be set at least on the root Folder\n */\n namingConvention?: NamingConvention;\n\n /**\n * defaults to []\n */\n children?: MaybeLazy<Folder> | MaybeLazy<Folder>[];\n\n /**\n * defaults to ['*']\n * used to check full file name with extension\n * no path before filename is captured\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n allowedFiles?: string | string[];\n\n /**\n * defaults to value in previous node or empty array if no previous value\n * used to check only the part that starts after first dot\n * supports Glob\n * https://github.com/isaacs/node-glob#glob-primer\n */\n allowedExtensions?: string | string[];\n\n /**\n * defaults to true, but takes effect only if allowedExtensions is not undefined\n * if false parent extensions are getting concatenated with current ones\n */\n overrideExtensions?: boolean;\n\n /**\n * defaults to false\n * if true then all content will be considered valid.\n */\n ignore?: boolean;\n}\n\nexport interface ParentFolder extends Folder {\n namingConvention: NamingConvention;\n}\n\nexport type RootFolder = MaybeLazy<ParentFolder>;\n\nexport function checkPath(rawCfg: RootFolder) {\n const cfg = canonicalizeConfig(alwaysLazy(rawCfg));\n const memoCfg = memoizeConfig(cfg)();\n\n return (filename: string): Failure[] => {\n const pathParts = splitFilename(filename);\n return checkFolder(memoCfg, pathParts, '<root>');\n };\n}\n\nexport function canonicalizeConfig(lazyFolder: () => ParentFolder): LazyCanonicalFolder {\n return (): CanonicalFolder => {\n const folder = lazyFolder();\n\n const allowedExtensions = alwaysArray(folder.allowedExtensions);\n\n const children = alwaysArray(folder.children)\n .map(alwaysLazy)\n .map(lazyChild => () => inheritNamingConvention(folder.namingConvention, lazyChild()))\n .map(lazyChild => () => inheritAllowedExtensions(allowedExtensions, lazyChild()))\n .map(canonicalizeConfig);\n\n return {\n ...folder,\n\n allowedExtensions,\n children,\n\n ignore: !!folder.ignore,\n allowedFiles: canonicalizeAllowedFiles(folder.allowedFiles),\n };\n };\n}\n\nexport function memoizeConfig(lazyFolder: LazyCanonicalFolder): LazyCanonicalFolder {\n return memoizeConst(() => {\n const folder = lazyFolder();\n const children = folder.children.map(memoizeConfig);\n\n return {\n ...folder,\n children,\n };\n });\n}\n\nexport function canonicalizeAllowedFiles(files: string | string[] = ['*']): string[] {\n return alwaysArray(files);\n}\n\nexport function alwaysArray<T>(es: T | T[] = []): T[] {\n return Array.isArray(es) ? es : [es];\n}\n\nexport interface CanonicalFolder extends ParentFolder {\n children: LazyCanonicalFolder[];\n allowedFiles: string[];\n allowedExtensions: string[];\n ignore: boolean;\n}\n\nexport type LazyCanonicalFolder = () => CanonicalFolder;\n\nexport function inheritNamingConvention<T extends Folder>(\n parentNamingConvention: NamingConvention,\n child: T\n): RequiredProp<T, 'namingConvention'> {\n return {\n ...(child as any),\n namingConvention: child.namingConvention ?? parentNamingConvention,\n };\n}\n\nexport function inheritAllowedExtensions<T extends Folder>(\n parentAllowedExtensions: string[],\n child: T\n): RequiredProp<T, 'allowedExtensions'> {\n const overrideExtensions =\n child.overrideExtensions !== false && child.allowedExtensions !== undefined;\n\n const childAllowedExtensions = alwaysArray(child.allowedExtensions);\n\n const allowedExtensions = overrideExtensions\n ? childAllowedExtensions\n : [...parentAllowedExtensions, ...childAllowedExtensions];\n\n return {\n ...(child as any),\n allowedExtensions,\n };\n}\n\nexport function splitFilename(filename: string): string[] {\n const path = filename\n .replace(/\\\\/g, '/')\n .split('/')\n .filter(s => s.length > 0);\n\n if (path.length < 1) {\n return [''];\n }\n\n return path;\n}\n\nexport function isAllowedFolderName(pattern: string, folderName: string): boolean {\n return minimatch(folderName, pattern);\n}\n\nexport function checkFolder(\n cfg: CanonicalFolder,\n subPath: string[],\n folderName: string\n): Failure[] {\n if (cfg.ignore) {\n return [];\n }\n\n const isLastFolderInPath = subPath.length === 1;\n\n if (isLastFolderInPath) {\n const [fileName] = subPath;\n return [\n ...checkFileNamingConvention(cfg.namingConvention, fileName, folderName),\n ...checkFileName(cfg.allowedFiles, fileName, folderName),\n ...checkFileExt(cfg.allowedExtensions, fileName, folderName),\n ];\n }\n\n const [childFolderName, ...restPath] = subPath;\n\n const children = cfg.children\n .map(c => c()) // load children\n .sort(compareByMagicInName);\n\n const allowedChild = children.find(childCfg =>\n isAllowedFolderName(childCfg.name, childFolderName)\n );\n\n if (!allowedChild) {\n return [\n allowedFolderNameFailure({\n folderName: childFolderName,\n parentName: folderName,\n allowedNames: children.map(c => c.name),\n }),\n ];\n }\n\n return [\n ...checkFolderNamingConvention(cfg.namingConvention, childFolderName, folderName),\n ...checkFolder(allowedChild, restPath, childFolderName),\n ];\n}\n\nexport function checkFolderNamingConvention(\n namingConvention: NamingConvention,\n folderName: string,\n parentName: string\n): Failure[] {\n if (!NamingConvention.check(namingConvention, folderName)) {\n return [folderNamingConventionFailure({ folderName, parentName, namingConvention })];\n }\n\n return [];\n}\n\nexport function checkFileName(\n allowedFiles: string[],\n fileName: string,\n folderName: string\n): Failure[] {\n const isMatch = allowedFiles.some(af => minimatch(fileName, af));\n\n if (!isMatch) {\n return [allowedFilesFailure({ fileName, folderName, allowedFiles })];\n }\n\n return [];\n}\n\nexport function checkFileNamingConvention(\n namingConvention: NamingConvention,\n fileName: string,\n folderName: string\n): Failure[] {\n if (!NamingConvention.check(namingConvention, getFileBasename(fileName))) {\n return [fileNamingConventionFailure({ fileName, folderName, namingConvention })];\n }\n\n return [];\n}\n\nexport function checkFileExt(\n allowedExtensions: string[],\n fileName: string,\n folderName: string\n): Failure[] {\n const fileExt = getFileExtension(fileName);\n const isMatch = allowedExtensions.some(ae => minimatch(fileExt, ae));\n\n if (!isMatch) {\n return [allowedExtensionsFailure({ fileName, folderName, allowedExtensions })];\n }\n\n return [];\n}\n\nexport function compareByMagicInName<T extends { name: string }>(a: T, b: T) {\n return +glob.hasMagic(a.name) - +glob.hasMagic(b.name);\n}\n\n/**\n * Make K properties in T required\n */\ntype RequiredProp<T, K extends keyof T> = T & Required<Pick<T, K>>; // = T & { [P in K]-?: T[P]; };\n"],"names":["alwaysArray","canonicalizeAllowedFiles","canonicalizeConfig","checkFileExt","checkFileName","checkFileNamingConvention","checkFolder","checkFolderNamingConvention","checkPath","compareByMagicInName","inheritAllowedExtensions","inheritNamingConvention","isAllowedFolderName","memoizeConfig","splitFilename","rawCfg","cfg","alwaysLazy","memoCfg","filename","pathParts","lazyFolder","folder","allowedExtensions","children","map","lazyChild","namingConvention","ignore","allowedFiles","memoizeConst","files","es","Array","isArray","parentNamingConvention","child","parentAllowedExtensions","overrideExtensions","undefined","childAllowedExtensions","path","replace","split","filter","s","length","pattern","folderName","minimatch","subPath","isLastFolderInPath","fileName","childFolderName","restPath","c","sort","allowedChild","find","childCfg","name","allowedFolderNameFailure","parentName","allowedNames","NamingConvention","check","folderNamingConventionFailure","isMatch","some","af","allowedFilesFailure","getFileBasename","fileNamingConventionFailure","fileExt","getFileExtension","ae","allowedExtensionsFailure","a","b","glob","hasMagic"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export type { Folder, RootFolder } from './folderSchema';
|
|
2
1
|
export { checkPath } from './folderSchema';
|
|
2
|
+
export type { Folder, RootFolder } from './folderSchema';
|
|
3
3
|
export { NamingConvention } from './namingConvention';
|
|
4
|
-
export type { Failure } from './failures';
|
|
5
4
|
export { printFailure } from './failures';
|
|
5
|
+
export type { Failure } from './failures';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { checkPath } from './folderSchema';\nexport type { Folder, RootFolder } from './folderSchema';\n\nexport { NamingConvention } from './namingConvention';\n\nexport { printFailure } from './failures';\nexport type { Failure } from './failures';\n"],"names":["NamingConvention","checkPath","printFailure"],"mappings":";;;;;;;;;;;QAGSA;eAAAA,kCAAgB;;QAHhBC;eAAAA,uBAAS;;QAKTC;eAAAA,sBAAY;;;8BALK;kCAGO;0BAEJ"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/folder-lint",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "",
|
|
5
|
-
"homepage": "https://docs.st.dev/docs/frontend/folder-schema",
|
|
3
|
+
"version": "34.0.1",
|
|
4
|
+
"description": "Enum and types used to create an object with eslint-plugin-folder-schema configuration",
|
|
5
|
+
"homepage": "https://docs.st.dev/docs/frontend/uikit/folder-schema#servicetitanfolder-lint",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "https://github.com/servicetitan/uikit.git",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"glob": "~
|
|
19
|
+
"glob": "~13.0.0",
|
|
20
20
|
"minimatch": "~10.1.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@types/glob": "~
|
|
23
|
+
"@types/glob": "~9.0.0"
|
|
24
24
|
},
|
|
25
25
|
"publishConfig": {
|
|
26
26
|
"access": "public"
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"cli": {
|
|
29
29
|
"webpack": false
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "e42375d199bbc11b2f0b8881c26a8f0229446256"
|
|
32
32
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Failure } from '../failures';
|
|
2
|
-
import { NamingConvention } from '../namingConvention';
|
|
3
2
|
import {
|
|
4
3
|
alwaysArray,
|
|
5
4
|
canonicalizeAllowedFiles,
|
|
@@ -19,6 +18,7 @@ import {
|
|
|
19
18
|
RootFolder,
|
|
20
19
|
splitFilename,
|
|
21
20
|
} from '../folderSchema';
|
|
21
|
+
import { NamingConvention } from '../namingConvention';
|
|
22
22
|
|
|
23
23
|
describe('splitFilename', () => {
|
|
24
24
|
// [fileName: string, expected: string[]][]
|
package/src/folderSchema.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { glob } from 'glob';
|
|
2
2
|
import { minimatch } from 'minimatch';
|
|
3
|
-
|
|
4
3
|
import {
|
|
5
|
-
allowedFolderNameFailure,
|
|
6
4
|
allowedExtensionsFailure,
|
|
7
5
|
allowedFilesFailure,
|
|
8
|
-
|
|
6
|
+
allowedFolderNameFailure,
|
|
9
7
|
Failure,
|
|
10
8
|
fileNamingConventionFailure,
|
|
9
|
+
folderNamingConventionFailure,
|
|
11
10
|
} from './failures';
|
|
12
11
|
import { getFileBasename, getFileExtension } from './file';
|
|
13
12
|
import { alwaysLazy, MaybeLazy, memoizeConst } from './lazy';
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type { Folder, RootFolder } from './folderSchema';
|
|
2
1
|
export { checkPath } from './folderSchema';
|
|
2
|
+
export type { Folder, RootFolder } from './folderSchema';
|
|
3
3
|
|
|
4
4
|
export { NamingConvention } from './namingConvention';
|
|
5
5
|
|
|
6
|
-
export type { Failure } from './failures';
|
|
7
6
|
export { printFailure } from './failures';
|
|
7
|
+
export type { Failure } from './failures';
|