@servicetitan/folder-lint 32.3.1 → 32.3.2
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.js +4 -9
- package/dist/folderSchema.js.map +1 -1
- package/package.json +4 -4
- package/src/folderSchema.ts +1 -1
package/dist/folderSchema.js
CHANGED
|
@@ -56,16 +56,11 @@ _export(exports, {
|
|
|
56
56
|
}
|
|
57
57
|
});
|
|
58
58
|
const _glob = require("glob");
|
|
59
|
-
const _minimatch =
|
|
59
|
+
const _minimatch = require("minimatch");
|
|
60
60
|
const _failures = require("./failures");
|
|
61
61
|
const _file = require("./file");
|
|
62
62
|
const _lazy = require("./lazy");
|
|
63
63
|
const _namingConvention = require("./namingConvention");
|
|
64
|
-
function _interop_require_default(obj) {
|
|
65
|
-
return obj && obj.__esModule ? obj : {
|
|
66
|
-
default: obj
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
64
|
function checkPath(rawCfg) {
|
|
70
65
|
const cfg = canonicalizeConfig((0, _lazy.alwaysLazy)(rawCfg));
|
|
71
66
|
const memoCfg = memoizeConfig(cfg)();
|
|
@@ -137,7 +132,7 @@ function splitFilename(filename) {
|
|
|
137
132
|
return path;
|
|
138
133
|
}
|
|
139
134
|
function isAllowedFolderName(pattern, folderName) {
|
|
140
|
-
return (0, _minimatch.
|
|
135
|
+
return (0, _minimatch.minimatch)(folderName, pattern);
|
|
141
136
|
}
|
|
142
137
|
function checkFolder(cfg, subPath, folderName) {
|
|
143
138
|
if (cfg.ignore) {
|
|
@@ -183,7 +178,7 @@ function checkFolderNamingConvention(namingConvention, folderName, parentName) {
|
|
|
183
178
|
return [];
|
|
184
179
|
}
|
|
185
180
|
function checkFileName(allowedFiles, fileName, folderName) {
|
|
186
|
-
const isMatch = allowedFiles.some((af)=>(0, _minimatch.
|
|
181
|
+
const isMatch = allowedFiles.some((af)=>(0, _minimatch.minimatch)(fileName, af));
|
|
187
182
|
if (!isMatch) {
|
|
188
183
|
return [
|
|
189
184
|
(0, _failures.allowedFilesFailure)({
|
|
@@ -209,7 +204,7 @@ function checkFileNamingConvention(namingConvention, fileName, folderName) {
|
|
|
209
204
|
}
|
|
210
205
|
function checkFileExt(allowedExtensions, fileName, folderName) {
|
|
211
206
|
const fileExt = (0, _file.getFileExtension)(fileName);
|
|
212
|
-
const isMatch = allowedExtensions.some((ae)=>(0, _minimatch.
|
|
207
|
+
const isMatch = allowedExtensions.some((ae)=>(0, _minimatch.minimatch)(fileExt, ae));
|
|
213
208
|
if (!isMatch) {
|
|
214
209
|
return [
|
|
215
210
|
(0, _failures.allowedExtensionsFailure)({
|
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":"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"}
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/folder-lint",
|
|
3
|
-
"version": "32.3.
|
|
3
|
+
"version": "32.3.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"homepage": "https://docs.st.dev/docs/frontend/folder-schema",
|
|
6
6
|
"repository": {
|
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"glob": "~11.0.3",
|
|
20
|
-
"minimatch": "~
|
|
20
|
+
"minimatch": "~10.1.1"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/glob": "~8.1.0",
|
|
24
|
-
"@types/minimatch": "~
|
|
24
|
+
"@types/minimatch": "~6.0.0"
|
|
25
25
|
},
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"cli": {
|
|
30
30
|
"webpack": false
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "06eacdb0bdeb763f5aeead1437443d794aeb80b4"
|
|
33
33
|
}
|
package/src/folderSchema.ts
CHANGED