@lightningjs/blits 1.30.0 → 1.30.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +7 -7
- package/.eslintignore +1 -1
- package/.eslintrc.cjs +65 -65
- package/.github/workflows/comment-lint-results.yml +124 -124
- package/.github/workflows/comment-test-results.yml +108 -108
- package/.github/workflows/deploy-docs.yml +27 -27
- package/.github/workflows/run-blits-tests.yml +141 -141
- package/.github/workflows/run-lint.yml +127 -127
- package/.husky/pre-commit +1 -1
- package/.vscode/extensions.json +7 -7
- package/.vscode/settings.json +9 -9
- package/CHANGELOG.md +1019 -1005
- package/COPYING +1 -0
- package/LICENSE +202 -202
- package/NOTICE +12 -12
- package/README.md +33 -33
- package/bin/index.js +8 -8
- package/blits.d.ts +6 -6
- package/docs/README.md +19 -19
- package/docs/_sidebar.md +37 -37
- package/docs/built-in/directives.md +50 -50
- package/docs/built-in/for-loop.md +203 -203
- package/docs/built-in/layout.md +168 -168
- package/docs/components/component_state.md +90 -90
- package/docs/components/computed_properties.md +45 -45
- package/docs/components/lifecycle_events.md +42 -42
- package/docs/components/methods.md +45 -45
- package/docs/components/props.md +56 -56
- package/docs/components/user_input.md +186 -186
- package/docs/components/utility_methods.md +320 -320
- package/docs/components/watchers.md +34 -34
- package/docs/essentials/application_root.md +19 -19
- package/docs/essentials/components.md +68 -68
- package/docs/essentials/displaying_images.md +67 -67
- package/docs/essentials/displaying_text.md +135 -135
- package/docs/essentials/element_attributes.md +195 -195
- package/docs/essentials/settings.md +117 -117
- package/docs/essentials/template_syntax.md +83 -83
- package/docs/getting_started/file_structure.md +58 -58
- package/docs/getting_started/getting_started.md +45 -45
- package/docs/getting_started/intro.md +20 -20
- package/docs/index.html +47 -47
- package/docs/performance/lazy-loading.md +161 -161
- package/docs/plugins/global_app_state.md +98 -98
- package/docs/plugins/language.md +172 -172
- package/docs/plugins/text-to-speech-announcer.md +119 -119
- package/docs/plugins/theme.md +176 -176
- package/docs/router/basics.md +175 -175
- package/docs/router/hooks.md +70 -70
- package/docs/router/transitions.md +146 -146
- package/docs/sidebar.json +171 -171
- package/docs/transitions_animations/transitions.md +150 -150
- package/index.d.ts +1099 -1099
- package/index.js +28 -28
- package/jsconfig.json +12 -12
- package/package.json +56 -56
- package/public/assets/fps_sprite.base64.js +1 -1
- package/scripts/postpublish.js +59 -59
- package/scripts/prepublishOnly.js +84 -84
- package/scripts/prepush.js +78 -78
- package/src/announcer/announcer.js +162 -162
- package/src/announcer/speechSynthesis.js +107 -107
- package/src/application.js +100 -100
- package/src/component/base/announcer.js +27 -27
- package/src/component/base/events.js +69 -69
- package/src/component/base/index.js +33 -33
- package/src/component/base/methods.js +244 -244
- package/src/component/base/router.js +41 -41
- package/src/component/base/timeouts_intervals.js +99 -99
- package/src/component/base/utils.js +72 -72
- package/src/component/setup/computed.js +48 -48
- package/src/component/setup/index.js +62 -62
- package/src/component/setup/input.js +30 -30
- package/src/component/setup/methods.js +37 -37
- package/src/component/setup/props.js +62 -62
- package/src/component/setup/props.test.js +238 -238
- package/src/component/setup/routes.js +42 -42
- package/src/component/setup/state.js +59 -59
- package/src/component/setup/watch.js +35 -35
- package/src/component.js +437 -437
- package/src/component.test.js +388 -388
- package/src/components/Circle.js +73 -73
- package/src/components/Circle.orig.js +31 -31
- package/src/components/FPScounter.js +1510 -1510
- package/src/components/FPScounter.orig.js +121 -121
- package/src/components/RouterView.js +81 -81
- package/src/components/RouterView.orig.js +54 -54
- package/src/components/Sprite.js +94 -94
- package/src/components/Sprite.orig.js +58 -58
- package/src/components/index.js +28 -28
- package/src/components/index.orig.js +28 -28
- package/src/constants.js +21 -21
- package/src/engine.js +1 -1
- package/src/engines/L3/element.js +744 -744
- package/src/engines/L3/element.test.js +579 -579
- package/src/engines/L3/fontLoader.js +38 -38
- package/src/engines/L3/index.js +7 -7
- package/src/engines/L3/launch.js +123 -123
- package/src/engines/L3/shaderLoader.js +12 -12
- package/src/engines/index.js +1 -1
- package/src/focus.js +90 -90
- package/src/helpers/deepEqualArray.js +50 -50
- package/src/helpers/deepEqualArray.test.js +127 -127
- package/src/helpers/fetchJson.js +34 -34
- package/src/helpers/sequence.js +26 -26
- package/src/launch.js +123 -123
- package/src/lib/blitsfileconverter/blitsfileconverter.js +52 -52
- package/src/lib/codegenerator/generator.js +788 -788
- package/src/lib/codegenerator/generator.test.js +3801 -3801
- package/src/lib/colors/colors.js +92 -92
- package/src/lib/colors/colors.test.js +290 -290
- package/src/lib/colors/htmlColors.js +168 -168
- package/src/lib/componentId.js +49 -49
- package/src/lib/componentId.test.js +84 -84
- package/src/lib/eventListeners.js +123 -123
- package/src/lib/eventListeners.test.js +236 -236
- package/src/lib/hooks.js +59 -59
- package/src/lib/lifecycle.js +85 -85
- package/src/lib/log.js +117 -117
- package/src/lib/precompiler/precompiler.js +73 -73
- package/src/lib/reactivity/effect.js +93 -93
- package/src/lib/reactivity/effect.test.js +35 -35
- package/src/lib/reactivity/reactive.js +208 -208
- package/src/lib/reactivity/reactive.test.js +27 -27
- package/src/lib/reactivityguard/computedprops.js +218 -218
- package/src/lib/symbols.js +108 -108
- package/src/lib/templateparser/parser.js +386 -386
- package/src/lib/templateparser/parser.test.js +1411 -1411
- package/src/lib/utils.js +27 -27
- package/src/plugin.js +27 -27
- package/src/plugins/appstate.js +26 -26
- package/src/plugins/index.js +20 -20
- package/src/plugins/language.js +152 -152
- package/src/plugins/log.js +25 -25
- package/src/plugins/theme.js +94 -94
- package/src/router/router.js +514 -514
- package/src/router/router.test.js +473 -473
- package/src/router/transitions/fadeIn.js +27 -27
- package/src/router/transitions/fadeInOut.js +33 -33
- package/src/router/transitions/index.js +21 -21
- package/src/router/transitions/slideIn.js +28 -28
- package/src/router/transitions/slideInOut.js +33 -33
- package/src/settings.js +40 -40
- package/vite/blitsFileConverter.js +67 -67
- package/vite/index.js +28 -28
- package/vite/msdfGenerator.js +269 -269
- package/vite/preCompiler.js +42 -42
- package/vite/reactivityGuard.js +45 -45
- package/vscode/data/template-attributes.json +589 -589
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
name: Trigger Website Docs Update
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [ master ]
|
|
6
|
-
paths:
|
|
7
|
-
- 'docs/**'
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
trigger:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
steps:
|
|
13
|
-
- name: Trigger Deployment
|
|
14
|
-
timeout-minutes: 5
|
|
15
|
-
run: |
|
|
16
|
-
response=$(curl -X POST -d {} -H "Content-Type:application/json" -w "%{http_code}" -s -o /dev/null \
|
|
17
|
-
--max-time 30 \
|
|
18
|
-
--connect-timeout 10 \
|
|
19
|
-
--retry 2 \
|
|
20
|
-
--retry-delay 5 \
|
|
21
|
-
"${{ secrets.WEBSITE_DEPLOY_URL }}")
|
|
22
|
-
if [ "$response" -ge 200 ] && [ "$response" -lt 300 ]; then
|
|
23
|
-
echo "Deployment triggered successfully"
|
|
24
|
-
else
|
|
25
|
-
echo "Failed to trigger deployment. Status code: $response"
|
|
26
|
-
exit 1
|
|
27
|
-
fi
|
|
1
|
+
name: Trigger Website Docs Update
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
paths:
|
|
7
|
+
- 'docs/**'
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
trigger:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Trigger Deployment
|
|
14
|
+
timeout-minutes: 5
|
|
15
|
+
run: |
|
|
16
|
+
response=$(curl -X POST -d {} -H "Content-Type:application/json" -w "%{http_code}" -s -o /dev/null \
|
|
17
|
+
--max-time 30 \
|
|
18
|
+
--connect-timeout 10 \
|
|
19
|
+
--retry 2 \
|
|
20
|
+
--retry-delay 5 \
|
|
21
|
+
"${{ secrets.WEBSITE_DEPLOY_URL }}")
|
|
22
|
+
if [ "$response" -ge 200 ] && [ "$response" -lt 300 ]; then
|
|
23
|
+
echo "Deployment triggered successfully"
|
|
24
|
+
else
|
|
25
|
+
echo "Failed to trigger deployment. Status code: $response"
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
name: Run Blits Tests
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches:
|
|
6
|
-
- dev
|
|
7
|
-
- master
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
run-blits-tests:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
outputs:
|
|
13
|
-
tests_failed: ${{ steps.analyze-results.outputs.result && fromJSON(steps.analyze-results.outputs.result).testsFailed }}
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- name: Checkout Code
|
|
17
|
-
uses: actions/checkout@v3
|
|
18
|
-
|
|
19
|
-
- name: Set up Node.js
|
|
20
|
-
uses: actions/setup-node@v3
|
|
21
|
-
with:
|
|
22
|
-
node-version: 20.16.0
|
|
23
|
-
|
|
24
|
-
- name: Save PR Information
|
|
25
|
-
run: |
|
|
26
|
-
echo '${{ github.event.pull_request.number }}' > ./pr_number.txt
|
|
27
|
-
echo '${{ github.event.pull_request.head.repo.full_name }}' > ./pr_repo.txt
|
|
28
|
-
echo '${{ github.event.pull_request.head.ref }}' > ./pr_branch.txt
|
|
29
|
-
|
|
30
|
-
- name: Install Dependencies
|
|
31
|
-
run: npm install
|
|
32
|
-
|
|
33
|
-
- name: Run Tests
|
|
34
|
-
id: run-tests
|
|
35
|
-
run: npm run test > test-report.txt 2>&1 || echo "Command failed with exit code $?" >> test-report.txt
|
|
36
|
-
|
|
37
|
-
- name: Analyze Test Results
|
|
38
|
-
id: analyze-results
|
|
39
|
-
uses: actions/github-script@v6
|
|
40
|
-
with:
|
|
41
|
-
result-encoding: json
|
|
42
|
-
script: |
|
|
43
|
-
const fs = require('fs');
|
|
44
|
-
const timestamp = new Date().toISOString();
|
|
45
|
-
|
|
46
|
-
const results = {
|
|
47
|
-
timestamp,
|
|
48
|
-
summary: '',
|
|
49
|
-
testsFailed: false,
|
|
50
|
-
error: null
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
// Check if test report exists and has content
|
|
54
|
-
if (!fs.existsSync('test-report.txt') || !fs.statSync('test-report.txt').size) {
|
|
55
|
-
results.summary = 'Test execution error: No test output generated.';
|
|
56
|
-
results.testsFailed = true;
|
|
57
|
-
return outputResults(results);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Read test report
|
|
61
|
-
const testOutput = fs.readFileSync('test-report.txt', 'utf8');
|
|
62
|
-
|
|
63
|
-
// Check for errors and test results
|
|
64
|
-
const hasError = testOutput.includes('Error');
|
|
65
|
-
const testSummaryMatch = testOutput.match(/passed:\s*(\d+)\s*failed:\s*(\d+)\s*of\s*(\d+)\s*tests/);
|
|
66
|
-
|
|
67
|
-
if (hasError && (!testSummaryMatch || testSummaryMatch[3] === '0')) {
|
|
68
|
-
// Error with no tests or zero tests
|
|
69
|
-
results.summary = 'Test execution encountered errors. No tests were run.';
|
|
70
|
-
results.testsFailed = true;
|
|
71
|
-
results.error = testOutput;
|
|
72
|
-
} else if (testSummaryMatch) {
|
|
73
|
-
// We have a test summary
|
|
74
|
-
const passed = parseInt(testSummaryMatch[1]);
|
|
75
|
-
const failed = parseInt(testSummaryMatch[2]);
|
|
76
|
-
const total = parseInt(testSummaryMatch[3]);
|
|
77
|
-
|
|
78
|
-
results.summary = testSummaryMatch[0];
|
|
79
|
-
|
|
80
|
-
if (failed > 0 || total === 0) {
|
|
81
|
-
results.testsFailed = true;
|
|
82
|
-
|
|
83
|
-
if (total === 0) {
|
|
84
|
-
results.summary = 'No tests were found to run. This is considered a failure.';
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
} else {
|
|
88
|
-
// No test summary found
|
|
89
|
-
results.summary = 'Test execution produced no valid test summary';
|
|
90
|
-
results.testsFailed = true;
|
|
91
|
-
results.error = testOutput;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return outputResults(results);
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Outputs results and saves result files
|
|
98
|
-
*/
|
|
99
|
-
function outputResults(results) {
|
|
100
|
-
try {
|
|
101
|
-
fs.writeFileSync('./timestamp.txt', results.timestamp);
|
|
102
|
-
fs.writeFileSync('./summary.txt', results.summary);
|
|
103
|
-
fs.writeFileSync('./failed.txt', results.testsFailed.toString());
|
|
104
|
-
|
|
105
|
-
// Save error output if it exists
|
|
106
|
-
if (results.error) {
|
|
107
|
-
fs.writeFileSync('./error.txt', results.error);
|
|
108
|
-
}
|
|
109
|
-
} catch (err) {
|
|
110
|
-
console.error('Error saving test results:', err);
|
|
111
|
-
core.warning(`Error saving test results: ${err.message}`);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return results;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
- name: Upload Test Report Artifact
|
|
118
|
-
if: always()
|
|
119
|
-
uses: actions/upload-artifact@v4
|
|
120
|
-
with:
|
|
121
|
-
name: test-report
|
|
122
|
-
path: test-report.txt
|
|
123
|
-
|
|
124
|
-
- name: Upload Test Results
|
|
125
|
-
if: always()
|
|
126
|
-
uses: actions/upload-artifact@v4
|
|
127
|
-
with:
|
|
128
|
-
name: test-results
|
|
129
|
-
path: |
|
|
130
|
-
|
|
131
|
-
./timestamp.txt
|
|
132
|
-
./summary.txt
|
|
133
|
-
./failed.txt
|
|
134
|
-
./error.txt
|
|
135
|
-
./pr_number.txt
|
|
136
|
-
./pr_repo.txt
|
|
137
|
-
./pr_branch.txt
|
|
138
|
-
|
|
139
|
-
# Fail the workflow if tests failed
|
|
140
|
-
- name: Check Test Status
|
|
141
|
-
if: ${{ steps.analyze-results.outputs.result && fromJSON(steps.analyze-results.outputs.result).testsFailed }}
|
|
1
|
+
name: Run Blits Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- dev
|
|
7
|
+
- master
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
run-blits-tests:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
outputs:
|
|
13
|
+
tests_failed: ${{ steps.analyze-results.outputs.result && fromJSON(steps.analyze-results.outputs.result).testsFailed }}
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout Code
|
|
17
|
+
uses: actions/checkout@v3
|
|
18
|
+
|
|
19
|
+
- name: Set up Node.js
|
|
20
|
+
uses: actions/setup-node@v3
|
|
21
|
+
with:
|
|
22
|
+
node-version: 20.16.0
|
|
23
|
+
|
|
24
|
+
- name: Save PR Information
|
|
25
|
+
run: |
|
|
26
|
+
echo '${{ github.event.pull_request.number }}' > ./pr_number.txt
|
|
27
|
+
echo '${{ github.event.pull_request.head.repo.full_name }}' > ./pr_repo.txt
|
|
28
|
+
echo '${{ github.event.pull_request.head.ref }}' > ./pr_branch.txt
|
|
29
|
+
|
|
30
|
+
- name: Install Dependencies
|
|
31
|
+
run: npm install
|
|
32
|
+
|
|
33
|
+
- name: Run Tests
|
|
34
|
+
id: run-tests
|
|
35
|
+
run: npm run test > test-report.txt 2>&1 || echo "Command failed with exit code $?" >> test-report.txt
|
|
36
|
+
|
|
37
|
+
- name: Analyze Test Results
|
|
38
|
+
id: analyze-results
|
|
39
|
+
uses: actions/github-script@v6
|
|
40
|
+
with:
|
|
41
|
+
result-encoding: json
|
|
42
|
+
script: |
|
|
43
|
+
const fs = require('fs');
|
|
44
|
+
const timestamp = new Date().toISOString();
|
|
45
|
+
|
|
46
|
+
const results = {
|
|
47
|
+
timestamp,
|
|
48
|
+
summary: '',
|
|
49
|
+
testsFailed: false,
|
|
50
|
+
error: null
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Check if test report exists and has content
|
|
54
|
+
if (!fs.existsSync('test-report.txt') || !fs.statSync('test-report.txt').size) {
|
|
55
|
+
results.summary = 'Test execution error: No test output generated.';
|
|
56
|
+
results.testsFailed = true;
|
|
57
|
+
return outputResults(results);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Read test report
|
|
61
|
+
const testOutput = fs.readFileSync('test-report.txt', 'utf8');
|
|
62
|
+
|
|
63
|
+
// Check for errors and test results
|
|
64
|
+
const hasError = testOutput.includes('Error');
|
|
65
|
+
const testSummaryMatch = testOutput.match(/passed:\s*(\d+)\s*failed:\s*(\d+)\s*of\s*(\d+)\s*tests/);
|
|
66
|
+
|
|
67
|
+
if (hasError && (!testSummaryMatch || testSummaryMatch[3] === '0')) {
|
|
68
|
+
// Error with no tests or zero tests
|
|
69
|
+
results.summary = 'Test execution encountered errors. No tests were run.';
|
|
70
|
+
results.testsFailed = true;
|
|
71
|
+
results.error = testOutput;
|
|
72
|
+
} else if (testSummaryMatch) {
|
|
73
|
+
// We have a test summary
|
|
74
|
+
const passed = parseInt(testSummaryMatch[1]);
|
|
75
|
+
const failed = parseInt(testSummaryMatch[2]);
|
|
76
|
+
const total = parseInt(testSummaryMatch[3]);
|
|
77
|
+
|
|
78
|
+
results.summary = testSummaryMatch[0];
|
|
79
|
+
|
|
80
|
+
if (failed > 0 || total === 0) {
|
|
81
|
+
results.testsFailed = true;
|
|
82
|
+
|
|
83
|
+
if (total === 0) {
|
|
84
|
+
results.summary = 'No tests were found to run. This is considered a failure.';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
// No test summary found
|
|
89
|
+
results.summary = 'Test execution produced no valid test summary';
|
|
90
|
+
results.testsFailed = true;
|
|
91
|
+
results.error = testOutput;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return outputResults(results);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Outputs results and saves result files
|
|
98
|
+
*/
|
|
99
|
+
function outputResults(results) {
|
|
100
|
+
try {
|
|
101
|
+
fs.writeFileSync('./timestamp.txt', results.timestamp);
|
|
102
|
+
fs.writeFileSync('./summary.txt', results.summary);
|
|
103
|
+
fs.writeFileSync('./failed.txt', results.testsFailed.toString());
|
|
104
|
+
|
|
105
|
+
// Save error output if it exists
|
|
106
|
+
if (results.error) {
|
|
107
|
+
fs.writeFileSync('./error.txt', results.error);
|
|
108
|
+
}
|
|
109
|
+
} catch (err) {
|
|
110
|
+
console.error('Error saving test results:', err);
|
|
111
|
+
core.warning(`Error saving test results: ${err.message}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
- name: Upload Test Report Artifact
|
|
118
|
+
if: always()
|
|
119
|
+
uses: actions/upload-artifact@v4
|
|
120
|
+
with:
|
|
121
|
+
name: test-report
|
|
122
|
+
path: test-report.txt
|
|
123
|
+
|
|
124
|
+
- name: Upload Test Results
|
|
125
|
+
if: always()
|
|
126
|
+
uses: actions/upload-artifact@v4
|
|
127
|
+
with:
|
|
128
|
+
name: test-results
|
|
129
|
+
path: |
|
|
130
|
+
|
|
131
|
+
./timestamp.txt
|
|
132
|
+
./summary.txt
|
|
133
|
+
./failed.txt
|
|
134
|
+
./error.txt
|
|
135
|
+
./pr_number.txt
|
|
136
|
+
./pr_repo.txt
|
|
137
|
+
./pr_branch.txt
|
|
138
|
+
|
|
139
|
+
# Fail the workflow if tests failed
|
|
140
|
+
- name: Check Test Status
|
|
141
|
+
if: ${{ steps.analyze-results.outputs.result && fromJSON(steps.analyze-results.outputs.result).testsFailed }}
|
|
142
142
|
run: exit 1
|
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
name: Run ESLint
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches:
|
|
6
|
-
- dev
|
|
7
|
-
- master
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
run-lint:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
permissions:
|
|
13
|
-
contents: read
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- name: Checkout Code
|
|
17
|
-
uses: actions/checkout@v3
|
|
18
|
-
with:
|
|
19
|
-
# Needed to compare changes against base branch
|
|
20
|
-
fetch-depth: 0
|
|
21
|
-
|
|
22
|
-
- name: Save PR Information
|
|
23
|
-
run: |
|
|
24
|
-
echo '${{ github.event.pull_request.number }}' > ./pr_number.txt
|
|
25
|
-
echo '${{ github.event.pull_request.head.repo.full_name }}' > ./pr_repo.txt
|
|
26
|
-
echo '${{ github.event.pull_request.head.ref }}' > ./pr_branch.txt
|
|
27
|
-
|
|
28
|
-
- name: Set up Node.js
|
|
29
|
-
uses: actions/setup-node@v3
|
|
30
|
-
with:
|
|
31
|
-
node-version: 20.16.0
|
|
32
|
-
|
|
33
|
-
- name: Install Dependencies
|
|
34
|
-
run: npm install
|
|
35
|
-
|
|
36
|
-
- name: Get list of changed JS files
|
|
37
|
-
id: changed-files
|
|
38
|
-
run: |
|
|
39
|
-
# Get the list of changed .js files compared to the base branch
|
|
40
|
-
git diff --name-only --diff-filter=ACMRT origin/${{ github.base_ref }} HEAD | grep '\.js$' > js-changed-files.txt || true
|
|
41
|
-
|
|
42
|
-
if [ -s js-changed-files.txt ]; then
|
|
43
|
-
echo "has_js_changes=true" >> $GITHUB_OUTPUT
|
|
44
|
-
cat js-changed-files.txt | tr '\n' ' ' > js-changed-files-spaces.txt
|
|
45
|
-
echo "files=$(cat js-changed-files-spaces.txt)" >> $GITHUB_OUTPUT
|
|
46
|
-
else
|
|
47
|
-
echo "has_js_changes=false" >> $GITHUB_OUTPUT
|
|
48
|
-
fi
|
|
49
|
-
|
|
50
|
-
- name: Run ESLint on changed files
|
|
51
|
-
id: eslint
|
|
52
|
-
if: steps.changed-files.outputs.has_js_changes == 'true'
|
|
53
|
-
run: |
|
|
54
|
-
# Create directory for output
|
|
55
|
-
mkdir -p ./lint-results
|
|
56
|
-
|
|
57
|
-
# Run ESLint only on changed files with the project's config
|
|
58
|
-
# Filtering out warnings - only keep errors
|
|
59
|
-
npx eslint --config .eslintrc.cjs ${{ steps.changed-files.outputs.files }} -f json > ./lint-results/eslint-output.json || true
|
|
60
|
-
|
|
61
|
-
# Check if there are any errors in the ESLint output
|
|
62
|
-
if [ -s ./lint-results/eslint-output.json ]; then
|
|
63
|
-
error_count=$(node -e "
|
|
64
|
-
const results = require('./lint-results/eslint-output.json');
|
|
65
|
-
let errorCount = 0;
|
|
66
|
-
for (const file of results) {
|
|
67
|
-
errorCount += file.errorCount || 0;
|
|
68
|
-
}
|
|
69
|
-
console.log(errorCount);
|
|
70
|
-
")
|
|
71
|
-
|
|
72
|
-
echo "errors_found=$error_count" >> $GITHUB_OUTPUT
|
|
73
|
-
|
|
74
|
-
if [ "$error_count" -gt 0 ]; then
|
|
75
|
-
# Create the formatted error report
|
|
76
|
-
echo '❌ **Linting errors found**' > ./lint-results/errors.md
|
|
77
|
-
echo '' >> ./lint-results/errors.md
|
|
78
|
-
echo 'These linting errors must be fixed before this PR can be merged:' >> ./lint-results/errors.md
|
|
79
|
-
echo '' >> ./lint-results/errors.md
|
|
80
|
-
echo '```' >> ./lint-results/errors.md
|
|
81
|
-
|
|
82
|
-
# Extract and format errors from the JSON
|
|
83
|
-
error_count=$(node -e "
|
|
84
|
-
const results = require('./lint-results/eslint-output.json');
|
|
85
|
-
let errorSummary = '';
|
|
86
|
-
|
|
87
|
-
for (const file of results) {
|
|
88
|
-
if (file.errorCount > 0) {
|
|
89
|
-
const filePath = file.filePath.replace(process.env.GITHUB_WORKSPACE + '/', '');
|
|
90
|
-
errorSummary += filePath + '\\n';
|
|
91
|
-
|
|
92
|
-
for (const msg of file.messages) {
|
|
93
|
-
if (msg.severity === 2) {
|
|
94
|
-
errorSummary += ' Line ' + msg.line + ':' + msg.column + ': ' +
|
|
95
|
-
msg.message + ' (' + msg.ruleId + ')\\n';
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
errorSummary += '\\n';
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
console.log(errorSummary.trim());
|
|
103
|
-
")
|
|
104
|
-
|
|
105
|
-
echo "$error_count" >> ./lint-results/errors.md
|
|
106
|
-
echo '```' >> ./lint-results/errors.md
|
|
107
|
-
echo '' >> ./lint-results/errors.md
|
|
108
|
-
echo '_Run `npm run lint:fix` to automatically fix some of these issues._' >> ./lint-results/errors.md
|
|
109
|
-
fi
|
|
110
|
-
else
|
|
111
|
-
echo "errors_found=0" >> $GITHUB_OUTPUT
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
- name: Upload Lint Results
|
|
115
|
-
if: steps.changed-files.outputs.has_js_changes == 'true'
|
|
116
|
-
uses: actions/upload-artifact@v4
|
|
117
|
-
with:
|
|
118
|
-
name: lint-results
|
|
119
|
-
path: |
|
|
120
|
-
./lint-results/
|
|
121
|
-
./pr_number.txt
|
|
122
|
-
./pr_repo.txt
|
|
123
|
-
./pr_branch.txt
|
|
124
|
-
|
|
125
|
-
# Fail the workflow if linting errors found
|
|
126
|
-
- name: Check Lint Status
|
|
127
|
-
if: steps.changed-files.outputs.has_js_changes == 'true' && steps.eslint.outputs.errors_found != '0'
|
|
1
|
+
name: Run ESLint
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches:
|
|
6
|
+
- dev
|
|
7
|
+
- master
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
run-lint:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- name: Checkout Code
|
|
17
|
+
uses: actions/checkout@v3
|
|
18
|
+
with:
|
|
19
|
+
# Needed to compare changes against base branch
|
|
20
|
+
fetch-depth: 0
|
|
21
|
+
|
|
22
|
+
- name: Save PR Information
|
|
23
|
+
run: |
|
|
24
|
+
echo '${{ github.event.pull_request.number }}' > ./pr_number.txt
|
|
25
|
+
echo '${{ github.event.pull_request.head.repo.full_name }}' > ./pr_repo.txt
|
|
26
|
+
echo '${{ github.event.pull_request.head.ref }}' > ./pr_branch.txt
|
|
27
|
+
|
|
28
|
+
- name: Set up Node.js
|
|
29
|
+
uses: actions/setup-node@v3
|
|
30
|
+
with:
|
|
31
|
+
node-version: 20.16.0
|
|
32
|
+
|
|
33
|
+
- name: Install Dependencies
|
|
34
|
+
run: npm install
|
|
35
|
+
|
|
36
|
+
- name: Get list of changed JS files
|
|
37
|
+
id: changed-files
|
|
38
|
+
run: |
|
|
39
|
+
# Get the list of changed .js files compared to the base branch
|
|
40
|
+
git diff --name-only --diff-filter=ACMRT origin/${{ github.base_ref }} HEAD | grep '\.js$' > js-changed-files.txt || true
|
|
41
|
+
|
|
42
|
+
if [ -s js-changed-files.txt ]; then
|
|
43
|
+
echo "has_js_changes=true" >> $GITHUB_OUTPUT
|
|
44
|
+
cat js-changed-files.txt | tr '\n' ' ' > js-changed-files-spaces.txt
|
|
45
|
+
echo "files=$(cat js-changed-files-spaces.txt)" >> $GITHUB_OUTPUT
|
|
46
|
+
else
|
|
47
|
+
echo "has_js_changes=false" >> $GITHUB_OUTPUT
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
- name: Run ESLint on changed files
|
|
51
|
+
id: eslint
|
|
52
|
+
if: steps.changed-files.outputs.has_js_changes == 'true'
|
|
53
|
+
run: |
|
|
54
|
+
# Create directory for output
|
|
55
|
+
mkdir -p ./lint-results
|
|
56
|
+
|
|
57
|
+
# Run ESLint only on changed files with the project's config
|
|
58
|
+
# Filtering out warnings - only keep errors
|
|
59
|
+
npx eslint --config .eslintrc.cjs ${{ steps.changed-files.outputs.files }} -f json > ./lint-results/eslint-output.json || true
|
|
60
|
+
|
|
61
|
+
# Check if there are any errors in the ESLint output
|
|
62
|
+
if [ -s ./lint-results/eslint-output.json ]; then
|
|
63
|
+
error_count=$(node -e "
|
|
64
|
+
const results = require('./lint-results/eslint-output.json');
|
|
65
|
+
let errorCount = 0;
|
|
66
|
+
for (const file of results) {
|
|
67
|
+
errorCount += file.errorCount || 0;
|
|
68
|
+
}
|
|
69
|
+
console.log(errorCount);
|
|
70
|
+
")
|
|
71
|
+
|
|
72
|
+
echo "errors_found=$error_count" >> $GITHUB_OUTPUT
|
|
73
|
+
|
|
74
|
+
if [ "$error_count" -gt 0 ]; then
|
|
75
|
+
# Create the formatted error report
|
|
76
|
+
echo '❌ **Linting errors found**' > ./lint-results/errors.md
|
|
77
|
+
echo '' >> ./lint-results/errors.md
|
|
78
|
+
echo 'These linting errors must be fixed before this PR can be merged:' >> ./lint-results/errors.md
|
|
79
|
+
echo '' >> ./lint-results/errors.md
|
|
80
|
+
echo '```' >> ./lint-results/errors.md
|
|
81
|
+
|
|
82
|
+
# Extract and format errors from the JSON
|
|
83
|
+
error_count=$(node -e "
|
|
84
|
+
const results = require('./lint-results/eslint-output.json');
|
|
85
|
+
let errorSummary = '';
|
|
86
|
+
|
|
87
|
+
for (const file of results) {
|
|
88
|
+
if (file.errorCount > 0) {
|
|
89
|
+
const filePath = file.filePath.replace(process.env.GITHUB_WORKSPACE + '/', '');
|
|
90
|
+
errorSummary += filePath + '\\n';
|
|
91
|
+
|
|
92
|
+
for (const msg of file.messages) {
|
|
93
|
+
if (msg.severity === 2) {
|
|
94
|
+
errorSummary += ' Line ' + msg.line + ':' + msg.column + ': ' +
|
|
95
|
+
msg.message + ' (' + msg.ruleId + ')\\n';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
errorSummary += '\\n';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log(errorSummary.trim());
|
|
103
|
+
")
|
|
104
|
+
|
|
105
|
+
echo "$error_count" >> ./lint-results/errors.md
|
|
106
|
+
echo '```' >> ./lint-results/errors.md
|
|
107
|
+
echo '' >> ./lint-results/errors.md
|
|
108
|
+
echo '_Run `npm run lint:fix` to automatically fix some of these issues._' >> ./lint-results/errors.md
|
|
109
|
+
fi
|
|
110
|
+
else
|
|
111
|
+
echo "errors_found=0" >> $GITHUB_OUTPUT
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
- name: Upload Lint Results
|
|
115
|
+
if: steps.changed-files.outputs.has_js_changes == 'true'
|
|
116
|
+
uses: actions/upload-artifact@v4
|
|
117
|
+
with:
|
|
118
|
+
name: lint-results
|
|
119
|
+
path: |
|
|
120
|
+
./lint-results/
|
|
121
|
+
./pr_number.txt
|
|
122
|
+
./pr_repo.txt
|
|
123
|
+
./pr_branch.txt
|
|
124
|
+
|
|
125
|
+
# Fail the workflow if linting errors found
|
|
126
|
+
- name: Check Lint Status
|
|
127
|
+
if: steps.changed-files.outputs.has_js_changes == 'true' && steps.eslint.outputs.errors_found != '0'
|
|
128
128
|
run: exit 1
|
package/.husky/pre-commit
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
npx lint-staged
|
|
1
|
+
npx lint-staged
|
package/.vscode/extensions.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"recommendations": [
|
|
3
|
-
"editorconfig.editorconfig",
|
|
4
|
-
"dbaeumer.vscode-eslint",
|
|
5
|
-
"LightningJS.lightning-blits"
|
|
6
|
-
]
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"recommendations": [
|
|
3
|
+
"editorconfig.editorconfig",
|
|
4
|
+
"dbaeumer.vscode-eslint",
|
|
5
|
+
"LightningJS.lightning-blits"
|
|
6
|
+
]
|
|
7
|
+
}
|
package/.vscode/settings.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
{
|
|
2
|
-
"editor.formatOnSave": false,
|
|
3
|
-
"eslint.validate": [
|
|
4
|
-
"javascript"
|
|
5
|
-
],
|
|
6
|
-
"editor.codeActionsOnSave": {
|
|
7
|
-
"source.fixAll.eslint": "explicit"
|
|
8
|
-
}
|
|
9
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"editor.formatOnSave": false,
|
|
3
|
+
"eslint.validate": [
|
|
4
|
+
"javascript"
|
|
5
|
+
],
|
|
6
|
+
"editor.codeActionsOnSave": {
|
|
7
|
+
"source.fixAll.eslint": "explicit"
|
|
8
|
+
}
|
|
9
|
+
}
|