Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
1358c69
chore: enforce LF line endings via .gitattributes
cdenig Sep 23, 2026
6cde284
fix(ws): ignore events from stale sockets to stop duplicate debug mes…
cdenig Sep 23, 2026
425ee1e
fix(console): ignore repeat Join clicks while a session request is pe…
cdenig Sep 23, 2026
b479f85
fix(console): use server-selected debug session URL
cdenig Sep 23, 2026
6bb0a94
test: replace stale CRA "learn react" test with Help route smoke test
cdenig Sep 23, 2026
fab51a0
chore: add eslint as a dev dependency
cdenig Sep 23, 2026
2746970
chore: add ESLint flat config and Prettier setup
cdenig Sep 23, 2026
240c88c
style: format codebase with Prettier
cdenig Sep 23, 2026
a1bcd0d
chore: ignore Prettier formatting commit in git blame
cdenig Sep 23, 2026
1bce11f
fix: resolve ESLint errors
cdenig Sep 23, 2026
b47b411
chore: update VS Code settings for ESLint flat config and Prettier
cdenig Sep 23, 2026
bcf3a41
Merge pull request #46 from PepperDash:chore/eslint-prettier-config
cdenig Sep 23, 2026
c0bd097
docs: raise documented Node.js minimum to match tooling
cdenig Sep 23, 2026
e8c18ec
fix: clarify functional grouping examples in device management tutorial
cdenig Sep 23, 2026
9bd0cb0
Merge pull request #47 from PepperDash/chore/eslint-prettier-config
cdenig Sep 23, 2026
03999b7
fix(console): track connecting state to block duplicate debug sessions
cdenig Sep 23, 2026
f26a904
fix stale debug session state on app changes
Copilot Sep 23, 2026
be5edca
fix: Merge browser and node globals in ESLint config
ndorin Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Bulk formatting commits; `git config blame.ignoreRevsFile .git-blame-ignore-revs`
# style: format codebase with Prettier
240c88cfcecad248f9c230e85fd5a9d2779e145c
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
4 changes: 4 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
dist
coverage
package-lock.json
public
2 changes: 1 addition & 1 deletion prettierrc.json → .prettierrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
"tabWidth": 2,
"semi": true,
"singleQuote": true
}
}
13 changes: 7 additions & 6 deletions .releaserc.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
]
}
],
"@semantic-release/release-notes-generator",
["@semantic-release/changelog",
"@semantic-release/release-notes-generator",
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md"
}
Expand All @@ -22,15 +23,15 @@
"publishCmd": "echo \"version=${nextRelease.version}\" >> $GITHUB_OUTPUT && echo \"tag=${nextRelease.gitTag}\" >> $GITHUB_OUTPUT && echo \"type=${nextRelease.type}\" >> $GITHUB_OUTPUT && echo \"channel=${nextRelease.channel}\" >> $GITHUB_OUTPUT"
}
]
],
],
"branches": [
"main",
{"name": "development", "prerelease": "beta", "channel": "beta"},
{"name": "release", "prerelease": "rc", "channel": "rc"},
{ "name": "development", "prerelease": "beta", "channel": "beta" },
{ "name": "release", "prerelease": "rc", "channel": "rc" },
{
"name": "replace-me-feature-branch",
"prerelease": "replace-me-prerelease",
"channel": "replace-me-prerelease"
}
]
}
}
3 changes: 3 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
}
21 changes: 9 additions & 12 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,20 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Edge",
"request": "launch",
"type": "msedge",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
},
{
"name": "Launch Edge",
"request": "launch",
"type": "msedge",
"url": "http://localhost:8080",
"webRoot": "${workspaceFolder}"
},
{
"type": "msedge",
"request": "launch",
"name": "Launch Edge against localhost",
"url": "https://localhost:3000/debug/",
"webRoot": "${workspaceFolder}",
"outFiles": [
"${workspaceFolder}/**/*.js",
"!**/node_modules/**"
]
"outFiles": ["${workspaceFolder}/**/*.js", "!**/node_modules/**"]
}
]
}
}
38 changes: 7 additions & 31 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,40 +1,16 @@
{
"conventionalCommits.scopes": [
"force-patch"
],
"conventionalCommits.scopes": ["force-patch"],
"editor.tabSize": 2,
"conventionalCommits.gitmoji": false,
"conventionalCommits.promptFooter": false,
"eslint.validate": [
"javascript",
"typescript",
"html"
],
"eslint.options": {
"extensions": [
".js",
".ts",
"html",
"tsx"
]
},
"eslint.rules.customizations": [
{
"rule": "prettier/prettier",
"severity": "info"
}
],
"editor.codeActionsOnSave": [
"source.organizeImports",
"source.fixAll.eslint"
],
"editor.formatOnSave": false,
"eslint.alwaysShowStatus": true,
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.fixAll.eslint": "explicit"
},
"typescript.preferences.quoteStyle": "single",
"typescript.updateImportsOnFileMove.enabled": "always",
"javascript.updateImportsOnFileMove.enabled": "always",
"editor.linkedEditing": true
}
}
247 changes: 119 additions & 128 deletions .vscode/snippets.code-snippets
Original file line number Diff line number Diff line change
@@ -1,130 +1,121 @@
{
// Place your portal-frontend workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.info('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"Effects Comment": {
"prefix": "*eff",
"body": [
"/* EFFECTS *********************************************************/$0"
],
"description": "Adds EFFECTS comment"
},
"Functions Comment": {
"prefix": "*fun",
"body": [
"/* FUNCTIONS *******************************************************/$0"
],
"description": "Adds FUNCTIONS comment"
},
"Hooks Comment": {
"prefix": "*hoo",
"body": [
"/* HOOKS ***********************************************************/$0"
],
"description": "Adds HOOKS comment"
},
"Render Comment": {
"prefix": "*ren",
"body": [
"/* RENDER **********************************************************/$0"
],
"description": "Adds RENDER comment"
},
"State Comment": {
"prefix": "*state",
"body": [
"/* STATE ***********************************************************/$0"
],
"description": "Adds STATE comment"
},
"Create Function Component": {
"prefix": "cfc",
"body": [
"import React from 'react';",
"",
"const ${1:$TM_FILENAME_BASE} = () => {",
" return <></>;",
"}",
"",
"export default $1;"
],
"description": "Adds boilerplate for a function component without props",
"scope": "typescriptreact"
},
"Create Function Component With Props": {
"prefix": "cfcp",
"body": [
"import React from 'react';",
"",
"const ${1:$TM_FILENAME_BASE} = ({}: $1Props) => {",
" return <></>;",
"}",
"",
"export default $1;",
"",
"interface ${1}Props {",
"",
"}"
],
"description": "Adds boilerplate for a function component with props and interface",
"scope": "typescriptreact"
},
"Create Props for Function Component": {
"prefix": "cprops",
"body": [
"interface ${1:$TM_FILENAME_BASE}Props {",
" $0",
"}"
],
"description": "Adds props interface to existing component",
"scope": "typescriptreact"
},
"useAppTitle Hook": {
"prefix": "useapptitle",
"body": "const setTitle = useAppTitle$0();",
"description": "Adds useAppTitle hook",
"scope": "typescriptreact"
},
"useAppTitleRight Hook": {
"prefix": "useapptitleright",
"body": "const setTitleRight = useAppTitleRight$0();",
"description": "Adds useAppTitleRight hook",
"scope": "typescriptreact"
},
"useSearchParams Hook": {
"prefix": "usesearchparams",
"body": "const [searchParams, setSearchParams] = useSearchParams$0();",
"description": "Adds useSearchParams hook",
"scope": "typescriptreact"
},
"useState Hook": {
"prefix": "usestate",
"body": [
"const [$1, set${1/(.)/${1:/capitalize}/}] = useState$2($3);"
],
"description": "Adds useState hook",
"scope": "typescriptreact"
},
"useEffect Hook": {
"prefix":"useeffect",
"body": ["useEffect$0(() => {",
" ",
"}, [$1]);"
],
"description": "Adds useEffect hook",
"scope": "typescriptreact"
}
// Place your portal-frontend workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.info('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"Effects Comment": {
"prefix": "*eff",
"body": [
"/* EFFECTS *********************************************************/$0",
],
"description": "Adds EFFECTS comment",
},
"Functions Comment": {
"prefix": "*fun",
"body": [
"/* FUNCTIONS *******************************************************/$0",
],
"description": "Adds FUNCTIONS comment",
},
"Hooks Comment": {
"prefix": "*hoo",
"body": [
"/* HOOKS ***********************************************************/$0",
],
"description": "Adds HOOKS comment",
},
"Render Comment": {
"prefix": "*ren",
"body": [
"/* RENDER **********************************************************/$0",
],
"description": "Adds RENDER comment",
},
"State Comment": {
"prefix": "*state",
"body": [
"/* STATE ***********************************************************/$0",
],
"description": "Adds STATE comment",
},
"Create Function Component": {
"prefix": "cfc",
"body": [
"import React from 'react';",
"",
"const ${1:$TM_FILENAME_BASE} = () => {",
" return <></>;",
"}",
"",
"export default $1;",
],
"description": "Adds boilerplate for a function component without props",
"scope": "typescriptreact",
},
"Create Function Component With Props": {
"prefix": "cfcp",
"body": [
"import React from 'react';",
"",
"const ${1:$TM_FILENAME_BASE} = ({}: $1Props) => {",
" return <></>;",
"}",
"",
"export default $1;",
"",
"interface ${1}Props {",
"",
"}",
],
"description": "Adds boilerplate for a function component with props and interface",
"scope": "typescriptreact",
},
"Create Props for Function Component": {
"prefix": "cprops",
"body": ["interface ${1:$TM_FILENAME_BASE}Props {", " $0", "}"],
"description": "Adds props interface to existing component",
"scope": "typescriptreact",
},
"useAppTitle Hook": {
"prefix": "useapptitle",
"body": "const setTitle = useAppTitle$0();",
"description": "Adds useAppTitle hook",
"scope": "typescriptreact",
},
"useAppTitleRight Hook": {
"prefix": "useapptitleright",
"body": "const setTitleRight = useAppTitleRight$0();",
"description": "Adds useAppTitleRight hook",
"scope": "typescriptreact",
},
"useSearchParams Hook": {
"prefix": "usesearchparams",
"body": "const [searchParams, setSearchParams] = useSearchParams$0();",
"description": "Adds useSearchParams hook",
"scope": "typescriptreact",
},
"useState Hook": {
"prefix": "usestate",
"body": ["const [$1, set${1/(.)/${1:/capitalize}/}] = useState$2($3);"],
"description": "Adds useState hook",
"scope": "typescriptreact",
},
"useEffect Hook": {
"prefix": "useeffect",
"body": ["useEffect$0(() => {", " ", "}, [$1]);"],
"description": "Adds useEffect hook",
"scope": "typescriptreact",
},
}
Loading
Loading