feat(webpack): read nativescript.config.ts main if set before fallback to package.json (#9769)

implements #9658

BREAKING CHANGES:

Possibly breaking if a project has a main field set in the nativescript.config.ts - since after this lands, this value will be used instead of package.json main.

The impact is likely very small, the steps to migrate:

    (Option A) remove main from nativescript.config.ts if set
    (Option B) update main to the correct path in nativescript.config.ts if set incorrectly
This commit is contained in:
Igor Randjelovic
2022-02-18 13:39:04 +01:00
committed by GitHub
parent cb7bd2a401
commit 61ff7e4762
5 changed files with 67 additions and 8 deletions

View File

@ -147,7 +147,7 @@ export interface NativeScriptConfig {
*/
id?: string;
/**
* App's main entry file (currently ignored - set it in package.json main field)
* App's main entry file - this setting overrides the value set in package.json
*/
main?: string;
/**

View File

@ -0,0 +1,49 @@
import { env } from '../../src/';
import { addPlatform, getEntryPath } from '../../src/helpers/platform';
import { getValue } from '../../src/helpers/config';
describe('getEntryPath', () => {
it('uses platform getEntryPath if the platform specifies it', () => {
env.platform = 'testPlatform';
addPlatform('testPlatform', {
getEntryPath() {
return 'custom-entry-path';
},
});
const res = getEntryPath();
expect(res).toEqual('custom-entry-path');
// cleanup env
delete env.platform;
});
it('uses main from nativescript.config.ts if set', () => {
env.ios = true;
// mock getValue
const getValueMock = getValue as jest.Mock;
const getValueMockImpl = getValueMock.getMockImplementation();
getValueMock.mockImplementation((key) => {
if (key === 'main') {
return 'main-from-config';
}
});
const res = getEntryPath();
expect(res).toEqual('__jest__/main-from-config');
// reset mock implementation
getValueMock.mockImplementation(getValueMockImpl);
});
it('uses main from package.json', () => {
env.ios = true;
const res = getEntryPath();
// set in jest.setup.ts mock for package.json...
expect(res).toEqual('__jest__/src/app.js');
});
});

View File

@ -13,10 +13,10 @@ jest.mock('cosmiconfig', () => ({
},
}));
const getValueMock = jest.fn();
getValueMock.mockImplementation((key, defaultValue) => defaultValue);
jest.mock('../src/helpers/config.ts', () => ({
getValue(key, defaultValue) {
return defaultValue;
},
getValue: getValueMock,
}));
jest.mock('os', () => {

View File

@ -1,5 +1,5 @@
import { warnOnce } from './log';
import { env } from '../index';
import { error, warnOnce } from './log';
function getCLILib() {
if (!env.nativescriptLibPath) {
@ -28,7 +28,9 @@ export function getValue<T = any>(key: string, defaultValue?: any): T {
return defaultValue;
}
return (lib.projectConfigService as {
getValue(key: string, defaultValue?: any): T;
}).getValue(key, defaultValue);
return (
lib.projectConfigService as {
getValue(key: string, defaultValue?: any): T;
}
).getValue(key, defaultValue);
}

View File

@ -2,6 +2,7 @@ import { dirname, resolve } from 'path';
import { getPackageJson, getProjectRootPath } from './project';
import { error, info, warnOnce } from './log';
import { getValue } from './config';
import { env } from '../';
import AndroidPlatform from '../platforms/android';
@ -99,6 +100,13 @@ export function getEntryPath() {
return platform.getEntryPath();
}
// try main from nativescript.config.ts
const main = getValue('main');
if (main) {
return resolve(getProjectRootPath(), main);
}
// fallback to main field in package.json
const packageJson = getPackageJson();