Skip to content

Commit ad63862

Browse files
author
Dimitar Tachev
authored
Merge pull request #245 from NativeScript/vladimirov/fix-debug-brk
fix: debug-brk does not work with webpack
2 parents de7e5cb + fb7cc4d commit ad63862

File tree

3 files changed

+184
-45
lines changed

3 files changed

+184
-45
lines changed

src/debug-adapter/nativeScriptPathTransformer.ts

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,22 @@ export class NativeScriptPathTransformer extends UrlPathTransformer {
1212
private targetPlatform: string;
1313
private appDirPath: string;
1414
private webRoot: string;
15+
private isAndroid: boolean;
16+
private isIOS: boolean;
1517

1618
public setTransformOptions(targetPlatform: string, appDirPath: string, webRoot: string) {
1719
this.targetPlatform = targetPlatform.toLowerCase();
1820
this.appDirPath = appDirPath;
1921
this.webRoot = webRoot;
22+
this.isAndroid = this.targetPlatform === 'android';
23+
this.isIOS = this.targetPlatform === 'ios';
2024
}
2125

2226
protected async targetUrlToClientPath(scriptUrl: string): Promise<string> {
2327
if (!scriptUrl) {
2428
return;
2529
}
2630

27-
const isAndroid = this.targetPlatform === 'android';
28-
const isIOS = this.targetPlatform === 'ios';
29-
3031
if (_.startsWith(scriptUrl, 'mdha:')) {
3132
scriptUrl = _.trimStart(scriptUrl, 'mdha:');
3233
}
@@ -42,38 +43,47 @@ export class NativeScriptPathTransformer extends UrlPathTransformer {
4243
let relativePath = scriptUrl;
4344

4445
if (matches) {
45-
relativePath = isAndroid ? matches[3] : matches[2];
46+
relativePath = this.isAndroid ? matches[3] : matches[2];
4647
}
4748

48-
const nodePath = path.join('..', 'node_modules');
49-
50-
relativePath = relativePath.replace('tns_modules', nodePath);
49+
return this.getFileFromAppDir(relativePath) ||
50+
this.getFileFromNodeModulesDir(relativePath) ||
51+
this.getFileFromPlatformsDir(relativePath) ||
52+
scriptUrl;
53+
}
5154

55+
private getFileFromAppDir(rawDevicePath: string): string {
5256
if (this.appDirPath) {
53-
relativePath = relativePath.replace('app', this.appDirPath);
57+
rawDevicePath = rawDevicePath.replace('app', this.appDirPath);
5458
}
5559

56-
let absolutePath = path.resolve(path.join(this.webRoot, relativePath));
57-
let platformSpecificPath = this.getPlatformSpecificPath(absolutePath);
60+
const absolutePath = path.resolve(path.join(this.webRoot, rawDevicePath));
5861

59-
if (platformSpecificPath) {
60-
return platformSpecificPath;
61-
}
62+
return this.getPlatformSpecificPath(absolutePath);
63+
}
6264

63-
if (isAndroid) {
64-
// handle files like /data/data/internal/ts_helpers.ts
65-
absolutePath = path.resolve(path.join(this.webRoot, 'platforms', this.targetPlatform.toLowerCase(), 'app', 'src', 'main', 'assets', relativePath));
66-
} else if (isIOS) {
67-
absolutePath = path.resolve(path.join(this.webRoot, 'platforms', this.targetPlatform.toLowerCase(), this.getAppName(this.webRoot), relativePath));
68-
}
65+
private getFileFromNodeModulesDir(rawDevicePath: string): string {
66+
const nodePath = path.join('..', 'node_modules');
6967

70-
platformSpecificPath = this.getPlatformSpecificPath(absolutePath);
68+
rawDevicePath = rawDevicePath.replace('tns_modules', nodePath);
7169

72-
if (platformSpecificPath) {
73-
return platformSpecificPath;
70+
const absolutePath = path.resolve(path.join(this.webRoot, rawDevicePath));
71+
72+
return this.getPlatformSpecificPath(absolutePath);
73+
}
74+
75+
private getFileFromPlatformsDir(rawDevicePath: string): string {
76+
let absolutePath: string = null;
77+
78+
// handle files like file://app/starter.js (produced with bundle and required when using with --debug-brk)
79+
if (this.isAndroid) {
80+
// handle files like /data/data/internal/ts_helpers.ts
81+
absolutePath = path.resolve(path.join(this.webRoot, 'platforms', this.targetPlatform.toLowerCase(), 'app', 'src', 'main', 'assets', rawDevicePath));
82+
} else if (this.isIOS) {
83+
absolutePath = path.resolve(path.join(this.webRoot, 'platforms', this.targetPlatform.toLowerCase(), this.getAppName(this.webRoot), rawDevicePath));
7484
}
7585

76-
return scriptUrl;
86+
return this.getPlatformSpecificPath(absolutePath);
7787
}
7888

7989
private getPlatformSpecificPath(rawPath: string): string {
@@ -95,6 +105,6 @@ export class NativeScriptPathTransformer extends UrlPathTransformer {
95105
}
96106

97107
private getAppName(projectDir: string): string {
98-
return _.filter(projectDir.split(''), (c) => /[a-zA-Z0-9]/.test(c)).join('');
108+
return _.filter(path.basename(projectDir).split(''), (c) => /[a-zA-Z0-9]/.test(c)).join('');
99109
}
100110
}

src/tests/nativeScriptPathTransformer.tests.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ describe('NativeScriptPathTransformer', () => {
99
let nativeScriptPathTransformer: any;
1010
let existsSyncStub;
1111

12-
before(() => {
12+
beforeEach(() => {
1313
nativeScriptPathTransformer = new NativeScriptPathTransformer();
1414
});
1515

1616
describe('targetUrlToClientPath() method', () => {
17-
const webRoot = 'C:\\projectpath';
18-
1917
for (const test of tests as any) {
18+
const webRoot = test.webRoot || 'C:\\projectpath';
2019
const nsConfigPartInTestName = test.nsconfig ? " when there's nsconfig" : '';
2120

2221
it(`should transform [${test.platform}] device path ${test.scriptUrl} -> ${test.expectedResult}${nsConfigPartInTestName}`, async () => {
2322
(path as any).join = path.win32.join;
2423
(path as any).resolve = path.win32.resolve;
24+
(path as any).basename = path.win32.basename;
2525
nativeScriptPathTransformer.setTransformOptions(test.platform, test.nsconfig ? test.nsconfig.appPath : null, webRoot);
2626

2727
existsSyncStub = sinon

src/tests/pathTransformData.ts

Lines changed: 147 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,152 @@
11
/* tslint:disable:max-line-length */
22
const tests = [
3-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/main.js', expectedResult: 'C:\\projectpath\\app\\main.js', existingPath: 'C:\\projectpath\\app\\main.js' },
4-
{ platform: 'android', scriptUrl: 'VM1', expectedResult: 'VM1' },
5-
{ platform: 'android', scriptUrl: 'native prologue.js', expectedResult: 'native prologue.js' },
6-
{ platform: 'android', scriptUrl: 'v8/gc', expectedResult: 'v8/gc' },
7-
{ platform: 'android', scriptUrl: 'VM25', expectedResult: 'VM25' },
8-
{ platform: 'android', scriptUrl: '/data/data/org.nativescript.TabNavigation/files/internal/ts_helpers.js', expectedResult: `C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\internal\\ts_helpers.js`, existingPath: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\internal\\ts_helpers.js' },
9-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/nativescript-angular/platform.js', expectedResult: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform.js', existingPath: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform.js' },
10-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/nativescript-angular/platform-common.js', expectedResult: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform-common.js', existingPath: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform-common.js' },
11-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/@angular/common/bundles/common.umd.js', expectedResult: 'C:\\projectpath\\node_modules\\@angular\\common\\bundles\\common.umd.js', existingPath: 'C:\\projectpath\\node_modules\\@angular\\common\\bundles\\common.umd.js' },
12-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/gestures/gestures.js', expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\gestures\\gestures.android.js', existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\gestures\\gestures.android.js' },
13-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/frame/fragment.transitions.js', expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\frame\\fragment.transitions.android.js', existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\frame\\fragment.transitions.android.js' },
14-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/debugger/devtools-elements.common.js', expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\debugger\\devtools-elements.common.js', existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\debugger\\devtools-elements.common.js' },
15-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/page/page.js', expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\page\\page.android.js', existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\page\\page.android.js' },
16-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/layouts/layout-base.js', expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\layouts\\layout-base.android.js', existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\layouts\\layout-base.android.js' },
17-
{ platform: 'android', scriptUrl: 'ng:///css/0/data/data/org.nativescript.TabNavigation/files/app/tabs/tabs.component.scss.ngstyle.js', expectedResult: 'ng:///css/0/data/data/org.nativescript.TabNavigation/files/app/tabs/tabs.component.scss.ngstyle.js' },
18-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/main.js', expectedResult: 'C:\\projectpath\\src\\main.js', nsconfig: { appPath: 'src' }, existingPath: 'C:\\projectpath\\src\\main.js' },
19-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/app/main.js', expectedResult: 'C:\\projectpath\\src\\app\\main.js', nsconfig: { appPath: 'src' }, existingPath: 'C:\\projectpath\\src\\app\\main.js' },
20-
{ platform: 'android', scriptUrl: 'file:///data/data/org.nativescript.app1/files/app/app/main.js', expectedResult: 'C:\\projectpath\\src\\app\\main.js', nsconfig: { appPath: 'src' }, existingPath: 'C:\\projectpath\\src\\app\\main.js' },
3+
{
4+
existingPath: 'C:\\projectpath\\app\\main.js',
5+
expectedResult: 'C:\\projectpath\\app\\main.js',
6+
platform: 'android',
7+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/main.js',
8+
},
9+
{
10+
expectedResult: 'VM1',
11+
platform: 'android',
12+
scriptUrl: 'VM1',
13+
},
14+
{
15+
expectedResult: 'native prologue.js',
16+
platform: 'android',
17+
scriptUrl: 'native prologue.js',
18+
},
19+
{
20+
expectedResult: 'v8/gc',
21+
platform: 'android',
22+
scriptUrl: 'v8/gc',
23+
},
24+
{
25+
expectedResult: 'VM25',
26+
platform: 'android',
27+
scriptUrl: 'VM25',
28+
},
29+
{
30+
existingPath: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\internal\\ts_helpers.js',
31+
expectedResult: `C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\internal\\ts_helpers.js`,
32+
platform: 'android',
33+
scriptUrl: '/data/data/org.nativescript.TabNavigation/files/internal/ts_helpers.js',
34+
},
35+
{
36+
existingPath: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform.js',
37+
expectedResult: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform.js',
38+
platform: 'android',
39+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/nativescript-angular/platform.js',
40+
},
41+
{
42+
existingPath: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform-common.js',
43+
expectedResult: 'C:\\projectpath\\node_modules\\nativescript-angular\\platform-common.js',
44+
platform: 'android',
45+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/nativescript-angular/platform-common.js',
46+
},
47+
{
48+
existingPath: 'C:\\projectpath\\node_modules\\@angular\\common\\bundles\\common.umd.js',
49+
expectedResult: 'C:\\projectpath\\node_modules\\@angular\\common\\bundles\\common.umd.js',
50+
platform: 'android',
51+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/@angular/common/bundles/common.umd.js',
52+
},
53+
{
54+
existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\gestures\\gestures.android.js',
55+
expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\gestures\\gestures.android.js',
56+
platform: 'android',
57+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/gestures/gestures.js',
58+
},
59+
{
60+
existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\frame\\fragment.transitions.android.js',
61+
expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\frame\\fragment.transitions.android.js',
62+
platform: 'android',
63+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/frame/fragment.transitions.js',
64+
},
65+
{
66+
existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\debugger\\devtools-elements.common.js',
67+
expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\debugger\\devtools-elements.common.js',
68+
platform: 'android',
69+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/debugger/devtools-elements.common.js',
70+
},
71+
{
72+
existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\page\\page.android.js',
73+
expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\page\\page.android.js',
74+
platform: 'android',
75+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/page/page.js',
76+
},
77+
{
78+
existingPath: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\layouts\\layout-base.android.js',
79+
expectedResult: 'C:\\projectpath\\node_modules\\tns-core-modules\\ui\\layouts\\layout-base.android.js',
80+
platform: 'android',
81+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/tns_modules/tns-core-modules/ui/layouts/layout-base.js',
82+
},
83+
{
84+
expectedResult: 'ng:///css/0/data/data/org.nativescript.TabNavigation/files/app/tabs/tabs.component.scss.ngstyle.js',
85+
platform: 'android',
86+
scriptUrl: 'ng:///css/0/data/data/org.nativescript.TabNavigation/files/app/tabs/tabs.component.scss.ngstyle.js',
87+
},
88+
{
89+
existingPath: 'C:\\projectpath\\src\\main.js',
90+
expectedResult: 'C:\\projectpath\\src\\main.js',
91+
nsconfig: { appPath: 'src' },
92+
platform: 'android',
93+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/main.js',
94+
},
95+
{
96+
existingPath: 'C:\\projectpath\\src\\app\\main.js',
97+
expectedResult: 'C:\\projectpath\\src\\app\\main.js',
98+
nsconfig: { appPath: 'src' },
99+
platform: 'android',
100+
scriptUrl: 'file:///data/data/org.nativescript.TabNavigation/files/app/app/main.js',
101+
},
102+
{
103+
existingPath: 'C:\\projectpath\\src\\app\\main.js',
104+
expectedResult: 'C:\\projectpath\\src\\app\\main.js',
105+
nsconfig: { appPath: 'src' },
106+
platform: 'android',
107+
scriptUrl: 'file:///data/data/org.nativescript.app1/files/app/app/main.js',
108+
},
109+
{
110+
existingPath: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\app\\starter.js',
111+
expectedResult: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\app\\starter.js',
112+
nsconfig: { appPath: 'src' },
113+
platform: 'android',
114+
scriptUrl: 'file:///data/data/org.nativescript.app1/files/app/starter.js',
115+
},
116+
{
117+
existingPath: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\app\\starter.js',
118+
expectedResult: 'C:\\projectpath\\platforms\\android\\app\\src\\main\\assets\\app\\starter.js',
119+
platform: 'android',
120+
scriptUrl: 'file:///data/data/org.nativescript.app1/files/app/starter.js',
121+
},
122+
{
123+
existingPath: 'C:\\somepath\\projectpath\\platforms\\ios\\projectpath\\app\\starter.js',
124+
expectedResult: 'C:\\somepath\\projectpath\\platforms\\ios\\projectpath\\app\\starter.js',
125+
platform: 'ios',
126+
scriptUrl: 'file:///app/starter.js',
127+
webRoot: 'C:\\somepath\\projectpath',
128+
},
129+
{
130+
existingPath: 'C:\\somepath\\projectpath\\platforms\\ios\\projectpath\\app\\starter.js',
131+
expectedResult: 'C:\\somepath\\projectpath\\platforms\\ios\\projectpath\\app\\starter.js',
132+
nsconfig: { appPath: 'src' },
133+
platform: 'ios',
134+
scriptUrl: 'file:///app/starter.js',
135+
webRoot: 'C:\\somepath\\projectpath',
136+
},
137+
{
138+
existingPath: 'C:\\projectpath\\app\\main.js',
139+
expectedResult: 'C:\\projectpath\\app\\main.js',
140+
platform: 'ios',
141+
scriptUrl: 'file:///app/main.js',
142+
},
143+
{
144+
existingPath: 'C:\\projectpath\\src\\main.js',
145+
expectedResult: 'C:\\projectpath\\src\\main.js',
146+
nsconfig: { appPath: 'src' },
147+
platform: 'ios',
148+
scriptUrl: 'file:///app/main.js',
149+
},
21150
];
22151

23152
export = tests;

0 commit comments

Comments
 (0)