Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/m365/spfx/commands/project/project-doctor.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ describe(commands.PROJECT_DOCTOR, () => {
});

it('e2e: shows correct number of findings for a valid 1.22.0-beta.1 project', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1220-beta.1-webpart-react'));
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1220-rc.0-webpart-react'));

await command.action(logger, { options: {} } as any);
const findings: FindingToReport[] = log[0];
Expand Down
2 changes: 1 addition & 1 deletion src/m365/spfx/commands/project/project-doctor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class SpfxProjectDoctorCommand extends BaseProjectCommand {
'1.20.0',
'1.21.0',
'1.21.1',
'1.22.0-beta.1'
'1.22.0-rc.0'
];

protected get allowedOutputs(): string[] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export default [
new FN002013_DEVDEP_types_webpack_env('~1.15.2'),
new FN002015_DEVDEP_types_react('17'),
new FN002016_DEVDEP_types_react_dom('17'),
new FN002021_DEVDEP_rushstack_eslint_config('4.3.0'),
new FN002022_DEVDEP_typescript('5.3.3'),
new FN002021_DEVDEP_rushstack_eslint_config('4.5.2'),
new FN002022_DEVDEP_typescript('~5.8.0'),
new FN021001_PKG_spfx_deps_versions_match_project_version(true)
];
3 changes: 3 additions & 0 deletions src/m365/spfx/commands/project/project-model/PackageJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,8 @@ export interface PackageJson extends JsonFile {
'package-solution'?: string;
start?: string;
test?: string;
'test-only'?: string;
'trust-dev-cert'?: string;
'untrust-dev-cert'?: string;
}
}
50 changes: 25 additions & 25 deletions src/m365/spfx/commands/project/project-upgrade.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3506,69 +3506,69 @@ describe(commands.PROJECT_UPGRADE, () => {
});
//#endregion

//#region 1.22.1
it('e2e: shows correct number of findings for upgrading ace 1.21.1 project to 1.22.0-beta.1', async () => {
//#region 1.21.1
it('e2e: shows correct number of findings for upgrading ace 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-ace'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 42);
assert.strictEqual(findings.length, 50);
});

it('e2e: shows correct number of findings for upgrading application customizer 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading application customizer 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-applicationcustomizer'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 44);
assert.strictEqual(findings.length, 52);
});

it('e2e: shows correct number of findings for upgrading field customizer react 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading field customizer react 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-fieldcustomizer-react'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 44);
assert.strictEqual(findings.length, 52);
});

it('e2e: shows correct number of findings for upgrading form customizer react 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading form customizer react 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-formcustomizer-react'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 46);
assert.strictEqual(findings.length, 54);
});

it('e2e: shows correct number of findings for upgrading list view command set 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading list view command set 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-listviewcommandset'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 44);
assert.strictEqual(findings.length, 52);
});

it('e2e: shows correct number of findings for upgrading no framework web part 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading no framework web part 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-webpart-nolib'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 46);
assert.strictEqual(findings.length, 54);
});

it('e2e: shows correct number of findings for upgrading react web part 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading react web part 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-webpart-react'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 47);
assert.strictEqual(findings.length, 55);
});

it('e2e: shows correct number of findings for upgrading web part with optional dependencies 1.21.1 project to 1.22.0-beta.1', async () => {
it('e2e: shows correct number of findings for upgrading web part with optional dependencies 1.21.1 project to 1.22.0-rc.0', async () => {
sinon.stub(command as any, 'getProjectRoot').callsFake(_ => path.join(process.cwd(), 'src/m365/spfx/commands/project/test-projects/spfx-1211-webpart-optionaldeps'));

await command.action(logger, { options: { toVersion: '1.22.0-beta.1', preview: true, output: 'json' } } as any);
await command.action(logger, { options: { toVersion: '1.22.0-rc.0', preview: true, output: 'json' } } as any);
const findings: FindingToReport[] = log[0];
assert.strictEqual(findings.length, 55);
assert.strictEqual(findings.length, 63);
});
//#endregion

Expand Down
2 changes: 1 addition & 1 deletion src/m365/spfx/commands/project/project-upgrade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ class SpfxProjectUpgradeCommand extends BaseProjectCommand {
'1.20.0',
'1.21.0',
'1.21.1',
'1.22.0-beta.1'
'1.22.0-rc.0'
];

public static ERROR_NO_PROJECT_ROOT_FOLDER: number = 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { DependencyRule } from "./DependencyRule.js";

export class FN002033_DEVDEP_jest_junit extends DependencyRule {
export class FN002033_DEVDEP_css_loader extends DependencyRule {
constructor(packageVersion: string) {
super('jest-junit', packageVersion, true);
super('css-loader', packageVersion, true);
}

get id(): string {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DependencyRule } from "./DependencyRule.js";

export class FN002034_DEVDEP_microsoft_spfx_heft_plugins extends DependencyRule {
constructor(packageVersion: string) {
super('@microsoft/spfx-heft-plugins', packageVersion, true);
}

get id(): string {
return 'FN002034';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { DependencyRule } from "./DependencyRule.js";

export class FN002035_DEVDEP_types_heft_jest extends DependencyRule {
constructor(packageVersion: string) {
super('@types/heft-jest', packageVersion, true);
}

get id(): string {
return 'FN002035';
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import assert from 'assert';
import { Project } from '../../project-model/index.js';
import { Finding } from '../../report-model/index.js';
import { FN021014_PKG_scripts_test_only } from './FN021014_PKG_scripts_test_only.js';

describe('FN021014_PKG_scripts_test_only', () => {
let findings: Finding[];
let rule: FN021014_PKG_scripts_test_only;

beforeEach(() => {
findings = [];
rule = new FN021014_PKG_scripts_test_only('heft run --only test --');
});

it(`doesn't return notification if package.json is not available`, () => {
const project: Project = {
path: '/usr/tmp'
};
rule.visit(project, findings);
assert.strictEqual(findings.length, 0);
});

it(`returns notification if scripts property is not defined`, () => {
const project: Project = {
path: '/usr/tmp',
packageJson: {}
};
rule.visit(project, findings);
assert.strictEqual(findings.length, 1);
});

it(`returns notification if scripts.test-only property is not defined`, () => {
const project: Project = {
path: '/usr/tmp',
packageJson: {
scripts: {}
}
};
rule.visit(project, findings);
assert.strictEqual(findings.length, 1);
});

it(`returns notification if scripts.test-only property is different than expected`, () => {
const project: Project = {
path: '/usr/tmp',
packageJson: {
scripts: {
'test-only': 'test-only'
}
}
};
rule.visit(project, findings);
assert.strictEqual(findings.length, 1);
});

it(`returns correct node when scripts.test-only is set to a string`, () => {
const project: Project = {
path: '/usr/tmp',
packageJson: {
scripts: {
'test-only': 'test-only'
},
source: JSON.stringify({
scripts: {
'test-only': 'test-only'
}
}, null, 2)
}
};
rule.visit(project, findings);
assert.strictEqual(findings[0].occurrences[0].position?.line, 3);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { JsonRule } from "../../JsonRule.js";
import { Project } from "../../project-model/index.js";
import { Finding } from "../../report-model/index.js";

export class FN021014_PKG_scripts_test_only extends JsonRule {
constructor(private script: string) {
super();
}

get id(): string {
return 'FN021014';
}

get title(): string {
return 'package.json scripts.test-only';
}

get description(): string {
return 'Add package.json scripts.test-only property';
}

get resolution(): string {
return `{
"scripts": {
"test-only": "${this.script}"
}
}`;
}

get resolutionType(): string {
return 'json';
}

get severity(): string {
return 'Required';
}

get file(): string {
return './package.json';
}

visit(project: Project, findings: Finding[]): void {
if (!project.packageJson) {
return;
}

if (!project.packageJson.scripts ||
typeof project.packageJson.scripts !== 'object' ||
!project.packageJson.scripts['test-only'] ||
project.packageJson.scripts['test-only'] !== this.script) {
const node = this.getAstNodeFromFile(project.packageJson, 'scripts.test-only');
this.addFindingWithPosition(findings, node);
}
}
}
Loading
Loading