@ms-cloudpack/path-utilities 2.1.2 → 2.2.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/lib/findPackageRoot.d.ts +3 -1
- package/lib/findPackageRoot.js +13 -6
- package/lib/findPackageRoot.js.map +1 -1
- package/lib/intermediateToSourcePath.js +1 -0
- package/lib/intermediateToSourcePath.js.map +1 -1
- package/lib/isFolderSync.js +1 -0
- package/lib/isFolderSync.js.map +1 -1
- package/package.json +1 -1
package/lib/findPackageRoot.d.ts
CHANGED
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
* Given an absolute folder path into a package, traverse up the paths
|
|
3
3
|
* until the root has been found (containing the package.json file).
|
|
4
4
|
* Returns undefined if no package root is found after traversing to the filesystem root.
|
|
5
|
+
* @param startFolder - Absolute path to the folder to start searching from.
|
|
6
|
+
* @param excludeNodeModules - If true, don't return a path that contains a `node_modules` segment.
|
|
5
7
|
*/
|
|
6
|
-
export declare function findPackageRoot(
|
|
8
|
+
export declare function findPackageRoot(startFolder: string, excludeNodeModules?: boolean): string | undefined;
|
package/lib/findPackageRoot.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
+
const nodeModulesRegex = /[\\/]node_modules($|[\\/])/;
|
|
3
4
|
/**
|
|
4
5
|
* Given an absolute folder path into a package, traverse up the paths
|
|
5
6
|
* until the root has been found (containing the package.json file).
|
|
6
7
|
* Returns undefined if no package root is found after traversing to the filesystem root.
|
|
8
|
+
* @param startFolder - Absolute path to the folder to start searching from.
|
|
9
|
+
* @param excludeNodeModules - If true, don't return a path that contains a `node_modules` segment.
|
|
7
10
|
*/
|
|
8
|
-
export function findPackageRoot(
|
|
9
|
-
const root = path.parse(
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
export function findPackageRoot(startFolder, excludeNodeModules) {
|
|
12
|
+
const root = path.parse(startFolder).root;
|
|
13
|
+
let currentFolder = startFolder;
|
|
14
|
+
if (excludeNodeModules && nodeModulesRegex.test(startFolder)) {
|
|
15
|
+
currentFolder = startFolder.split(nodeModulesRegex)[0];
|
|
16
|
+
}
|
|
17
|
+
while (!fs.existsSync(path.join(currentFolder, 'package.json'))) {
|
|
18
|
+
if (currentFolder === root) {
|
|
12
19
|
return undefined;
|
|
13
20
|
}
|
|
14
|
-
|
|
21
|
+
currentFolder = path.dirname(currentFolder);
|
|
15
22
|
}
|
|
16
|
-
return
|
|
23
|
+
return currentFolder;
|
|
17
24
|
}
|
|
18
25
|
//# sourceMappingURL=findPackageRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findPackageRoot.js","sourceRoot":"","sources":["../src/findPackageRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB
|
|
1
|
+
{"version":3,"file":"findPackageRoot.js","sourceRoot":"","sources":["../src/findPackageRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,kBAA4B;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;IAC1C,IAAI,aAAa,GAAG,WAAW,CAAC;IAChC,IAAI,kBAAkB,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QAC5D,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;KACxD;IAED,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE;QAC/D,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,OAAO,SAAS,CAAC;SAClB;QACD,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;KAC7C;IAED,OAAO,aAAa,CAAC;AACvB,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nconst nodeModulesRegex = /[\\\\/]node_modules($|[\\\\/])/;\n\n/**\n * Given an absolute folder path into a package, traverse up the paths\n * until the root has been found (containing the package.json file).\n * Returns undefined if no package root is found after traversing to the filesystem root.\n * @param startFolder - Absolute path to the folder to start searching from.\n * @param excludeNodeModules - If true, don't return a path that contains a `node_modules` segment.\n */\nexport function findPackageRoot(startFolder: string, excludeNodeModules?: boolean): string | undefined {\n const root = path.parse(startFolder).root;\n let currentFolder = startFolder;\n if (excludeNodeModules && nodeModulesRegex.test(startFolder)) {\n currentFolder = startFolder.split(nodeModulesRegex)[0];\n }\n\n while (!fs.existsSync(path.join(currentFolder, 'package.json'))) {\n if (currentFolder === root) {\n return undefined;\n }\n currentFolder = path.dirname(currentFolder);\n }\n\n return currentFolder;\n}\n"]}
|
|
@@ -31,6 +31,7 @@ export function intermediateToSourcePath(relativeIntermediatePath, rootPath) {
|
|
|
31
31
|
}
|
|
32
32
|
let match = candidates.find((candidate) => {
|
|
33
33
|
const resolvedPath = path.resolve(rootPath, candidate);
|
|
34
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
34
35
|
return isFileSync(resolvedPath);
|
|
35
36
|
});
|
|
36
37
|
// Re-add the leading period.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intermediateToSourcePath.js","sourceRoot":"","sources":["../src/intermediateToSourcePath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,wBAAgC,EAAE,QAAgB;IACzF,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,qCAAqC;IACrC,OACE,KAAK,CAAC,MAAM;QACZ,gBAAgB,GAAG,KAAK,CAAC,MAAM;QAC/B,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,EACjG;QACA,gBAAgB,EAAE,CAAC;KACpB;IAED,mFAAmF;IACnF,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,GAAG,CAAC,EAAE;QACvC,MAAM,kBAAkB,GACtB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,kBAAkB;YACnC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAE9D,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE;YAC3C,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACrF,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CACpE,CAAC;SACH;QAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9D,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;KAClD;IAED,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACpC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;KACtB;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import path from 'path';\nimport { isFileSync } from './isFileSync.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Takes a relative intermediate content path (e.g. \"lib/foo/bar.js\") and resolves it to a source content path\n * (e.g. \"/src/foo/foo.tsx\"). Note: source files must exist so that the utility can resolve the source.\n */\nexport function intermediateToSourcePath(relativeIntermediatePath: string, rootPath: string): string | undefined {\n const candidates = [];\n const parts = slash(relativeIntermediatePath).split('/');\n let firstFolderIndex = 0;\n\n // Find first folder in relative path\n while (\n parts.length &&\n firstFolderIndex < parts.length &&\n (!parts[firstFolderIndex] || parts[firstFolderIndex] === '.' || parts[firstFolderIndex] === '..')\n ) {\n firstFolderIndex++;\n }\n\n // If there is at least 1 folder and 1 filename in the path, add source candidates.\n if (parts.length - firstFolderIndex > 1) {\n const isIntermediatePath =\n ['lib', 'lib-amd', 'lib-esm', 'lib-commonjs', 'dist'].indexOf(parts[firstFolderIndex]) >= 0;\n const sourcePath = isIntermediatePath\n ? path.dirname(parts.map((v, i) => (i === firstFolderIndex ? 'src' : v)).join('/'))\n : path.dirname(relativeIntermediatePath);\n\n const ext = path.extname(relativeIntermediatePath);\n const basename = path.basename(relativeIntermediatePath, ext);\n\n if (!ext || ext === '.js' || ext === '.mjs') {\n ['.tsx', '.ts', '.mtsx', '.mts', '.jsx', '.mjs', '.js', '.cjs', ''].forEach((newExt) =>\n candidates.unshift(slash(path.join(sourcePath, basename + newExt))),\n );\n }\n\n candidates.push(slash(path.join(sourcePath, basename + ext)));\n\n candidates.push(slash(relativeIntermediatePath));\n }\n\n let match = candidates.find((candidate) => {\n const resolvedPath = path.resolve(rootPath, candidate);\n return isFileSync(resolvedPath);\n });\n\n // Re-add the leading period.\n if (match && !match.startsWith('./')) {\n match = './' + match;\n }\n\n return match;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"intermediateToSourcePath.js","sourceRoot":"","sources":["../src/intermediateToSourcePath.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,wBAAgC,EAAE,QAAgB;IACzF,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,qCAAqC;IACrC,OACE,KAAK,CAAC,MAAM;QACZ,gBAAgB,GAAG,KAAK,CAAC,MAAM;QAC/B,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,EACjG;QACA,gBAAgB,EAAE,CAAC;KACpB;IAED,mFAAmF;IACnF,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,GAAG,CAAC,EAAE;QACvC,MAAM,kBAAkB,GACtB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,kBAAkB;YACnC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAE9D,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE;YAC3C,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACrF,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CACpE,CAAC;SACH;QAED,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9D,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;KAClD;IAED,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,gDAAgD;QAChD,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QACpC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;KACtB;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import path from 'path';\nimport { isFileSync } from './isFileSync.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\n\n/**\n * Takes a relative intermediate content path (e.g. \"lib/foo/bar.js\") and resolves it to a source content path\n * (e.g. \"/src/foo/foo.tsx\"). Note: source files must exist so that the utility can resolve the source.\n */\nexport function intermediateToSourcePath(relativeIntermediatePath: string, rootPath: string): string | undefined {\n const candidates = [];\n const parts = slash(relativeIntermediatePath).split('/');\n let firstFolderIndex = 0;\n\n // Find first folder in relative path\n while (\n parts.length &&\n firstFolderIndex < parts.length &&\n (!parts[firstFolderIndex] || parts[firstFolderIndex] === '.' || parts[firstFolderIndex] === '..')\n ) {\n firstFolderIndex++;\n }\n\n // If there is at least 1 folder and 1 filename in the path, add source candidates.\n if (parts.length - firstFolderIndex > 1) {\n const isIntermediatePath =\n ['lib', 'lib-amd', 'lib-esm', 'lib-commonjs', 'dist'].indexOf(parts[firstFolderIndex]) >= 0;\n const sourcePath = isIntermediatePath\n ? path.dirname(parts.map((v, i) => (i === firstFolderIndex ? 'src' : v)).join('/'))\n : path.dirname(relativeIntermediatePath);\n\n const ext = path.extname(relativeIntermediatePath);\n const basename = path.basename(relativeIntermediatePath, ext);\n\n if (!ext || ext === '.js' || ext === '.mjs') {\n ['.tsx', '.ts', '.mtsx', '.mts', '.jsx', '.mjs', '.js', '.cjs', ''].forEach((newExt) =>\n candidates.unshift(slash(path.join(sourcePath, basename + newExt))),\n );\n }\n\n candidates.push(slash(path.join(sourcePath, basename + ext)));\n\n candidates.push(slash(relativeIntermediatePath));\n }\n\n let match = candidates.find((candidate) => {\n const resolvedPath = path.resolve(rootPath, candidate);\n // eslint-disable-next-line no-restricted-syntax\n return isFileSync(resolvedPath);\n });\n\n // Re-add the leading period.\n if (match && !match.startsWith('./')) {\n match = './' + match;\n }\n\n return match;\n}\n"]}
|
package/lib/isFolderSync.js
CHANGED
package/lib/isFolderSync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isFolderSync.js","sourceRoot":"","sources":["../src/isFolderSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI;QACF,OAAO,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,WAAW;KACZ;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import fs from 'fs';\n\nexport function isFolderSync(itemPath: string): boolean {\n try {\n return fs.lstatSync(itemPath)?.isDirectory();\n } catch (e) {\n /* no-op */\n }\n\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"isFolderSync.js","sourceRoot":"","sources":["../src/isFolderSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI;QACF,gDAAgD;QAChD,OAAO,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,WAAW;KACZ;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import fs from 'fs';\n\nexport function isFolderSync(itemPath: string): boolean {\n try {\n // eslint-disable-next-line no-restricted-syntax\n return fs.lstatSync(itemPath)?.isDirectory();\n } catch (e) {\n /* no-op */\n }\n\n return false;\n}\n"]}
|