@lightningjs/blits 1.30.1 → 1.31.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/package.json +4 -3
  3. package/src/router/router.js +2 -0
  4. package/vite/preCompiler.js +6 -1
  5. package/.editorconfig +0 -7
  6. package/.eslintignore +0 -1
  7. package/.eslintrc.cjs +0 -65
  8. package/.github/workflows/comment-lint-results.yml +0 -125
  9. package/.github/workflows/comment-test-results.yml +0 -109
  10. package/.github/workflows/deploy-docs.yml +0 -27
  11. package/.github/workflows/run-blits-tests.yml +0 -142
  12. package/.github/workflows/run-lint.yml +0 -128
  13. package/.husky/pre-commit +0 -1
  14. package/.husky/pre-push +0 -1
  15. package/.vscode/extensions.json +0 -7
  16. package/.vscode/settings.json +0 -9
  17. package/banner.png +0 -0
  18. package/docs/.nojekyll +0 -0
  19. package/docs/README.md +0 -19
  20. package/docs/_sidebar.md +0 -37
  21. package/docs/built-in/directives.md +0 -50
  22. package/docs/built-in/for-loop.md +0 -204
  23. package/docs/built-in/layout.md +0 -168
  24. package/docs/components/component_state.md +0 -90
  25. package/docs/components/computed_properties.md +0 -45
  26. package/docs/components/lifecycle_events.md +0 -42
  27. package/docs/components/methods.md +0 -45
  28. package/docs/components/props.md +0 -56
  29. package/docs/components/user_input.md +0 -186
  30. package/docs/components/utility_methods.md +0 -320
  31. package/docs/components/watchers.md +0 -34
  32. package/docs/essentials/application_root.md +0 -19
  33. package/docs/essentials/components.md +0 -68
  34. package/docs/essentials/displaying_images.md +0 -67
  35. package/docs/essentials/displaying_text.md +0 -135
  36. package/docs/essentials/element_attributes.md +0 -195
  37. package/docs/essentials/settings.md +0 -117
  38. package/docs/essentials/template_syntax.md +0 -83
  39. package/docs/getting_started/file_structure.md +0 -58
  40. package/docs/getting_started/getting_started.md +0 -45
  41. package/docs/getting_started/intro.md +0 -20
  42. package/docs/index.html +0 -47
  43. package/docs/performance/lazy-loading.md +0 -161
  44. package/docs/plugins/global_app_state.md +0 -98
  45. package/docs/plugins/language.md +0 -172
  46. package/docs/plugins/text-to-speech-announcer.md +0 -120
  47. package/docs/plugins/theme.md +0 -176
  48. package/docs/router/basics.md +0 -175
  49. package/docs/router/hooks.md +0 -70
  50. package/docs/router/transitions.md +0 -146
  51. package/docs/sidebar.json +0 -171
  52. package/docs/transitions_animations/transitions.md +0 -150
  53. package/jsconfig.json +0 -12
  54. package/src/component/setup/props.test.js +0 -238
  55. package/src/component.test.js +0 -388
  56. package/src/components/Circle.orig.js +0 -31
  57. package/src/components/FPScounter.orig.js +0 -121
  58. package/src/components/RouterView.orig.js +0 -54
  59. package/src/components/Sprite.orig.js +0 -58
  60. package/src/components/index.orig.js +0 -28
  61. package/src/engines/L3/element.test.js +0 -579
  62. package/src/helpers/deepEqualArray.test.js +0 -127
  63. package/src/lib/codegenerator/generator.test.js +0 -3801
  64. package/src/lib/colors/colors.test.js +0 -290
  65. package/src/lib/componentId.test.js +0 -84
  66. package/src/lib/eventListeners.test.js +0 -236
  67. package/src/lib/reactivity/effect.test.js +0 -35
  68. package/src/lib/reactivity/reactive.test.js +0 -27
  69. package/src/lib/templateparser/parser.test.js +0 -1411
  70. package/src/router/router.test.js +0 -473
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ _27 jun 2025_
4
+
5
+ ## v1.31.0
6
+
7
+ - Added dereferencing of previousFocus pointer to ensure memory release
8
+ - Added npm ignore to reduce NPM package size
9
+ - Added support for precompilation of `.mjs` files
10
+ - Upgraded renderer to v2.14.3
11
+
12
+
13
+ _25 jun 2025_
14
+
15
+ ## v1.30.2
16
+
17
+ - Bumped renderer to v2.14.2
18
+
19
+
3
20
  _25 jun 2025_
4
21
 
5
22
  ## v1.30.1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightningjs/blits",
3
- "version": "1.30.1",
3
+ "version": "1.31.0",
4
4
  "description": "Blits: The Lightning 3 App Development Framework",
5
5
  "bin": "bin/index.js",
6
6
  "exports": {
@@ -19,7 +19,8 @@
19
19
  "lint:fix": "eslint '**/*.js' --fix",
20
20
  "prepublishOnly": "node scripts/prepublishOnly.js",
21
21
  "postpublish": "node scripts/postpublish.js",
22
- "prepare": "husky"
22
+ "prepare": "husky",
23
+ "pack-preview": "npm pack --dry-run"
23
24
  },
24
25
  "types": "./index.d.ts",
25
26
  "lint-staged": {
@@ -47,7 +48,7 @@
47
48
  },
48
49
  "dependencies": {
49
50
  "@lightningjs/msdf-generator": "^1.1.1",
50
- "@lightningjs/renderer": "^2.14.1"
51
+ "@lightningjs/renderer": "^2.14.3"
51
52
  },
52
53
  "repository": {
53
54
  "type": "git",
@@ -433,6 +433,8 @@ const removeView = async (route, view, transition) => {
433
433
  view.destroy()
434
434
  view = null
435
435
  }
436
+
437
+ previousFocus = null
436
438
  }
437
439
 
438
440
  const setOrAnimate = (node, transition, shouldAnimate = true) => {
@@ -31,7 +31,12 @@ export default function () {
31
31
  const fileExtension = path.extname(filePath)
32
32
 
33
33
  // we should only precompile .blits, .js and .ts files
34
- if (fileExtension === '.js' || fileExtension === '.ts' || fileExtension === '.blits') {
34
+ if (
35
+ fileExtension === '.js' ||
36
+ fileExtension === '.ts' ||
37
+ fileExtension === '.blits' ||
38
+ fileExtension === '.mjs'
39
+ ) {
35
40
  return compiler(source, filePath, config.mode)
36
41
  }
37
42
 
package/.editorconfig DELETED
@@ -1,7 +0,0 @@
1
- [*]
2
- charset = utf-8
3
- indent_size = 2
4
- indent_style = space
5
- end_of_line = lf
6
- insert_final_newline = true
7
- trim_trailing_whitespace = true
package/.eslintignore DELETED
@@ -1 +0,0 @@
1
- **/node_modules
package/.eslintrc.cjs DELETED
@@ -1,65 +0,0 @@
1
- /*
2
- * If not stated otherwise in this file or this component's LICENSE file the
3
- * following copyright and licenses apply:
4
- *
5
- * Copyright 2023 Comcast
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the License);
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- */
19
-
20
- module.exports = {
21
- root: true,
22
- env: {
23
- browser: true,
24
- es6: true,
25
- node: true,
26
- },
27
- plugins: ['prettier'],
28
- extends: ['eslint:recommended', 'plugin:prettier/recommended', 'prettier'],
29
- rules: {
30
- 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
31
- 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
32
- quotes: [2, 'single', 'avoid-escape'],
33
- semi: [2, 'never'],
34
- 'no-extra-boolean-cast': 'off',
35
- 'no-unused-vars': [
36
- 1,
37
- {
38
- argsIgnorePattern: 'res|next|^err',
39
- },
40
- ],
41
- 'prettier/prettier': [
42
- 'error',
43
- {
44
- trailingComma: 'es5',
45
- singleQuote: true,
46
- tabWidth: 2,
47
- semi: false,
48
- printWidth: 100,
49
- endOfLine: 'auto',
50
- },
51
- ],
52
- },
53
- parser: '@babel/eslint-parser',
54
- parserOptions: {
55
- ecmaVersion: 2018,
56
- sourceType: 'module',
57
- requireConfigFile: false,
58
- babelOptions: {
59
- plugins: ['@babel/plugin-syntax-import-assertions'],
60
- },
61
- },
62
- globals: {
63
- globalThis: false,
64
- },
65
- }
@@ -1,125 +0,0 @@
1
- name: Comment ESLint Results
2
-
3
- on:
4
- workflow_run:
5
- workflows: ["Run ESLint"]
6
- types:
7
- - completed
8
-
9
- jobs:
10
- comment-lint-results:
11
- if: github.event.workflow_run.conclusion == 'failure'
12
- runs-on: ubuntu-latest
13
- permissions:
14
- pull-requests: write
15
-
16
- steps:
17
- - name: Download Lint Results
18
- id: download
19
- uses: actions/github-script@v6
20
- with:
21
- result-encoding: string
22
- script: |
23
-
24
- try {
25
- core.info('Downloading lint-results artifact');
26
- const runId = context.payload.workflow_run.id;
27
-
28
- const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
29
- owner: context.repo.owner,
30
- repo: context.repo.repo,
31
- run_id: runId
32
- });
33
-
34
- const art = artifacts.data.artifacts.find(a => a.name === "lint-results");
35
- if (!art) {
36
- core.setFailed('No lint-results artifact found');
37
- return 'false';
38
- }
39
-
40
- core.info(`Found artifact id ${art.id}, downloading…`);
41
- const dl = await github.rest.actions.downloadArtifact({
42
- owner: context.repo.owner,
43
- repo: context.repo.repo,
44
- artifact_id: art.id,
45
- archive_format: 'zip'
46
- });
47
-
48
- require('fs').writeFileSync('lint-results.zip', Buffer.from(dl.data));
49
- core.info('Downloaded and saved lint-results.zip');
50
- return 'true';
51
-
52
- } catch (err) {
53
- core.setFailed(`Download failed: ${err.message}`);
54
- return 'false';
55
- }
56
-
57
- - name: Extract Lint Results
58
- if: steps.download.outputs.result == 'true'
59
- id: extract
60
- run: |
61
- mkdir -p extracted
62
- unzip -o lint-results.zip -d extracted
63
-
64
- # Read PR information
65
- if [ -f extracted/pr_number.txt ]; then
66
- echo "PR_NUMBER=$(cat extracted/pr_number.txt)" >> $GITHUB_ENV
67
- else
68
- echo "PR_NUMBER=0" >> $GITHUB_ENV
69
- fi
70
-
71
- if [ -f extracted/errors.md ] || [ -f extracted/lint-results/errors.md ]; then
72
- if [ -f extracted/errors.md ]; then
73
- # Handle flat structure
74
- echo "LINT_ERRORS<<EOF" >> $GITHUB_ENV
75
- cat extracted/errors.md >> $GITHUB_ENV
76
- echo "EOF" >> $GITHUB_ENV
77
- else
78
- # Handle nested structure
79
- echo "LINT_ERRORS<<EOF" >> $GITHUB_ENV
80
- cat extracted/lint-results/errors.md >> $GITHUB_ENV
81
- echo "EOF" >> $GITHUB_ENV
82
- fi
83
- echo "HAS_ERRORS=true" >> $GITHUB_OUTPUT
84
- else
85
- echo "HAS_ERRORS=false" >> $GITHUB_OUTPUT
86
- fi
87
-
88
- - name: Post Lint Results as PR Comment
89
- if: steps.extract.outputs.HAS_ERRORS == 'true'
90
- uses: actions/github-script@v6
91
- with:
92
- script: |
93
- try {
94
- // First check if PR number was passed from the lint workflow
95
- let prNumber = parseInt(process.env.PR_NUMBER);
96
-
97
- // Fallback to the workflow_run PR data if available
98
- if (!prNumber || isNaN(prNumber) || prNumber === 0) {
99
- const pulls = context.payload.workflow_run.pull_requests;
100
- core.info(`Looking for PR information in workflow_run: Found ${pulls.length} PR(s)`);
101
-
102
- if (pulls.length === 0) {
103
- core.warning('No pull request information found. Skipping comment.');
104
- return;
105
- }
106
-
107
- prNumber = pulls[0].number;
108
- }
109
-
110
- core.info(`Posting lint errors comment to PR #${prNumber}`);
111
-
112
- const body = process.env.LINT_ERRORS;
113
-
114
- await github.rest.issues.createComment({
115
- owner: context.repo.owner,
116
- repo: context.repo.repo,
117
- issue_number: prNumber,
118
- body
119
- });
120
-
121
- core.info('Lint errors comment posted successfully');
122
- } catch (err) {
123
- core.error('Failed to post lint comment:', err);
124
- core.setFailed(err.message);
125
- }
@@ -1,109 +0,0 @@
1
- name: Comment Test Results
2
-
3
- on:
4
- workflow_run:
5
- workflows: ["Run Blits Tests"]
6
- types: [completed]
7
-
8
- jobs:
9
- comment-test-results:
10
- runs-on: ubuntu-latest
11
- permissions:
12
- pull-requests: write
13
-
14
- steps:
15
- - name: Download Test Results
16
- uses: actions/github-script@v6
17
- with:
18
- script: |
19
- const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
20
- owner: context.repo.owner,
21
- repo: context.repo.repo,
22
- run_id: ${{ github.event.workflow_run.id }}
23
- });
24
- const art = artifacts.data.artifacts.find(a => a.name === "test-results");
25
- if (!art) {
26
- core.setFailed('No test-results artifact found');
27
- return;
28
- }
29
- const dl = await github.rest.actions.downloadArtifact({
30
- owner: context.repo.owner,
31
- repo: context.repo.repo,
32
- artifact_id: art.id,
33
- archive_format: 'zip'
34
- });
35
- require('fs').writeFileSync('test-results.zip', Buffer.from(dl.data));
36
-
37
- - name: Extract Test Results
38
- run: |
39
-
40
- mkdir -p extracted
41
- unzip -o test-results.zip -d extracted
42
-
43
- # Set environment variables from the extracted files
44
- echo "TIMESTAMP=$(cat extracted/timestamp.txt)" >> $GITHUB_ENV
45
- echo "SUMMARY=$(cat extracted/summary.txt)" >> $GITHUB_ENV
46
- echo "FAILED=$(cat extracted/failed.txt)" >> $GITHUB_ENV
47
-
48
- # Read PR information
49
- if [ -f extracted/pr_number.txt ]; then
50
- echo "PR_NUMBER=$(cat extracted/pr_number.txt)" >> $GITHUB_ENV
51
- else
52
- echo "PR_NUMBER=0" >> $GITHUB_ENV
53
- fi
54
-
55
-
56
- # Copy error file if it exists
57
- if [ -f extracted/error.txt ]; then
58
- cp extracted/error.txt raw_error.txt
59
- fi
60
-
61
- - name: Post Test Results as PR Comment
62
- uses: actions/github-script@v6
63
- with:
64
- script: |
65
- const fs = require('fs');
66
-
67
- try {
68
- // First check if PR number was passed from the test workflow
69
- let prNumber = parseInt(process.env.PR_NUMBER);
70
-
71
- // Fallback to the workflow_run PR data if available
72
- if (!prNumber || isNaN(prNumber) || prNumber === 0) {
73
- const pulls = context.payload.workflow_run.pull_requests;
74
- console.log(`Looking for PR information in workflow_run: Found ${pulls.length} PR(s).`);
75
-
76
- if (pulls.length === 0) {
77
- console.warn('No pull request information found. Skipping comment.');
78
- return;
79
- }
80
-
81
- prNumber = pulls[0].number;
82
- }
83
-
84
- console.log(`Posting comment to PR #${prNumber}`);
85
-
86
- const status = process.env.FAILED === 'true' ? '❌ FAILED' : '✅ PASSED';
87
- let commentBody = `#### Test Results: ${status}\n`
88
- + `**Run at:** ${process.env.TIMESTAMP}\n\n`
89
- + `**Summary:**\n${process.env.SUMMARY}`;
90
-
91
- if (fs.existsSync('raw_error.txt')) {
92
- commentBody += '\n\n**Error Output:**\n```\n'
93
- + fs.readFileSync('raw_error.txt', 'utf8')
94
- + '\n```';
95
- }
96
-
97
- await github.rest.issues.createComment({
98
- owner: context.repo.owner,
99
- repo: context.repo.repo,
100
- issue_number: prNumber,
101
- body: commentBody
102
- });
103
-
104
- console.log(`Successfully posted comment to PR #${prNumber}`);
105
-
106
- } catch (err) {
107
- console.error('🛑 Failed to post test results comment:', err);
108
- core.setFailed(`Comment step failed: ${err.message}`);
109
- }
@@ -1,27 +0,0 @@
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 +0,0 @@
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
- run: exit 1
@@ -1,128 +0,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
- run: exit 1
package/.husky/pre-commit DELETED
@@ -1 +0,0 @@
1
- npx lint-staged
package/.husky/pre-push DELETED
@@ -1 +0,0 @@
1
- node ./scripts/prepush.js