@ms-cloudpack/path-utilities 2.3.3 → 2.3.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"intermediateToSourcePath.d.ts","sourceRoot":"","sources":["../src/intermediateToSourcePath.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,wBAAwB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA2C/G"}
1
+ {"version":3,"file":"intermediateToSourcePath.d.ts","sourceRoot":"","sources":["../src/intermediateToSourcePath.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,wBAAwB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuD/G"}
@@ -2,37 +2,47 @@ import path from 'path';
2
2
  import { isFileSync } from './isFileSync.js';
3
3
  import { slash } from '@ms-cloudpack/path-string-parsing';
4
4
  import { sourceExtensions } from './sourceExtensions.js';
5
- const tryExtensions = [...sourceExtensions, ''];
5
+ const intermediateFolderNames = ['lib', 'lib-amd', 'lib-esm', 'lib-commonjs', 'dist'];
6
+ const sourceFolderName = 'src';
6
7
  /**
7
8
  * Takes a relative intermediate content path (e.g. "lib/foo/bar.js") and resolves it to a source content path
8
9
  * (e.g. "/src/foo/foo.tsx"). Note: source files must exist so that the utility can resolve the source.
9
10
  */
10
11
  export function intermediateToSourcePath(relativeIntermediatePath, rootPath) {
11
12
  const candidates = [];
12
- const parts = slash(relativeIntermediatePath).split('/');
13
- let firstFolderIndex = 0;
14
- // Find first folder in relative path
15
- while (parts.length &&
16
- firstFolderIndex < parts.length &&
17
- (!parts[firstFolderIndex] || parts[firstFolderIndex] === '.' || parts[firstFolderIndex] === '..')) {
18
- firstFolderIndex++;
19
- }
20
- // If there is at least 1 folder and 1 filename in the path, add source candidates.
21
- if (parts.length - firstFolderIndex > 1) {
22
- const isIntermediatePath = ['lib', 'lib-amd', 'lib-esm', 'lib-commonjs', 'dist'].indexOf(parts[firstFolderIndex]) >= 0;
23
- const sourcePath = isIntermediatePath
24
- ? path.dirname(parts.map((v, i) => (i === firstFolderIndex ? 'src' : v)).join('/'))
25
- : path.dirname(relativeIntermediatePath);
26
- const ext = path.extname(relativeIntermediatePath);
27
- const basename = path.basename(relativeIntermediatePath, ext);
28
- if (!ext || ext === '.js' || ext === '.mjs') {
29
- tryExtensions.forEach((newExt) => candidates.unshift(slash(path.join(sourcePath, basename + newExt))));
13
+ const originalExt = path.extname(relativeIntermediatePath);
14
+ const originalPath = path.dirname(relativeIntermediatePath);
15
+ const basename = path.basename(relativeIntermediatePath, sourceExtensions.includes(originalExt) ? originalExt : undefined);
16
+ // Find first non "." or ".." folder in relative path
17
+ const parts = slash(originalPath).split('/');
18
+ // Iterate through parts until we find the first folder name. If the folder name
19
+ // is a known intermediate folder name, then we can replace it with the source folder name
20
+ // and push all candidates to the candidates array.
21
+ for (let i = 0; i < parts.length; i++) {
22
+ const part = parts[i];
23
+ if (part !== '.' && part !== '..') {
24
+ if (intermediateFolderNames.includes(part)) {
25
+ // Join the parts back together, replacing the part with the source folder name.
26
+ const newPath = parts.map((v, j) => (j === i ? sourceFolderName : v)).join('/');
27
+ // Push all possible source extensions.
28
+ candidates.push(...sourceExtensions.map((ext) => path.join(newPath, basename + ext)));
29
+ // Push the original.
30
+ candidates.push(path.join(newPath, basename));
31
+ }
32
+ break;
30
33
  }
31
- candidates.push(slash(path.join(sourcePath, basename + ext)));
32
- candidates.push(slash(relativeIntermediatePath));
33
34
  }
35
+ // Push the original path with all supported source extensions.
36
+ candidates.push(...sourceExtensions.map((ext) => path.join(originalPath, basename + ext)));
37
+ // And finally push the original path with the original extension in case it wasn't
38
+ // covered.
39
+ candidates.push(relativeIntermediatePath);
34
40
  // eslint-disable-next-line @ms-cloudpack/internal/no-sync-filesystem
35
41
  let match = candidates.find((candidate) => isFileSync(path.resolve(rootPath, candidate)));
42
+ // Ensure correct path direction.
43
+ if (match) {
44
+ match = slash(match);
45
+ }
36
46
  // Re-add the leading period.
37
47
  if (match && !match.startsWith('./')) {
38
48
  match = './' + match;
@@ -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;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,aAAa,GAAG,CAAC,GAAG,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAEhD;;;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,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SACxG;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,qEAAqE;IACrE,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAE1F,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';\nimport { sourceExtensions } from './sourceExtensions.js';\n\nconst tryExtensions = [...sourceExtensions, ''];\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 tryExtensions.forEach((newExt) => candidates.unshift(slash(path.join(sourcePath, basename + newExt))));\n }\n\n candidates.push(slash(path.join(sourcePath, basename + ext)));\n\n candidates.push(slash(relativeIntermediatePath));\n }\n\n // eslint-disable-next-line @ms-cloudpack/internal/no-sync-filesystem\n let match = candidates.find((candidate) => isFileSync(path.resolve(rootPath, candidate)));\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":"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","sourcesContent":["import path from 'path';\nimport { isFileSync } from './isFileSync.js';\nimport { slash } from '@ms-cloudpack/path-string-parsing';\nimport { sourceExtensions } from './sourceExtensions.js';\n\nconst intermediateFolderNames = ['lib', 'lib-amd', 'lib-esm', 'lib-commonjs', 'dist'];\nconst sourceFolderName = 'src';\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 originalExt = path.extname(relativeIntermediatePath);\n const originalPath = path.dirname(relativeIntermediatePath);\n const basename = path.basename(\n relativeIntermediatePath,\n sourceExtensions.includes(originalExt) ? originalExt : undefined,\n );\n\n // Find first non \".\" or \"..\" folder in relative path\n const parts = slash(originalPath).split('/');\n\n // Iterate through parts until we find the first folder name. If the folder name\n // is a known intermediate folder name, then we can replace it with the source folder name\n // and push all candidates to the candidates array.\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (part !== '.' && part !== '..') {\n if (intermediateFolderNames.includes(part)) {\n // Join the parts back together, replacing the part with the source folder name.\n const newPath = parts.map((v, j) => (j === i ? sourceFolderName : v)).join('/');\n\n // Push all possible source extensions.\n candidates.push(...sourceExtensions.map((ext) => path.join(newPath, basename + ext)));\n\n // Push the original.\n candidates.push(path.join(newPath, basename));\n }\n\n break;\n }\n }\n\n // Push the original path with all supported source extensions.\n candidates.push(...sourceExtensions.map((ext) => path.join(originalPath, basename + ext)));\n\n // And finally push the original path with the original extension in case it wasn't\n // covered.\n candidates.push(relativeIntermediatePath);\n\n // eslint-disable-next-line @ms-cloudpack/internal/no-sync-filesystem\n let match = candidates.find((candidate) => isFileSync(path.resolve(rootPath, candidate)));\n\n // Ensure correct path direction.\n if (match) {\n match = slash(match);\n }\n\n // Re-add the leading period.\n if (match && !match.startsWith('./')) {\n match = './' + match;\n }\n\n return match;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/path-utilities",
3
- "version": "2.3.3",
3
+ "version": "2.3.4",
4
4
  "description": "Utilities for resolving paths between source/intermediate/output locations in Cloudpack.",
5
5
  "license": "MIT",
6
6
  "type": "module",