This commit is contained in:
2025-12-17 23:12:53 +01:00
commit 5807d949ef
323 changed files with 34158 additions and 0 deletions

46
.aiinstruct Normal file
View File

@@ -0,0 +1,46 @@
# Project Context: Whisky Vault PWA
You are an expert Full Stack Developer building a "Whisky Vault" Progressive Web App.
The app is a mobile-first tool for whisky enthusiasts to scan bottles, track their collection, and record tasting notes.
## 🛠 Tech Stack & Constraints
- **Framework:** Next.js 14+ (App Router).
- **Language:** TypeScript (Strict mode).
- **Styling:** Tailwind CSS (Mobile-first). NO custom CSS files, use utility classes only.
- **UI Components:** Shadcn/UI or Headless UI (accessible, responsive).
- **Backend/DB:** Supabase (PostgreSQL + Auth + Storage).
- **AI/Vision:** Google Gemini 3 Flash (via `@google/generative-ai` SDK).
- **State Management:** React Query (TanStack Query) for async data.
## 📱 Features & Architecture
### 1. "Magic Shot" (OCR & Analysis)
- **Input:** User uploads/captures a photo via `<input type="file" capture="environment" />`.
- **Pre-processing:** Resize image client-side (max 1024px width) using Canvas API to save bandwidth.
- **AI Processing:** Send Base64 image to a Next.js Server Action.
- **Gemini Model:** Use `gemini-1.5-flash` (or `gemini-3-flash` if available).
- **Prompt Strategy:** Ask Gemini to extract: Name, Distillery, Age, ABV, Vintage, Bottle Code. Return strictly valid JSON using `response_mime_type: "application/json"`.
### 2. Database Schema (Supabase)
Assume the following relational structure. Always generate Supabase-compatible SQL/Types.
- `profiles`: id (uuid), username, avatar_url.
- `bottles`: id, user_id, name, distillery, category (Single Malt, Bourbon, etc.), abv, age, status (sealed, open, empty), whiskybase_id, image_url.
- `tastings`: id, bottle_id, user_id, rating (0-100), nose_notes, palate_notes, finish_notes, audio_transcript_url.
### 3. Responsive Layout Strategy
- **Mobile:** Single column cards. Bottom navigation bar. Large touch targets (min 44px).
- **Desktop:** Dashboard view. Sidebar navigation. Data tables (TanStack Table) for managing the inventory. Split-screen view for editing bottle details vs. original photo.
### 4. External Data (Whiskybase)
- Do NOT attempt to build a complex scraper.
- Use a "Search Link" strategy: Generate a button that opens `https://www.whiskybase.com/search?q={Name}+{Distillery}`.
- Alternatively, use Google Custom Search API if automated fetching is required.
## 🚨 Coding Rules (The "Anti-Gravity" Laws)
1. **AI First:** Wherever possible, offload parsing logic to Gemini. Don't write Regex for bottle codes.
2. **Type Safety:** Always define Zod schemas for API inputs/outputs.
3. **Performance:** Use `next/image` for all bottle photos. Implement lazy loading for the collection grid.
4. **Error Handling:** Wrap all Server Actions in try/catch blocks and return standardized `{ success: boolean, data?: any, error?: string }` objects.
## 🧠 Gemini System Instruction (for the API Route)
When implementing the vision API route, use this system instruction for the model:
"You are a sommelier and database clerk. Analyze the whisky bottle image. Extract precise metadata. If a value is not visible, use null. Infer the 'Category' (e.g., Islay Single Malt) based on the Distillery if possible. Output raw JSON."

3
.env.local Normal file
View File

@@ -0,0 +1,3 @@
NEXT_PUBLIC_SUPABASE_URL=http://192.168.0.66:8001
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTc2NjAwMzQwMCwiZXhwIjo0OTIxNjc3MDAwLCJyb2xlIjoiYW5vbiJ9.OYLx4lVEiZE9FwJ5_erkJxZBsbRjGykl58vztzzZQ0U
GEMINI_API_KEY=AIzaSyBNWuAXBjAnGrLwckUhLGJxkiikiZr6j50

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules

View File

@@ -0,0 +1,20 @@
{
"pages": {
"/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/page.js"
],
"/layout": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/css/app/layout.css",
"static/chunks/app/layout.js"
],
"/bottles/[id]/page": [
"static/chunks/webpack.js",
"static/chunks/main-app.js",
"static/chunks/app/bottles/[id]/page.js"
]
}
}

30
.next/build-manifest.json Normal file
View File

@@ -0,0 +1,30 @@
{
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [
"static/chunks/react-refresh.js"
],
"ampDevFiles": [],
"lowPriorityFiles": [
"static/development/_buildManifest.js",
"static/development/_ssgManifest.js"
],
"rootMainFiles": [
"static/chunks/webpack.js",
"static/chunks/main-app.js"
],
"pages": {
"/_app": [
"static/chunks/webpack.js",
"static/chunks/main.js",
"static/chunks/pages/_app.js"
],
"/_error": [
"static/chunks/webpack.js",
"static/chunks/main.js",
"static/chunks/pages/_error.js"
]
},
"ampFirstPages": []
}

View File

@@ -0,0 +1 @@
{"version":1,"items":{"_N_T_/bottles/19df36da-0159-478c-97a1-29d286b32f84":{"revalidatedAt":1766009108789},"_N_T_/bottles/5b2de950-491c-477f-97df-3c33ccb6ffb4":{"revalidatedAt":1766009398621},"_N_T_/":{"revalidatedAt":1766009108789},"_N_T_/bottles/4d6e34fe-b465-4be4-bafd-9cc583f75f94":{"revalidatedAt":1766009377758}}}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,27 @@
{
"polyfillFiles": [
"static/chunks/polyfills.js"
],
"devFiles": [
"static/chunks/fallback/react-refresh.js"
],
"ampDevFiles": [
"static/chunks/fallback/webpack.js",
"static/chunks/fallback/amp.js"
],
"lowPriorityFiles": [],
"rootMainFiles": [],
"pages": {
"/_app": [
"static/chunks/fallback/webpack.js",
"static/chunks/fallback/main.js",
"static/chunks/fallback/pages/_app.js"
],
"/_error": [
"static/chunks/fallback/webpack.js",
"static/chunks/fallback/main.js",
"static/chunks/fallback/pages/_error.js"
]
},
"ampFirstPages": []
}

1
.next/package.json Normal file
View File

@@ -0,0 +1 @@
{"type": "commonjs"}

View File

@@ -0,0 +1 @@
{}

76
.next/server/_error.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
{
"/page": "app/page.js",
"/bottles/[id]/page": "app/bottles/[id]/page.js"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

436
.next/server/app/page.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
self.__BUILD_MANIFEST={"polyfillFiles":["static/chunks/polyfills.js"],"devFiles":["static/chunks/react-refresh.js"],"ampDevFiles":[],"lowPriorityFiles":["static/development/_buildManifest.js","static/development/_ssgManifest.js"],"rootMainFiles":["static/chunks/webpack.js","static/chunks/main-app.js"],"pages":{"/_app":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_app.js"],"/_error":["static/chunks/webpack.js","static/chunks/main.js","static/chunks/pages/_error.js"]},"ampFirstPages":[]}

View File

@@ -0,0 +1,25 @@
{
"sortedMiddleware": [
"/"
],
"middleware": {
"/": {
"files": [
"server/edge-runtime-webpack.js",
"server/src/middleware.js"
],
"name": "src/middleware",
"page": "/",
"matchers": [
{
"regexp": "^/.*$",
"originalSource": "/:path*"
}
],
"wasm": [],
"assets": []
}
},
"functions": {},
"version": 2
}

View File

@@ -0,0 +1 @@
self.__REACT_LOADABLE_MANIFEST="{}"

View File

@@ -0,0 +1 @@
self.__NEXT_FONT_MANIFEST="{\"pages\":{},\"app\":{\"/home/robin/AI/Coding/Whisky/src/app/layout\":[\"static/media/e4af272ccee01ff0-s.p.woff2\"]},\"appUsingSizeAdjust\":true,\"pagesUsingSizeAdjust\":false}"

View File

@@ -0,0 +1 @@
{"pages":{},"app":{"/home/robin/AI/Coding/Whisky/src/app/layout":["static/media/e4af272ccee01ff0-s.p.woff2"]},"appUsingSizeAdjust":true,"pagesUsingSizeAdjust":false}

View File

@@ -0,0 +1,5 @@
{
"/_app": "pages/_app.js",
"/_error": "pages/_error.js",
"/_document": "pages/_document.js"
}

View File

@@ -0,0 +1,46 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(() => {
var exports = {};
exports.id = "pages/_app";
exports.ids = ["pages/_app"];
exports.modules = {
/***/ "react":
/*!************************!*\
!*** external "react" ***!
\************************/
/***/ ((module) => {
module.exports = require("react");
/***/ }),
/***/ "react/jsx-runtime":
/*!************************************!*\
!*** external "react/jsx-runtime" ***!
\************************************/
/***/ ((module) => {
module.exports = require("react/jsx-runtime");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/@swc"], () => (__webpack_exec__("./node_modules/next/dist/pages/_app.js")));
module.exports = __webpack_exports__;
})();

View File

@@ -0,0 +1,66 @@
"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(() => {
var exports = {};
exports.id = "pages/_document";
exports.ids = ["pages/_document"];
exports.modules = {
/***/ "next/dist/compiled/next-server/pages.runtime.dev.js":
/*!**********************************************************************!*\
!*** external "next/dist/compiled/next-server/pages.runtime.dev.js" ***!
\**********************************************************************/
/***/ ((module) => {
module.exports = require("next/dist/compiled/next-server/pages.runtime.dev.js");
/***/ }),
/***/ "react":
/*!************************!*\
!*** external "react" ***!
\************************/
/***/ ((module) => {
module.exports = require("react");
/***/ }),
/***/ "react/jsx-runtime":
/*!************************************!*\
!*** external "react/jsx-runtime" ***!
\************************************/
/***/ ((module) => {
module.exports = require("react/jsx-runtime");
/***/ }),
/***/ "path":
/*!***********************!*\
!*** external "path" ***!
\***********************/
/***/ ((module) => {
module.exports = require("path");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/@swc"], () => (__webpack_exec__("./node_modules/next/dist/pages/_document.js")));
module.exports = __webpack_exports__;
})();

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"af8f7c7b0fe98b99031bb1c9e8ef0ed13b2eae40\": {\n \"workers\": {\n \"app/page\": \"(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fanalyze-bottle.ts%22%2C%5B%22analyzeBottle%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-bottle.ts%22%2C%5B%22saveBottle%22%5D%5D%5D&__client_imported__=true!\"\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n }\n },\n \"9cc2ffbf85f4e72220537b4253faa867d3a48bad\": {\n \"workers\": {\n \"app/page\": \"(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fanalyze-bottle.ts%22%2C%5B%22analyzeBottle%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-bottle.ts%22%2C%5B%22saveBottle%22%5D%5D%5D&__client_imported__=true!\"\n },\n \"layer\": {\n \"app/page\": \"action-browser\"\n }\n },\n \"6a127058a156be3d9a11c57b1d246782770d0176\": {\n \"workers\": {\n \"app/bottles/[id]/page\": \"(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fupdate-bottle-status.ts%22%2C%5B%22updateBottleStatus%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-tasting.ts%22%2C%5B%22saveTasting%22%5D%5D%5D&__client_imported__=true!\"\n },\n \"layer\": {\n \"app/bottles/[id]/page\": \"action-browser\"\n }\n },\n \"e1977f062955b9a8da859aeedf3804faaa120650\": {\n \"workers\": {\n \"app/bottles/[id]/page\": \"(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fupdate-bottle-status.ts%22%2C%5B%22updateBottleStatus%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-tasting.ts%22%2C%5B%22saveTasting%22%5D%5D%5D&__client_imported__=true!\"\n },\n \"layer\": {\n \"app/bottles/[id]/page\": \"action-browser\"\n }\n }\n },\n \"edge\": {},\n \"encryptionKey\": \"4RdBFpcP/vD8bgHhBZz5hrn1hKw9NazGqqaZdOVPnxY=\"\n}"

View File

@@ -0,0 +1,38 @@
{
"node": {
"af8f7c7b0fe98b99031bb1c9e8ef0ed13b2eae40": {
"workers": {
"app/page": "(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fanalyze-bottle.ts%22%2C%5B%22analyzeBottle%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-bottle.ts%22%2C%5B%22saveBottle%22%5D%5D%5D&__client_imported__=true!"
},
"layer": {
"app/page": "action-browser"
}
},
"9cc2ffbf85f4e72220537b4253faa867d3a48bad": {
"workers": {
"app/page": "(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fanalyze-bottle.ts%22%2C%5B%22analyzeBottle%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-bottle.ts%22%2C%5B%22saveBottle%22%5D%5D%5D&__client_imported__=true!"
},
"layer": {
"app/page": "action-browser"
}
},
"6a127058a156be3d9a11c57b1d246782770d0176": {
"workers": {
"app/bottles/[id]/page": "(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fupdate-bottle-status.ts%22%2C%5B%22updateBottleStatus%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-tasting.ts%22%2C%5B%22saveTasting%22%5D%5D%5D&__client_imported__=true!"
},
"layer": {
"app/bottles/[id]/page": "action-browser"
}
},
"e1977f062955b9a8da859aeedf3804faaa120650": {
"workers": {
"app/bottles/[id]/page": "(action-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fupdate-bottle-status.ts%22%2C%5B%22updateBottleStatus%22%5D%5D%2C%5B%22%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fsrc%2Fservices%2Fsave-tasting.ts%22%2C%5B%22saveTasting%22%5D%5D%5D&__client_imported__=true!"
},
"layer": {
"app/bottles/[id]/page": "action-browser"
}
}
},
"edge": {},
"encryptionKey": "4RdBFpcP/vD8bgHhBZz5hrn1hKw9NazGqqaZdOVPnxY="
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"c":[],"r":[],"m":[]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,215 @@
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({});
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ id: moduleId,
/******/ loaded: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ var threw = true;
/******/ try {
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ threw = false;
/******/ } finally {
/******/ if(threw) delete __webpack_module_cache__[moduleId];
/******/ }
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = __webpack_modules__;
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/create fake namespace object */
/******/ (() => {
/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);
/******/ var leafPrototypes;
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 16: return value when it's Promise-like
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = this(value);
/******/ if(mode & 8) return value;
/******/ if(typeof value === 'object' && value) {
/******/ if((mode & 4) && value.__esModule) return value;
/******/ if((mode & 16) && typeof value.then === 'function') return value;
/******/ }
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ var def = {};
/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];
/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {
/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));
/******/ }
/******/ def['default'] = () => (value);
/******/ __webpack_require__.d(ns, def);
/******/ return ns;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/ensure chunk */
/******/ (() => {
/******/ __webpack_require__.f = {};
/******/ // This file contains only the entry chunk.
/******/ // The chunk loading function for additional chunks
/******/ __webpack_require__.e = (chunkId) => {
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
/******/ __webpack_require__.f[key](chunkId, promises);
/******/ return promises;
/******/ }, []));
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/get javascript chunk filename */
/******/ (() => {
/******/ // This function allow to reference async chunks and sibling chunks for the entrypoint
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
/******/ return "" + chunkId + ".js";
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/getFullHash */
/******/ (() => {
/******/ __webpack_require__.h = () => ("0776ab2dbf0ec189")
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/node module decorator */
/******/ (() => {
/******/ __webpack_require__.nmd = (module) => {
/******/ module.paths = [];
/******/ if (!module.children) module.children = [];
/******/ return module;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/startup entrypoint */
/******/ (() => {
/******/ __webpack_require__.X = (result, chunkIds, fn) => {
/******/ // arguments: chunkIds, moduleId are deprecated
/******/ var moduleId = chunkIds;
/******/ if(!fn) chunkIds = result, fn = () => (__webpack_require__(__webpack_require__.s = moduleId));
/******/ chunkIds.map(__webpack_require__.e, __webpack_require__)
/******/ var r = fn();
/******/ return r === undefined ? result : r;
/******/ }
/******/ })();
/******/
/******/ /* webpack/runtime/require chunk loading */
/******/ (() => {
/******/ // no baseURI
/******/
/******/ // object to store loaded chunks
/******/ // "1" means "loaded", otherwise not loaded yet
/******/ var installedChunks = {
/******/ "webpack-runtime": 1
/******/ };
/******/
/******/ // no on chunks loaded
/******/
/******/ var installChunk = (chunk) => {
/******/ var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime;
/******/ for(var moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(runtime) runtime(__webpack_require__);
/******/ for(var i = 0; i < chunkIds.length; i++)
/******/ installedChunks[chunkIds[i]] = 1;
/******/
/******/ };
/******/
/******/ // require() chunk loading for javascript
/******/ __webpack_require__.f.require = (chunkId, promises) => {
/******/ // "1" is the signal for "already loaded"
/******/ if(!installedChunks[chunkId]) {
/******/ if("webpack-runtime" != chunkId) {
/******/ installChunk(require("./" + __webpack_require__.u(chunkId)));
/******/ } else installedChunks[chunkId] = 1;
/******/ }
/******/ };
/******/
/******/ module.exports = __webpack_require__;
/******/ __webpack_require__.C = installChunk;
/******/
/******/ // no HMR
/******/
/******/ // no HMR manifest
/******/ })();
/******/
/************************************************************************/
/******/
/******/
/******/ })()
;

View File

@@ -0,0 +1,28 @@
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["/_error"],{
/***/ "./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fnode_modules%2Fnext%2Fdist%2Fpages%2F_error.js&page=%2F_error!":
/*!***********************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fnode_modules%2Fnext%2Fdist%2Fpages%2F_error.js&page=%2F_error! ***!
\***********************************************************************************************************************************************************************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
eval(__webpack_require__.ts("\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/_error\",\n function () {\n return __webpack_require__(/*! ./node_modules/next/dist/pages/_error.js */ \"./node_modules/next/dist/pages/_error.js\");\n }\n ]);\n if(true) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/_error\"])\n });\n }\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWNsaWVudC1wYWdlcy1sb2FkZXIuanM/YWJzb2x1dGVQYWdlUGF0aD0lMkZob21lJTJGcm9iaW4lMkZBSSUyRkNvZGluZyUyRldoaXNreSUyRm5vZGVfbW9kdWxlcyUyRm5leHQlMkZkaXN0JTJGcGFnZXMlMkZfZXJyb3IuanMmcGFnZT0lMkZfZXJyb3IhIiwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFPLENBQUMsMEZBQTBDO0FBQ2pFO0FBQ0E7QUFDQSxPQUFPLElBQVU7QUFDakIsTUFBTSxVQUFVO0FBQ2hCO0FBQ0EsT0FBTztBQUNQO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLz83OWFjIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICh3aW5kb3cuX19ORVhUX1AgPSB3aW5kb3cuX19ORVhUX1AgfHwgW10pLnB1c2goW1xuICAgICAgXCIvX2Vycm9yXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlKFwiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3BhZ2VzL19lcnJvci5qc1wiKTtcbiAgICAgIH1cbiAgICBdKTtcbiAgICBpZihtb2R1bGUuaG90KSB7XG4gICAgICBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cuX19ORVhUX1AucHVzaChbXCIvX2Vycm9yXCJdKVxuICAgICAgfSk7XG4gICAgfVxuICAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fnode_modules%2Fnext%2Fdist%2Fpages%2F_error.js&page=%2F_error!\n"));
/***/ })
},
/******/ function(__webpack_require__) { // webpackRuntimeModules
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
/******/ __webpack_require__.O(0, ["main"], function() { return __webpack_exec__("./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2Fhome%2Frobin%2FAI%2FCoding%2FWhisky%2Fnode_modules%2Fnext%2Fdist%2Fpages%2F_error.js&page=%2F_error!"); });
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
/******/ }
]);

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More