Skip to content
Merged
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
38 changes: 29 additions & 9 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
pull_request:
branches: [ "main" ]
schedule:
- cron: '0 6 * * 1' # Every Monday 06:00 UTC
- cron: '0 6 * * 1'
workflow_dispatch:

concurrency:
Expand All @@ -30,11 +30,11 @@ jobs:
matrix:
include:
- language: csharp
build-mode: autobuild # Best for .NET
build-mode: manual
- language: javascript-typescript
build-mode: none # For gulp / package.json / Playwright
build-mode: none
- language: actions
build-mode: none # For .github/workflows/*.yml
build-mode: none

steps:
- name: Checkout repository
Expand All @@ -47,15 +47,35 @@ jobs:
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
# Uncomment if you want extra queries later:
# queries: security-extended,security-and-quality

# Only needed when build-mode is "manual"
- name: Manual build (csharp)
- name: Setup .NET
if: matrix.language == 'csharp'
uses: actions/setup-dotnet@v6
with:
dotnet-version: |
8.x
9.x
10.x

- name: Setup Node.js
if: matrix.language == 'csharp'
uses: actions/setup-node@v7
with:
node-version: '22'
cache: 'npm'

- name: Install npm dependencies
if: matrix.language == 'csharp'
run: npm ci --no-fund --no-audit

- name: Build C# code for CodeQL
if: matrix.build-mode == 'manual'
working-directory: ./src
run: |
dotnet restore ./Syncfusion.Blazor.Toolkit.slnx
dotnet build ./Syncfusion.Blazor.Toolkit.slnx -c Release --no-restore
dotnet build ./Syncfusion.Blazor.Toolkit.slnx \
--configuration Release \
--no-restore

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
Expand Down
69 changes: 42 additions & 27 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
var fs = global.fs = global.fs || require('fs');
var path = require('path');
var shelljs = global.shelljs = global.shelljs || require('shelljs');
var gulp = global.gulp = global.gulp || require('gulp');
const glob = require('glob');
const { globSync } = require('glob');
const sass = require('gulp-sass')(require('sass'));
const rename = require('gulp-rename');

Expand Down Expand Up @@ -60,29 +61,41 @@ function removeCustomUse(fileContent) {
}

// Task to generate single SCSS files for Blazor toolkit.
function findComponentScss(componentFiles, themeOrder) {
const expected = themeOrder + '.scss';
return componentFiles.find((file) => path.basename(file) === expected);
}

gulp.task('combined-scss', function (done) {
// Get the all components scss files' path
var componentFiles = glob.sync(`./src/wwwroot/styles/*.scss`);
const componentFiles = globSync('./src/wwwroot/styles/*.scss');
shelljs.mkdir('-p', './src/wwwroot/styles/combined-scss/');
var getFluentScss = '';
// Place component styles as per styles order
for (var themeOrder of componentThemeOrder) {
var paths = componentFiles.filter((value) => {
return value.indexOf('styles/' + themeOrder) !== -1;
});
if (paths.length) {
getFluentScss += stripBom(fs.readFileSync(paths[0], 'utf8'));

let getFluentScss = '';
for (const themeOrder of componentThemeOrder) {
const filePath = findComponentScss(componentFiles, themeOrder);
if (filePath) {
const content = stripBom(fs.readFileSync(filePath, 'utf8'));
getFluentScss += content + '\n';
}
}
getFluentScss = removeCustomUse(getFluentScss);
fs.writeFileSync('./src/wwwroot/styles/combined-scss/fluent.scss', reorderUseRules(getFluentScss), 'utf8');
var hcBody = '';
for (var hcOrder of componentThemeOrder) {
var hcPaths = componentFiles.filter((value) => { return value.indexOf('styles/' + hcOrder) !== -1; });
if (!hcPaths.length) continue;
var content = stripBom(fs.readFileSync(hcPaths[0], 'utf8'));
if (hcOrder === 'base') content = stripRootScopes(content);
hcBody += '\n' + content;
fs.writeFileSync(
'./src/wwwroot/styles/combined-scss/fluent.scss',
reorderUseRules(getFluentScss),
'utf8'
);

let hcBody = '';
for (const hcOrder of componentThemeOrder) {
const filePath = findComponentScss(componentFiles, hcOrder);
if (!filePath) {
continue;
}
let content = stripBom(fs.readFileSync(filePath, 'utf8'));
if (hcOrder === 'base') {
content = stripRootScopes(content);
}
hcBody += '\n' + content + '\n';
}
hcBody = removeCustomUse(hcBody);
hcBody = reorderUseRules(hcBody);
Expand Down Expand Up @@ -180,15 +193,17 @@ gulp.task('scss-to-css', function (done) {
'./src/wwwroot/styles/combined-scss/_highcontrast-tokens.scss'
] }
)
.pipe(sass({ outputStyle: 'compressed' }).on('error', function (error) {
fs.appendFileSync('./gulp_error.log', 'Failed scss-to-css task\n' + error.message + '\n');
console.error('Sass Compilation Error:', error.messageFormatted);
process.exit(1);
}))
.pipe(sass({ outputStyle: 'compressed' }).on('error', function (error) {
const message = error.formatted || error.messageFormatted || error.message || String(error);
console.error('Sass compilation failed:\n' + message);
try {
fs.appendFileSync('./gulp_error.log', 'Failed scss-to-css task\n' + message + '\n');
} catch (_) { /* ignore */ }
process.exit(1);
}))
.pipe(rename({ suffix: '.min' }))
.pipe(gulp.dest('./src/wwwroot/styles'))
.on('end', cleanup)
.on('error', cleanup);
});

gulp.task('blazor-toolkit-themes', gulp.series('combined-scss', 'scss-to-css'));
Expand Down Expand Up @@ -246,7 +261,7 @@ function isXSSAllowlisted(file, line) {
gulp.task('security-xss-scan', function (done) {
let allFiles = [];
for (const pattern of XSS_SCAN_GLOBS) {
allFiles = allFiles.concat(glob.sync(pattern, {
allFiles = allFiles.concat(globSync(pattern, {
nodir: true,
ignore: [
'**/bin/**',
Expand Down Expand Up @@ -327,4 +342,4 @@ gulp.task('security-xss-scan', function (done) {
done();
});

gulp.task('security', gulp.series('security-xss-scan'));
gulp.task('security', gulp.series('security-xss-scan'));
Loading
Loading