Skip to content

Commit 0e27b64

Browse files
authored
Merge pull request #1015 from bajrangCoder/workflow-tweaks@2
Added Biome linter and formatter with ci
2 parents 2b356bc + 2a2da39 commit 0e27b64

File tree

175 files changed

+36129
-35318
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

175 files changed

+36129
-35318
lines changed

.github/workflows/ci.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,17 @@ jobs:
2323

2424
- name: Run spell check
2525
run: cspell
26+
27+
quality:
28+
name: Linting and formatting
29+
runs-on: ubuntu-latest
30+
31+
steps:
32+
- name: Checkout repository
33+
uses: actions/checkout@v4
34+
35+
- name: Setup Biome
36+
uses: biomejs/setup-biome@v2
37+
38+
- name: Run Biome
39+
run: biome ci .

biome.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
3+
"organizeImports": {
4+
"enabled": true
5+
},
6+
"linter": {
7+
"enabled": true,
8+
"rules": {
9+
"recommended": false,
10+
"complexity": {
11+
"noStaticOnlyClass": "error",
12+
"noUselessSwitchCase": "error",
13+
"useFlatMap": "error"
14+
},
15+
"style": {
16+
"noNegationElse": "off",
17+
"useForOf": "error",
18+
"useNodejsImportProtocol": "error",
19+
"useNumberNamespace": "error"
20+
},
21+
"suspicious": {
22+
"noDoubleEquals": "error",
23+
"noThenProperty": "error",
24+
"useIsArray": "error"
25+
}
26+
}
27+
},
28+
"files": {
29+
"include": ["src/**/*", "utils/**/*.js", "www/**/*.js", "www/res/**/*.css"],
30+
"ignore": [
31+
"www/js/**/*.js",
32+
"www/css/**/*.css",
33+
"src/plugins/**/*",
34+
"plugins/**/*",
35+
"hooks/**/*",
36+
"fastlane/**/*",
37+
"res/**/*",
38+
"platforms/**/*"
39+
]
40+
}
41+
}

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
"clean": "sh utils/scripts/clean.sh android android",
1111
"plugin": "sh utils/scripts/plugin.sh",
1212
"setup": "node ./utils/setup.js",
13-
"spellcheck": "npx cspell"
13+
"spellcheck": "npx cspell",
14+
"lint": "biome lint --write",
15+
"format": "biome format --write",
16+
"check": "biome check --write"
1417
},
1518
"keywords": [
1619
"ecosystem:cordova"
@@ -50,6 +53,7 @@
5053
"@babel/preset-env": "^7.24.6",
5154
"@babel/runtime": "^7.24.6",
5255
"@babel/runtime-corejs3": "^7.24.6",
56+
"@biomejs/biome": "1.8.3",
5357
"@types/ace": "^0.0.52",
5458
"@types/url-parse": "^1.4.11",
5559
"autoprefixer": "^10.4.19",
@@ -102,4 +106,4 @@
102106
"yargs": "^17.7.2"
103107
},
104108
"browserslist": "cover 100%,not android < 5"
105-
}
109+
}

readme.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,27 @@ yarn setup
6363
yarn build <platform (android)> <free|paid> <p|prod|d|dev>
6464
```
6565

66+
## • Contributing
67+
68+
Acode Editor is an open-source project, and we welcome contributions from the community. To contribute, follow these steps:
69+
70+
1. Fork the repository.
71+
2. Make your changes and commit them.
72+
3. Push your changes to your fork.
73+
4. Create a pull request and Wait for review.
74+
75+
Please ensure that your code is clean, well-formatted, and follows the project's coding standards. Acode uses [Biomejs](https://biomejs.dev/) for formatting and linting. You can use following commands to lints/format your code locally:
76+
```shell
77+
yarn lint # for linting
78+
yarn format # for formatting
79+
yarn spellcheck # for spellchecking
80+
```
81+
Also, ensure that your code is well-documented and includes comments where necessary.
82+
83+
> [!Note]
84+
> You can use any package manager like npm or yarn or pnpm or bun.
85+
> You can use your editor specific Biomejs plugin for auto-formatting and linting based on Acode's configs.
86+
6687
## • Developing a Plugin for Acode
6788

6889
For comprehensive documentation on creating plugins for Acode Editor, visit the [repository](https://github.com/deadlyjack/acode-plugin).

src/ace/colorView.js

Lines changed: 115 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
* @see https://github.com/easylogic/ace-colorpicker/blob/main/src/extension/ace/colorview.js
44
*/
55

6-
import Color from 'utils/color';
7-
import { HEX, HSL, HSLA, RGB, RGBA, isValidColor } from 'utils/color/regex';
6+
import Color from "utils/color";
7+
import { HEX, HSL, HSLA, RGB, RGBA, isValidColor } from "utils/color/regex";
88

9-
const COLORPICKER_TOKEN_CLASS = '.ace_color';
9+
const COLORPICKER_TOKEN_CLASS = ".ace_color";
1010
const changedRules = [];
1111

1212
let editor = null;
@@ -17,139 +17,140 @@ let editor = null;
1717
* @param {boolean} [force=false] Force update color view
1818
*/
1919
export default function initColorView(e, force = false) {
20-
editor = e;
21-
const { renderer } = editor;
20+
editor = e;
21+
const { renderer } = editor;
2222

23-
editor.on('changeMode', onChangeMode);
24-
renderer.on('afterRender', afterRender);
23+
editor.on("changeMode", onChangeMode);
24+
renderer.on("afterRender", afterRender);
2525

26-
if (force) {
27-
const { files } = editorManager;
26+
if (force) {
27+
const { files } = editorManager;
2828

29-
if (Array.isArray(files)) {
30-
files.forEach(file => {
31-
if (file.session) {
32-
file.session._addedColorRule = false;
33-
}
34-
});
35-
}
29+
if (Array.isArray(files)) {
30+
files.forEach((file) => {
31+
if (file.session) {
32+
file.session._addedColorRule = false;
33+
}
34+
});
35+
}
3636

37-
onChangeMode();
38-
}
37+
onChangeMode();
38+
}
3939
}
4040

4141
export function deactivateColorView() {
42-
const { renderer } = editor;
42+
const { renderer } = editor;
4343

44-
changedRules.forEach((rule) => rule.shift());
45-
changedRules.length = 0;
46-
forceTokenizer();
44+
changedRules.forEach((rule) => rule.shift());
45+
changedRules.length = 0;
46+
forceTokenizer();
4747

48-
editor.off('changeMode', onChangeMode);
49-
renderer.off('afterRender', afterRender);
48+
editor.off("changeMode", onChangeMode);
49+
renderer.off("afterRender", afterRender);
5050
}
5151

5252
/**
5353
* Checks if the session supports color
54-
* @param {AceAjax.IEditSession} session
55-
* @returns
54+
* @param {AceAjax.IEditSession} session
55+
* @returns
5656
*/
5757
function sessionSupportsColor(session) {
58-
const mode = session.getMode().$id.split('/').pop();
59-
return /css|less|scss|sass|stylus|html|dart/.test(mode)
60-
? mode
61-
: false;
58+
const mode = session.getMode().$id.split("/").pop();
59+
return /css|less|scss|sass|stylus|html|dart/.test(mode) ? mode : false;
6260
}
6361

6462
function onChangeMode() {
65-
const session = editor.session;
66-
let forceUpdate = false;
67-
68-
// if mode is not css, scss, sass, less, stylus, or html, return
69-
const mode = sessionSupportsColor(session);
70-
if (session._addedColorRule || !mode) {
71-
return;
72-
}
73-
74-
let rules = session.$mode.$highlightRules.getRules();
75-
76-
if (mode === 'css') {
77-
rules = { 'ruleset': rules['ruleset'] };
78-
} else if (mode === 'html') {
79-
rules = { 'css-ruleset': rules['css-ruleset'] };
80-
}
81-
82-
Object.keys(rules).forEach((key) => {
83-
const rule = rules[key];
84-
if (rule instanceof Array) {
85-
const ruleExists = rule.some((r) => r.token === 'color');
86-
if (ruleExists) return;
87-
forceUpdate = true;
88-
rule.unshift({
89-
token: "color",
90-
regex: `${HEX}|${RGB}|${RGBA}|${HSL}|${HSLA}`,
91-
});
92-
changedRules.push(rule);
93-
return;
94-
}
95-
});
96-
97-
if (!forceUpdate) return;
98-
99-
forceTokenizer();
63+
const session = editor.session;
64+
let forceUpdate = false;
65+
66+
// if mode is not css, scss, sass, less, stylus, or html, return
67+
const mode = sessionSupportsColor(session);
68+
if (session._addedColorRule || !mode) {
69+
return;
70+
}
71+
72+
let rules = session.$mode.$highlightRules.getRules();
73+
74+
if (mode === "css") {
75+
rules = { ruleset: rules["ruleset"] };
76+
} else if (mode === "html") {
77+
rules = { "css-ruleset": rules["css-ruleset"] };
78+
}
79+
80+
Object.keys(rules).forEach((key) => {
81+
const rule = rules[key];
82+
if (Array.isArray(rule)) {
83+
const ruleExists = rule.some((r) => r.token === "color");
84+
if (ruleExists) return;
85+
forceUpdate = true;
86+
rule.unshift({
87+
token: "color",
88+
regex: `${HEX}|${RGB}|${RGBA}|${HSL}|${HSLA}`,
89+
});
90+
changedRules.push(rule);
91+
return;
92+
}
93+
});
94+
95+
if (!forceUpdate) return;
96+
97+
forceTokenizer();
10098
}
10199

102100
function afterRender() {
103-
const { session, renderer } = editor;
104-
const { content } = renderer;
105-
let classes = COLORPICKER_TOKEN_CLASS;
106-
107-
// if session is css, scss, less, sass, stylus, or html (with css mode), continue
108-
109-
const mode = sessionSupportsColor(session);
110-
if (!mode) {
111-
return;
112-
}
113-
114-
if (mode === 'scss') {
115-
classes += ',.ace_function';
116-
}
117-
118-
content.getAll(COLORPICKER_TOKEN_CLASS).forEach(( /**@type {HTMLElement} */ el, i, els) => {
119-
let content = el.textContent;
120-
const previousContent = els[i - 1]?.textContent;
121-
const nextContent = els[i + 1]?.textContent;
122-
const multiLinePrev = previousContent + content;
123-
const multiLineNext = content + nextContent;
124-
125-
if (el.dataset.modified === 'true') return;
126-
el.dataset.modified = 'true';
127-
128-
if (!isValidColor(content)) {
129-
if (isValidColor(multiLinePrev)) {
130-
content = multiLinePrev;
131-
} else if (isValidColor(multiLineNext)) {
132-
content = multiLineNext;
133-
} else {
134-
return;
135-
}
136-
}
137-
138-
try {
139-
const fontColorString = Color(content).luminance > 0.5 ? "#000" : "#fff";
140-
el.classList.add('ace_color');
141-
el.style.cssText = `background-color: ${content}; color: ${fontColorString}; pointer-events: all;`;
142-
} catch (error) {
143-
console.log("Invalid color", content);
144-
}
145-
});
101+
const { session, renderer } = editor;
102+
const { content } = renderer;
103+
let classes = COLORPICKER_TOKEN_CLASS;
104+
105+
// if session is css, scss, less, sass, stylus, or html (with css mode), continue
106+
107+
const mode = sessionSupportsColor(session);
108+
if (!mode) {
109+
return;
110+
}
111+
112+
if (mode === "scss") {
113+
classes += ",.ace_function";
114+
}
115+
116+
content
117+
.getAll(COLORPICKER_TOKEN_CLASS)
118+
.forEach((/**@type {HTMLElement} */ el, i, els) => {
119+
let content = el.textContent;
120+
const previousContent = els[i - 1]?.textContent;
121+
const nextContent = els[i + 1]?.textContent;
122+
const multiLinePrev = previousContent + content;
123+
const multiLineNext = content + nextContent;
124+
125+
if (el.dataset.modified === "true") return;
126+
el.dataset.modified = "true";
127+
128+
if (!isValidColor(content)) {
129+
if (isValidColor(multiLinePrev)) {
130+
content = multiLinePrev;
131+
} else if (isValidColor(multiLineNext)) {
132+
content = multiLineNext;
133+
} else {
134+
return;
135+
}
136+
}
137+
138+
try {
139+
const fontColorString =
140+
Color(content).luminance > 0.5 ? "#000" : "#fff";
141+
el.classList.add("ace_color");
142+
el.style.cssText = `background-color: ${content}; color: ${fontColorString}; pointer-events: all;`;
143+
} catch (error) {
144+
console.log("Invalid color", content);
145+
}
146+
});
146147
}
147148

148149
function forceTokenizer() {
149-
const { session } = editor;
150-
// force recreation of tokenizer
151-
session.$mode.$tokenizer = null;
152-
session.bgTokenizer.setTokenizer(session.$mode.getTokenizer());
153-
// force re-highlight whole document
154-
session.bgTokenizer.start(0);
150+
const { session } = editor;
151+
// force recreation of tokenizer
152+
session.$mode.$tokenizer = null;
153+
session.bgTokenizer.setTokenizer(session.$mode.getTokenizer());
154+
// force re-highlight whole document
155+
session.bgTokenizer.start(0);
155156
}

0 commit comments

Comments
 (0)