@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
package/.editorconfig
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
|
|
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
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
**/node_modules
|
|
1
|
+
**/node_modules
|
package/.eslintrc.cjs
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
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
|
+
/*
|
|
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 +1,125 @@
|
|
|
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);
|
|
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
125
|
}
|
|
@@ -1,109 +1,109 @@
|
|
|
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}`);
|
|
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
109
|
}
|