Skip to content

Commit a3ec0f9

Browse files
josephfrazierstefanbuck
authored andcommitted
Resolve __dirname + '/some/relative/path' (OctoLinker#364)
* Resolve `__dirname + '/some/relative/path'` Fixes OctoLinker#359 Demos: * https://github.com/pegjs/website/blob/5924ede36795192b77f2cb9bfe25a56e8e8b6f90/app.js#L12 * https://github.com/antoninlanglade/totopack/blob/055a725660a11d9c765434198edc7bb538ec5ccf/config/paths.js#L6 * Document Node.js relative path support * Dedupe JS/TS patterns/classes in relative path resolver * Match literal dot in `path.join`
1 parent cbb53a0 commit a3ec0f9

File tree

5 files changed

+75
-0
lines changed

5 files changed

+75
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ OctoLinker is the easiest and best way to navigate between files and projects on
5151
- `require`
5252
- `import`
5353
- `export`
54+
- `__dirname + '/some/relative/path'`
55+
- `path.join(__dirname, '/some/relative/path')`
5456

5557
### package.json (npm)
5658
- `main`

lib/plugins/nodejs-relative-path.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { join, dirname } from 'path';
2+
import { NODEJS_RELATIVE_PATH, NODEJS_RELATIVE_PATH_JOIN } from '../../packages/helper-grammar-regex-collection/index.js';
3+
import JavaScript from './javascript';
4+
import TypeScript from './typescript';
5+
6+
export default {
7+
name: 'NodejsRelativePath',
8+
9+
resolve({ target, path }) {
10+
return `{BASE_URL}${join(dirname(path), target)}`;
11+
},
12+
13+
getPattern() {
14+
const jsPatterns = JavaScript.getPattern().pathPatterns;
15+
const tsPatterns = TypeScript.getPattern().pathPatterns;
16+
17+
const jsClasses = JavaScript.getPattern().githubClasses;
18+
const tsClasses = TypeScript.getPattern().githubClasses;
19+
20+
return {
21+
pathPatterns: jsPatterns.concat(tsPatterns),
22+
githubClasses: jsClasses.concat(tsClasses),
23+
};
24+
},
25+
26+
getLinkRegexes() {
27+
return [NODEJS_RELATIVE_PATH, NODEJS_RELATIVE_PATH_JOIN];
28+
},
29+
};

packages/helper-grammar-regex-collection/index.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,20 @@ const captureQuotedWord = regex`
1111
const importMembers = regex`[\r\n\s\w{},*\$]*`;
1212
const from = regex`\s from \s`;
1313

14+
export const NODEJS_RELATIVE_PATH = regex`
15+
__dirname
16+
\s* \+ \s*
17+
${captureQuotedWord}
18+
`;
19+
20+
export const NODEJS_RELATIVE_PATH_JOIN = regex`
21+
path\.join \s*
22+
\( \s*
23+
__dirname \s*
24+
, \s*
25+
${captureQuotedWord}
26+
`;
27+
1428
export const REQUIRE = regex`
1529
( require(\.resolve)? | proxyquire | import | require_relative )
1630
\s* ( \s | \( ) \s*

packages/helper-grammar-regex-collection/test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ import assert from 'assert';
44
import * as REGEX from './index.js';
55

66
const fixtures = {
7+
NODEJS_RELATIVE_PATH_JOIN: {
8+
valid: [
9+
['app.set("views", path.join(__dirname, "/views");', ['/views']],
10+
],
11+
invalid: [
12+
'app.set("views", pathDjoin(__dirname, "/views");',
13+
],
14+
},
15+
NODEJS_RELATIVE_PATH: {
16+
valid: [
17+
['app.set("views", __dirname + "/views");', ['/views']],
18+
],
19+
invalid: [
20+
'app.set("views", path.join(__dirname, "/views");',
21+
],
22+
},
723
IMPORT: {
824
valid: [
925
'import foo from "foo"',
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import assert from 'assert';
2+
import plugin from '../../lib/plugins/nodejs-relative-path.js';
3+
4+
describe('nodejs-relative-path', () => {
5+
it('resolves `__dirname + "/views"` relative to the current directory', () => {
6+
assert.deepEqual(
7+
plugin.resolve({
8+
target: '/views',
9+
path: '/pegjs/website/blob/5924ede36795192b77f2cb9bfe25a56e8e8b6f90/app.js#L12',
10+
}),
11+
'{BASE_URL}/pegjs/website/blob/5924ede36795192b77f2cb9bfe25a56e8e8b6f90/views',
12+
);
13+
});
14+
});

0 commit comments

Comments
 (0)