Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WXT_GOOGLE_MAPS_API_KEY=your_google_maps_embed_api_key
39 changes: 0 additions & 39 deletions .eslintrc

This file was deleted.

11 changes: 11 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## Summary

<!-- Briefly describe the change. -->

## Notes

<!-- Anything worth remembering: tradeoffs, edge cases, follow-ups, screenshots, etc. -->

## Testing

<!-- Commands run, manual checks, or "Not run". -->
33 changes: 33 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CI

on:
pull_request:
push:
branches: [main]

permissions: {}

jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Set persist-credentials: false on checkout.

Static analysis (zizmor) flags both actions/checkout@v6 steps for not disabling credential persistence. Since permissions: {} already limits token scope, risk is low, but this is a cheap hardening step to prevent the token from lingering in the git config for subsequent steps (e.g., pnpm install scripts).

🔒 Proposed fix
       - uses: actions/checkout@v6
+        with:
+          persist-credentials: false

Also applies to: 29-29

🧰 Tools
🪛 zizmor (1.26.1)

[warning] 14-14: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml at line 14, The two actions/checkout@v6 steps in
the CI workflow should disable git credential persistence to harden the job.
Update each checkout invocation to set persist-credentials to false so the token
is not left in the local git config for later steps. Use the existing checkout
steps in the workflow as the target and keep the rest of the job unchanged.

Source: Linters/SAST tools

with:
persist-credentials: false

- uses: jdx/mise-action@v4

- run: pnpm install --frozen-lockfile
- run: pnpm run format:check

lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false

- uses: jdx/mise-action@v4

- run: pnpm install --frozen-lockfile
- run: pnpm run lint
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@
# build
/dist

.output
.wxt

# etc
.DS_Store
.env
.env.local
.env.*.local
.idea

#generated manifest
Expand All @@ -18,4 +23,4 @@ public/manifest.json
dist.pem
dist.crx
dist.zip
**/*.zip
**/*.zip
5 changes: 5 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"sortImports": true,
"useTabs": true
}
13 changes: 13 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"env": {
"browser": true,
"es6": true,
"node": true
},
"plugins": ["eslint", "typescript", "unicorn", "oxc", "import", "jsx-a11y"],
"globals": {
"chrome": "readonly"
},
"ignorePatterns": ["watch.js", "dist/**", "**/*.css"]
}
13 changes: 0 additions & 13 deletions .prettierrc

This file was deleted.

23 changes: 8 additions & 15 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
{
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
],
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.fixAll.eslint": "explicit"
},
"javascript.preferences.quoteStyle": "single",
"typescript.preferences.quoteStyle": "single",
"prettier.singleQuote": true,
"debug.internalConsoleOptions": "neverOpen",
}
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.fixAll.oxlint": "explicit"
},
"editor.defaultFormatter": "oxc.oxc-vscode",
"debug.internalConsoleOptions": "neverOpen",
"typescript.tsdk": "node_modules/typescript/lib"
}
44 changes: 34 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,48 @@
# TransitEasy
This repository contains a chrome extension that lets you see the transit times for streeteasy properties

TransitEasy is a Chrome extension that shows transit directions for StreetEasy listings.

## Features

- Save a work address in extension storage
- Inject a Google Maps transit iframe into StreetEasy listing pages
- Rebuild automatically during development with WXT

## Development

1. Install dependencies:
`pnpm install`
2. Start the watch build:
2. Create your local environment file:
`cp .env.example .env`
3. Set `WXT_GOOGLE_MAPS_API_KEY` in `.env` to a Google Maps Embed API key.
4. Start the watch build:
`pnpm dev`
3. In Chrome, open `chrome://extensions`, enable Developer mode, and click Load unpacked.
4. Select the `dist` folder in this repository.
5. In Chrome, open `chrome://extensions`, enable Developer mode, and click Load unpacked.
6. Select the `.output` folder in this repository.

The extension will rebuild automatically while `pnpm dev` is running. Use `pnpm build` for a one-off production build.

Available scripts:

- `pnpm dev` - start the WXT dev server
- `pnpm build` - create a production build
- `pnpm zip` - package the extension
- `pnpm lint` - run oxlint
- `pnpm lint:fix` - fix lint issues
- `pnpm format` - format the code
- `pnpm format:check` - check formatting

## Demo

1. Select an address to use for work.
![Popup for the extension](https://i.imgur.com/VqvDvkU.png)
![Popup for the extension](https://i.imgur.com/VqvDvkU.png)
2. Scroll down on StreetEasy
![iframe that shows how it works](https://i.imgur.com/C0Ns7yf.png)
![iframe that shows how it works](https://i.imgur.com/C0Ns7yf.png)

## Stack

# Stack
- SolidJS
- Vite
- HopeUI
- Google MapsEmbed API
- WXT
- Tailwind CSS
- daisyUI
- Google Maps Embed API
3 changes: 3 additions & 0 deletions mise.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[tools]
node = "24"
pnpm = "11"
13 changes: 0 additions & 13 deletions nodemon.json

This file was deleted.

76 changes: 32 additions & 44 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,46 +1,34 @@
{
"name": "transit-easy",
"displayName": "TransitEasy",
"version": "1.3.0",
"description": "Chrome Extension that allows you to see transit directions for listings on StreetEasy",
"license": "MIT",
"scripts": {
"dev": "vite build -w",
"build": "vite build",
"lint": "eslint . --fix -c .eslintrc --ext js,ts --ignore-pattern='!.*'",
"dev:nodemon": "nodemon",
"build:noemit": "tsc --noEmit && vite build"
},
"type": "module",
"dependencies": {
"@hope-ui/solid": "^0.6.7",
"@stitches/core": "^1.2.8",
"solid-js": "^1.7.5",
"solid-transition-group": "^0.2.2"
},
"devDependencies": {
"@crxjs/vite-plugin": "2.2.0",
"@trivago/prettier-plugin-sort-imports": "^4.1.1",
"@types/chrome": "0.0.235",
"@types/node": "20.1.0",
"@typescript-eslint/eslint-plugin": "5.59.2",
"@typescript-eslint/parser": "5.59.2",
"autoprefixer": "^10.4.14",
"babel-preset-solid": "^1.7.4",
"eslint": "8.40.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-jsx-a11y": "6.7.1",
"eslint-plugin-prettier": "4.2.1",
"eslint-plugin-solid": "0.12.1",
"eslint-plugin-tailwindcss": "^3.11.0",
"nodemon": "2.0.22",
"postcss": "^8.4.23",
"prettier": "2.8.8",
"tailwindcss": "^3.4.17",
"ts-node": "10.9.1",
"typescript": "5.0.4",
"vite": "4.3.5",
"vite-plugin-solid": "^2.7.0"
}
"name": "transit-easy",
"displayName": "TransitEasy",
"version": "2.0.0",
"private": "true",
"description": "Chrome Extension that allows you to see transit directions for listings on StreetEasy",
"license": "MIT",
"type": "module",
"scripts": {
"dev": "wxt",
"build": "wxt build",
"zip": "wxt zip",
"lint": "oxlint",
"lint:fix": "oxlint --fix",
"format": "oxfmt",
"format:check": "oxfmt --check",
"postinstall": "wxt prepare"
},
"dependencies": {
"daisyui": "^5.5.20",
"solid-js": "^1.9.9",
"solid-transition-group": "^0.2.2"
},
"devDependencies": {
"@tailwindcss/vite": "^4.3.0",
"@types/node": "^24",
"@wxt-dev/module-solid": "^1.1.4",
"oxfmt": "^0.57.0",
"oxlint": "^1.72.0",
"tailwindcss": "^4.3.0",
"typescript": "6.0.3",
"wxt": "^0.20.26"
}
}
Loading