| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
0 parents commit 539ef21
74 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,18 @@ | |||
| 1 | + module.exports = { | ||
| 2 | + root: true, | ||
| 3 | + env: { browser: true, es2020: true }, | ||
| 4 | + extends: [ | ||
| 5 | + "eslint:recommended", | ||
| 6 | + "plugin:react/recommended", | ||
| 7 | + "plugin:react/jsx-runtime", | ||
| 8 | + "plugin:react-hooks/recommended", | ||
| 9 | + ], | ||
| 10 | + ignorePatterns: ["dist", ".eslintrc.cjs"], | ||
| 11 | + parserOptions: { ecmaVersion: "latest", sourceType: "module" }, | ||
| 12 | + settings: { react: { version: "18.2" } }, | ||
| 13 | + plugins: ["react-refresh"], | ||
| 14 | + rules: { | ||
| 15 | + "react/jsx-no-target-blank": "off", | ||
| 16 | + "react/prop-types": "off", | ||
| 17 | + }, | ||
| 18 | + }; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,24 @@ | |||
| 1 | + # Logs | ||
| 2 | + logs | ||
| 3 | + *.log | ||
| 4 | + npm-debug.log* | ||
| 5 | + yarn-debug.log* | ||
| 6 | + yarn-error.log* | ||
| 7 | + pnpm-debug.log* | ||
| 8 | + lerna-debug.log* | ||
| 9 | + | ||
| 10 | + node_modules | ||
| 11 | + dist | ||
| 12 | + dist-ssr | ||
| 13 | + *.local | ||
| 14 | + | ||
| 15 | + # Editor directories and files | ||
| 16 | + .vscode/* | ||
| 17 | + !.vscode/extensions.json | ||
| 18 | + .idea | ||
| 19 | + .DS_Store | ||
| 20 | + *.suo | ||
| 21 | + *.ntvs* | ||
| 22 | + *.njsproj | ||
| 23 | + *.sln | ||
| 24 | + *.sw? | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,10 @@ | |||
| 1 | + import { toPng } from "html-to-image"; | ||
| 2 | + | ||
| 3 | + export const loadGetUserSnapshotEventListener = () => { | ||
| 4 | + window.addEventListener("blur", () => { | ||
| 5 | + toPng(document.body).then((url) => { | ||
| 6 | + window.top.postMessage({ type: "USER_SNAPSHOT", snapshot: url }, "http://localhost:3000"); | ||
| 7 | + window.top.postMessage({ type: "USER_SNAPSHOT", snapshot: url }, "https://gptengineer.app"); | ||
| 8 | + }); | ||
| 9 | + }); | ||
| 10 | + }; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,14 @@ | |||
| 1 | + import { loadGetUserSnapshotEventListener } from "./get-user-snapshot"; | ||
| 2 | + import { loadReportUrlChangeEventListener } from "./report-url-change"; | ||
| 3 | + import { loadReportErrorEventListener } from "./report-error"; | ||
| 4 | + | ||
| 5 | + const main = () => { | ||
| 6 | + if (window.top === window.self) { | ||
| 7 | + return; | ||
| 8 | + } | ||
| 9 | + loadGetUserSnapshotEventListener(); | ||
| 10 | + loadReportUrlChangeEventListener(); | ||
| 11 | + loadReportErrorEventListener(); | ||
| 12 | + }; | ||
| 13 | + | ||
| 14 | + main(); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,132 @@ | |||
| 1 | + const postMessage = (message) => { | ||
| 2 | + window.top.postMessage(message, "https://gptengineer.app"); | ||
| 3 | + window.top.postMessage(message, "http://localhost:3000"); | ||
| 4 | + }; | ||
| 5 | + | ||
| 6 | + const patchFetch = (reportHTTPError) => { | ||
| 7 | + // Save the original fetch function | ||
| 8 | + const originalFetch = window.fetch; | ||
| 9 | + | ||
| 10 | + window.fetch = async function (...args) { | ||
| 11 | + try { | ||
| 12 | + // Call the original fetch function | ||
| 13 | + const response = await originalFetch(...args); | ||
| 14 | + | ||
| 15 | + // Optionally, check for errors or log them | ||
| 16 | + if (!response.ok) { | ||
| 17 | + const body = response?.text ? await response.text() : undefined; | ||
| 18 | + reportHTTPError("non_200_response", { | ||
| 19 | + ...response, | ||
| 20 | + status: response.status, | ||
| 21 | + url: args?.[0] || response.url, | ||
| 22 | + body, | ||
| 23 | + method: args?.[1]?.method || "GET", | ||
| 24 | + origin: window.location.origin, | ||
| 25 | + }); | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + return response; | ||
| 29 | + } catch (error) { | ||
| 30 | + // Handle any other fetch errors (e.g., network issues) | ||
| 31 | + reportHTTPError("fetch_error", { | ||
| 32 | + message: error?.message, | ||
| 33 | + stack: error?.stack, | ||
| 34 | + url: args?.[0], | ||
| 35 | + method: args?.[1]?.method || "GET", | ||
| 36 | + origin: window.location.origin, | ||
| 37 | + }); | ||
| 38 | + throw error; | ||
| 39 | + } | ||
| 40 | + }; | ||
| 41 | + }; | ||
| 42 | + | ||
| 43 | + export const loadReportErrorEventListener = (() => { | ||
| 44 | + let isInitialized = false; | ||
| 45 | + | ||
| 46 | + const extractError = ({ message, lineno, colno, filename, error }) => { | ||
| 47 | + return { message, lineno, colno, filename, stack: error?.stack }; | ||
| 48 | + }; | ||
| 49 | + | ||
| 50 | + return () => { | ||
| 51 | + if (isInitialized) return; | ||
| 52 | + | ||
| 53 | + const reportedErrors = new Set(); | ||
| 54 | + | ||
| 55 | + const generateErrorId = (event) => { | ||
| 56 | + const { lineno, colno, filename, message } = event; | ||
| 57 | + return `${message}|${filename}|${lineno}|${colno}`; | ||
| 58 | + }; | ||
| 59 | + | ||
| 60 | + const reportHTTPError = async (type, response) => { | ||
| 61 | + if (type === "non_200_response") { | ||
| 62 | + postMessage({ | ||
| 63 | + type: "FETCH_ERROR", | ||
| 64 | + error: { | ||
| 65 | + message: `failed to call url ${response.url} with status ${response.status} and statusText ${response.statusText}`, | ||
| 66 | + status: response.status, | ||
| 67 | + statusText: response.statusText, | ||
| 68 | + url: response.url, | ||
| 69 | + body: response.body, | ||
| 70 | + }, | ||
| 71 | + }); | ||
| 72 | + } else if (type === "fetch_error") { | ||
| 73 | + postMessage({ | ||
| 74 | + type: "FETCH_ERROR", | ||
| 75 | + error: response, | ||
| 76 | + }); | ||
| 77 | + } | ||
| 78 | + }; | ||
| 79 | + | ||
| 80 | + patchFetch(reportHTTPError); | ||
| 81 | + | ||
| 82 | + const isErrorAlreadyReported = (errorId) => { | ||
| 83 | + if (reportedErrors.has(errorId)) { | ||
| 84 | + return true; | ||
| 85 | + } | ||
| 86 | + reportedErrors.add(errorId); | ||
| 87 | + // Optionally, clear the set after some time to prevent it from growing indefinitely | ||
| 88 | + setTimeout(() => reportedErrors.delete(errorId), 5000); | ||
| 89 | + return false; | ||
| 90 | + }; | ||
| 91 | + | ||
| 92 | + const reportError = (event) => { | ||
| 93 | + const errorId = generateErrorId(event); | ||
| 94 | + | ||
| 95 | + // Prevent error being reported multiple times | ||
| 96 | + if (isErrorAlreadyReported(errorId)) { | ||
| 97 | + return; | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + const error = extractError(event); | ||
| 101 | + | ||
| 102 | + postMessage({ type: "RUNTIME_ERROR", error }); | ||
| 103 | + }; | ||
| 104 | + | ||
| 105 | + // Listen to runtime errors and report them to the parent window | ||
| 106 | + window.addEventListener("error", reportError); | ||
| 107 | + | ||
| 108 | + // Listen to unhandled promise rejections | ||
| 109 | + window.addEventListener("unhandledrejection", (event) => { | ||
| 110 | + if (!event.reason?.stack) { | ||
| 111 | + return; | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + const errorId = | ||
| 115 | + event.reason?.stack || event.reason?.message || String(event.reason); | ||
| 116 | + | ||
| 117 | + // Prevent error being reported multiple times | ||
| 118 | + if (isErrorAlreadyReported(errorId)) { | ||
| 119 | + return; | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | + const error = { | ||
| 123 | + message: event.reason?.message || "Unhandled promise rejection", | ||
| 124 | + stack: event.reason?.stack || String(event.reason), | ||
| 125 | + }; | ||
| 126 | + | ||
| 127 | + postMessage({ type: "UNHANDLED_PROMISE_REJECTION", error }); | ||
| 128 | + }); | ||
| 129 | + | ||
| 130 | + isInitialized = true; | ||
| 131 | + }; | ||
| 132 | + })(); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,23 @@ | |||
| 1 | + export const loadReportUrlChangeEventListener = () => { | ||
| 2 | + /** | ||
| 3 | + * Listen to URL changes and report them to the parent window | ||
| 4 | + * | ||
| 5 | + * See https://stackoverflow.com/a/46428962 | ||
| 6 | + * The Navigation API https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API seemed promising, | ||
| 7 | + * but it is not supported in all major browsers. | ||
| 8 | + */ | ||
| 9 | + const observeUrlChange = () => { | ||
| 10 | + let oldHref = document.location.href; | ||
| 11 | + const body = document.querySelector("body"); | ||
| 12 | + const observer = new MutationObserver(() => { | ||
| 13 | + if (oldHref !== document.location.href) { | ||
| 14 | + oldHref = document.location.href; | ||
| 15 | + window.top.postMessage({ type: "URL_CHANGED", url: document.location.href }, "https://run.gptengineer.app"); | ||
| 16 | + window.top.postMessage({ type: "URL_CHANGED", url: document.location.href }, "http://localhost:3000"); | ||
| 17 | + } | ||
| 18 | + }); | ||
| 19 | + observer.observe(body, { childList: true, subtree: true }); | ||
| 20 | + }; | ||
| 21 | + | ||
| 22 | + window.addEventListener("load", observeUrlChange); | ||
| 23 | + }; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,72 @@ | |||
| 1 | + # Welcome to your GPT Engineer project | ||
| 2 | + | ||
| 3 | + ## Project info | ||
| 4 | + | ||
| 5 | + **Project**: drupalscape | ||
| 6 | + | ||
| 7 | + **URL**: https://run.gptengineer.app/projects/c50d6e8d-551a-4f45-9a73-21075d4d806b/improve | ||
| 8 | + | ||
| 9 | + ## How can I edit this code? | ||
| 10 | + | ||
| 11 | + There are several ways of editing your application. | ||
| 12 | + | ||
| 13 | + **Use GPT Engineer** | ||
| 14 | + | ||
| 15 | + Simply visit the GPT Engineer project at [GPT Engineer](https://gptengineer.app/projects/c50d6e8d-551a-4f45-9a73-21075d4d806b/improve) and start prompting. | ||
| 16 | + | ||
| 17 | + Changes made via gptengineer.app will be committed automatically to this repo. | ||
| 18 | + | ||
| 19 | + **Use your preferred IDE** | ||
| 20 | + | ||
| 21 | + If you want to work locally using your own IDE, you can clone this repo and push changes. Pushed changes will also be reflected in the GPT Engineer UI. | ||
| 22 | + | ||
| 23 | + The only requirement is having Node.js & npm installed - [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating) | ||
| 24 | + | ||
| 25 | + Follow these steps: | ||
| 26 | + | ||
| 27 | + ```sh | ||
| 28 | + # Step 1: Clone the repository using the project's Git URL. | ||
| 29 | + git clone <YOUR_GIT_URL> | ||
| 30 | + | ||
| 31 | + # Step 2: Navigate to the project directory. | ||
| 32 | + cd <YOUR_PROJECT_NAME> | ||
| 33 | + | ||
| 34 | + # Step 3: Install the necessary dependencies. | ||
| 35 | + npm i | ||
| 36 | + | ||
| 37 | + # Step 4: Start the development server with auto-reloading and an instant preview. | ||
| 38 | + npm run dev | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | + **Edit a file directly in GitHub** | ||
| 42 | + | ||
| 43 | + - Navigate to the desired file(s). | ||
| 44 | + - Click the "Edit" button (pencil icon) at the top right of the file view. | ||
| 45 | + - Make your changes and commit the changes. | ||
| 46 | + | ||
| 47 | + **Use GitHub Codespaces** | ||
| 48 | + | ||
| 49 | + - Navigate to the main page of your repository. | ||
| 50 | + - Click on the "Code" button (green button) near the top right. | ||
| 51 | + - Select the "Codespaces" tab. | ||
| 52 | + - Click on "New codespace" to launch a new Codespace environment. | ||
| 53 | + - Edit files directly within the Codespace and commit and push your changes once you're done. | ||
| 54 | + | ||
| 55 | + ## What technologies are used for this project? | ||
| 56 | + | ||
| 57 | + This project is built with . | ||
| 58 | + | ||
| 59 | + - Vite | ||
| 60 | + - React | ||
| 61 | + - shadcn-ui | ||
| 62 | + - Tailwind CSS | ||
| 63 | + | ||
| 64 | + ## How can I deploy this project? | ||
| 65 | + | ||
| 66 | + All GPT Engineer projects can be deployed directly via the GPT Engineer app. | ||
| 67 | + | ||
| 68 | + Simply visit your project at [GPT Engineer](https://gptengineer.app/projects/c50d6e8d-551a-4f45-9a73-21075d4d806b/improve) and click on Share -> Publish. | ||
| 69 | + | ||
| 70 | + ## I want to use a custom domain - is that possible? | ||
| 71 | + | ||
| 72 | + We don't support custom domains (yet). If you want to deploy your project under your own domain then we recommend using Netlify. Visit our docs for more details: [Custom domains](https://docs.gptengineer.app/tips-tricks/custom-domain/) | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,17 @@ | |||
| 1 | + { | ||
| 2 | + "$schema": "https://ui.shadcn.com/schema.json", | ||
| 3 | + "style": "default", | ||
| 4 | + "rsc": false, | ||
| 5 | + "tsx": false, | ||
| 6 | + "tailwind": { | ||
| 7 | + "config": "tailwind.config.js", | ||
| 8 | + "css": "src/index.css", | ||
| 9 | + "baseColor": "slate", | ||
| 10 | + "cssVariables": true, | ||
| 11 | + "prefix": "" | ||
| 12 | + }, | ||
| 13 | + "aliases": { | ||
| 14 | + "components": "@/components", | ||
| 15 | + "utils": "@/lib/utils" | ||
| 16 | + } | ||
| 17 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,5 @@ | |||
| 1 | + [run] | ||
| 2 | + build = "npm run build" | ||
| 3 | + | ||
| 4 | + [gptengineer-app] | ||
| 5 | + project_id = "..." | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments