adding freight web and holding
This commit is contained in:
@@ -1,29 +0,0 @@
|
|||||||
import type {} from '@star-kitten/discord/jsx';
|
|
||||||
import { ActionRow, Container, Button, TextDisplay } from '@star-kitten/discord';
|
|
||||||
|
|
||||||
export function renderAppraisal() {
|
|
||||||
const formatter = new Intl.NumberFormat('en-US', {
|
|
||||||
maximumFractionDigits: 2,
|
|
||||||
minimumFractionDigits: 2,
|
|
||||||
});
|
|
||||||
const world = 'world';
|
|
||||||
const rand = Math.random() * 1000;
|
|
||||||
const pageCtx = { state: { currentPage: 'home' } };
|
|
||||||
|
|
||||||
let jsx = (
|
|
||||||
<ActionRow>
|
|
||||||
<Container color="0x1da57a">
|
|
||||||
<TextDisplay content={`Hello ${world}`} />
|
|
||||||
{pageCtx.state.currentPage !== 'share' ?
|
|
||||||
<ActionRow>
|
|
||||||
<Button customId="share" label="Share in Channel" disabled={rand < 500} />
|
|
||||||
</ActionRow>
|
|
||||||
: undefined}
|
|
||||||
</Container>
|
|
||||||
</ActionRow>
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log(jsx);
|
|
||||||
}
|
|
||||||
|
|
||||||
renderAppraisal();
|
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
},
|
},
|
||||||
"author": "Author Name <author.name@mail.com>",
|
"author": "Author Name <author.name@mail.com>",
|
||||||
"files": [
|
"files": [
|
||||||
"dist"
|
"dist",
|
||||||
|
"src"
|
||||||
],
|
],
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -26,9 +27,15 @@
|
|||||||
"./pages": "./dist/pages/index.js",
|
"./pages": "./dist/pages/index.js",
|
||||||
"./common": "./dist/common/index.js",
|
"./common": "./dist/common/index.js",
|
||||||
"./package.json": "./package.json",
|
"./package.json": "./package.json",
|
||||||
"./jsx": "./src/jsx/jsx.ts",
|
"./jsx": "./dist/jsx/index.js",
|
||||||
"./jsx-runtime": "./dist/jsx/index.js",
|
"./jsx-runtime": {
|
||||||
"./jsx-dev-runtime": "./dist/jsx/index.js"
|
"types": "./src/jsx/types.d.ts",
|
||||||
|
"default": "./dist/jsx/jsx-runtime.js"
|
||||||
|
},
|
||||||
|
"./jsx-dev-runtime": {
|
||||||
|
"types": "./src/jsx/types.d.ts",
|
||||||
|
"default": "./dist/jsx/jsx-dev-runtime.js"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
|||||||
@@ -2,3 +2,5 @@ export * from './locales';
|
|||||||
export * from './commands';
|
export * from './commands';
|
||||||
export * from './core';
|
export * from './core';
|
||||||
export * from './jsx';
|
export * from './jsx';
|
||||||
|
export * from './components';
|
||||||
|
export * from './pages';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createButton, type ButtonStyle } from '@components';
|
import { createButton, type ButtonStyle } from '@components';
|
||||||
import type { PartialEmoji } from '@projectdysnomia/dysnomia';
|
import type { PartialEmoji } from '@projectdysnomia/dysnomia';
|
||||||
|
|
||||||
export function Button(props: { label: string; customId: string; style?: ButtonStyle; emoji?: PartialEmoji; disabled?: boolean }) {
|
export function Button(props: { label: string; customId: string; style: ButtonStyle; emoji?: PartialEmoji; disabled?: boolean }) {
|
||||||
return createButton(props.label, props.customId, { style: props.style, emoji: props.emoji, disabled: props.disabled });
|
return createButton(props.label, props.customId, { style: props.style, emoji: props.emoji, disabled: props.disabled });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
export * from './runtime';
|
|
||||||
export * from './components';
|
export * from './components';
|
||||||
export * as JSX from './jsx';
|
export * from './jsx';
|
||||||
|
export * from './runtime';
|
||||||
|
|||||||
1
packages/discord/src/jsx/jsx-dev-runtime.ts
Normal file
1
packages/discord/src/jsx/jsx-dev-runtime.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { jsxDEV } from './runtime';
|
||||||
1
packages/discord/src/jsx/jsx-runtime.ts
Normal file
1
packages/discord/src/jsx/jsx-runtime.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { jsx } from './runtime';
|
||||||
@@ -54,16 +54,16 @@ export interface ElementAttributesProperty {
|
|||||||
|
|
||||||
export interface IntrinsicElements {
|
export interface IntrinsicElements {
|
||||||
// Allow any element, but prefer known elements
|
// Allow any element, but prefer known elements
|
||||||
[elemName: string]: any;
|
// [elemName: string]: any;
|
||||||
// Known elements
|
// Known elements (forcing re-parse)
|
||||||
ActionRow: { children: any | any[] };
|
actionRow: { children: any | any[] };
|
||||||
Button: {
|
button: {
|
||||||
label: string;
|
label: string;
|
||||||
customId: string;
|
customId: string;
|
||||||
style?: number;
|
style: number;
|
||||||
emoji?: PartialEmoji;
|
emoji?: PartialEmoji;
|
||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
};
|
};
|
||||||
Container: { color?: string; accent?: number; spoiler?: boolean; children: any | any[] };
|
container: { color?: string; accent?: number; spoiler?: boolean; children: any | any[] };
|
||||||
TextDisplay: { content: string };
|
textDisplay: { content: string };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,25 @@
|
|||||||
|
import { ActionRow } from './components/action-row';
|
||||||
|
import { Button } from './components/button';
|
||||||
|
import { Container } from './components/container';
|
||||||
|
import { TextDisplay } from './components/text-display';
|
||||||
|
|
||||||
|
const intrinsicComponentMap: Record<string, (props: any) => any> = {
|
||||||
|
actionRow: ActionRow,
|
||||||
|
button: Button,
|
||||||
|
container: Container,
|
||||||
|
textDisplay: TextDisplay,
|
||||||
|
};
|
||||||
|
|
||||||
export function jsx(type: any, props: Record<string, any>) {
|
export function jsx(type: any, props: Record<string, any>) {
|
||||||
console.log('JSX', type, props);
|
console.log('JSX', type, props);
|
||||||
if (typeof type === 'function') {
|
if (typeof type === 'function') {
|
||||||
return type(props);
|
return type(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof type === 'string' && intrinsicComponentMap[type]) {
|
||||||
|
return intrinsicComponentMap[type](props);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
type,
|
type,
|
||||||
props,
|
props,
|
||||||
@@ -21,6 +38,11 @@ export function jsxDEV(
|
|||||||
if (typeof type === 'function') {
|
if (typeof type === 'function') {
|
||||||
return type(props);
|
return type(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof type === 'string' && intrinsicComponentMap[type]) {
|
||||||
|
return intrinsicComponentMap[type](props);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
type,
|
type,
|
||||||
props: { ...props, key },
|
props: { ...props, key },
|
||||||
|
|||||||
@@ -1,40 +1,15 @@
|
|||||||
{
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
// Enable latest features
|
"composite": true,
|
||||||
"lib": ["ESNext"],
|
|
||||||
"target": "ESNext",
|
|
||||||
"module": "ESNext",
|
|
||||||
"moduleDetection": "force",
|
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"jsxImportSource": "@star-kitten/discord",
|
"jsxImportSource": "@star-kitten/discord",
|
||||||
"allowJs": true,
|
|
||||||
|
|
||||||
// Bundler mode
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"noEmit": true,
|
|
||||||
|
|
||||||
// Best practices
|
|
||||||
"strict": false,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
|
|
||||||
// Some stricter flags (disabled by default)
|
|
||||||
"noUnusedLocals": false,
|
|
||||||
"noUnusedParameters": false,
|
|
||||||
"noPropertyAccessFromIndexSignature": false,
|
|
||||||
|
|
||||||
// Paths
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@*": ["./src/*"],
|
"@*": ["./src/*"],
|
||||||
"@types": ["./types/*"]
|
"@types": ["./types/*"]
|
||||||
},
|
},
|
||||||
|
"typeRoots": ["src/types", "./node_modules/@types"],
|
||||||
"experimentalDecorators": true,
|
"types": []
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
|
|
||||||
"typeRoots": ["src/types", "./node_modules/@types"]
|
|
||||||
},
|
},
|
||||||
"include": ["src", "types", "src/jsx/types.d.ts"],
|
"include": ["src", "types", "src/jsx/types.d.ts"],
|
||||||
"exclude": ["node_modules", "dist", "build", "**/*.test.ts"]
|
"exclude": ["node_modules", "dist", "build", "**/*.test.ts"]
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ export default defineConfig([
|
|||||||
'./src/pages/index.ts',
|
'./src/pages/index.ts',
|
||||||
'./src/common/index.ts',
|
'./src/common/index.ts',
|
||||||
'./src/jsx/index.ts',
|
'./src/jsx/index.ts',
|
||||||
|
'./src/jsx/jsx-runtime.ts',
|
||||||
|
'./src/jsx/jsx-dev-runtime.ts',
|
||||||
],
|
],
|
||||||
platform: 'node',
|
platform: 'node',
|
||||||
dts: true,
|
dts: true,
|
||||||
|
|||||||
@@ -16,7 +16,8 @@
|
|||||||
"@projectdysnomia/dysnomia": "github:projectdysnomia/dysnomia#dev",
|
"@projectdysnomia/dysnomia": "github:projectdysnomia/dysnomia#dev",
|
||||||
"@star-kitten/discord": "workspace:^0.0.0",
|
"@star-kitten/discord": "workspace:^0.0.0",
|
||||||
"@star-kitten/eve": "workspace:^0.0.0",
|
"@star-kitten/eve": "workspace:^0.0.0",
|
||||||
"@star-kitten/util": "workspace:^0.0.0"
|
"@star-kitten/util": "workspace:^0.0.0",
|
||||||
|
"mkdirp": "^3.0.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "bunx dotenvx run -f .env.development -- bun run --watch src/main.ts",
|
"dev": "bunx dotenvx run -f .env.development -- bun run --watch src/main.ts",
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
import type { ExecutableInteraction } from '@star-kitten/discord';
|
|
||||||
import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
|
|
||||||
import type { PageContext } from '@star-kitten/discord/pages';
|
|
||||||
import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
|
|
||||||
import { formatNumberToShortForm } from '@star-kitten/util/text.js';
|
|
||||||
import type { AppraisalState } from './appraise.command';
|
|
||||||
|
|
||||||
export function renderAppraisal(
|
|
||||||
appraisal: Appraisal,
|
|
||||||
pageCtx: PageContext<AppraisalState>,
|
|
||||||
interaction: ExecutableInteraction,
|
|
||||||
) {
|
|
||||||
const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
|
|
||||||
maximumFractionDigits: 2,
|
|
||||||
minimumFractionDigits: 2,
|
|
||||||
});
|
|
||||||
|
|
||||||
const container = createContainer(
|
|
||||||
{
|
|
||||||
accent_color: 0x1da57a,
|
|
||||||
},
|
|
||||||
createTextDisplay(`
|
|
||||||
# [Appraisal ${appraisal.id} @ ${appraisal.market.name}](https://janice.e-351.com/a/${appraisal.id})
|
|
||||||
### Buy: \`${formatter.format(appraisal.effectivePrices.totalBuyPrice)}\` ISK
|
|
||||||
### Split: \`${formatter.format(appraisal.effectivePrices.totalSplitPrice)}\` ISK
|
|
||||||
### Sell: \`${formatter.format(appraisal.effectivePrices.totalSellPrice)}\` ISK
|
|
||||||
-# Volume: ${formatter.format(appraisal.totalPackagedVolume)} m³
|
|
||||||
\`\`\`
|
|
||||||
Buy: Sell: Qty: Item:
|
|
||||||
${appraisal.items.map((i) => `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
|
|
||||||
\`\`\`
|
|
||||||
-# https://janice.e-351.com/a/${appraisal.id}\n\n
|
|
||||||
`),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (pageCtx.state.currentPage !== 'share') {
|
|
||||||
container.components.push(
|
|
||||||
createActionRow(
|
|
||||||
createButton('Share in Channel', 'share', {
|
|
||||||
disabled: !interaction.channel?.id,
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
type: 1,
|
|
||||||
components: [container],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
79
packages/eve-bot/src/commands/appraise/renderAppraisal.tsx
Normal file
79
packages/eve-bot/src/commands/appraise/renderAppraisal.tsx
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import type { ExecutableInteraction } from '@star-kitten/discord';
|
||||||
|
import * as StarKitten from '@star-kitten/discord';
|
||||||
|
import { createActionRow, createButton, createContainer, createTextDisplay } from '@star-kitten/discord/components';
|
||||||
|
import type { PageContext } from '@star-kitten/discord/pages';
|
||||||
|
import { type Appraisal } from '@star-kitten/eve/third-party/janice.js';
|
||||||
|
import { formatNumberToShortForm } from '@star-kitten/util/text.js';
|
||||||
|
import type { AppraisalState } from './appraise.command';
|
||||||
|
|
||||||
|
export function renderAppraisal(
|
||||||
|
appraisal: Appraisal,
|
||||||
|
pageCtx: PageContext<AppraisalState>,
|
||||||
|
interaction: ExecutableInteraction,
|
||||||
|
): StarKitten.Component {
|
||||||
|
const formatter = new Intl.NumberFormat(interaction.locale || 'en-US', {
|
||||||
|
maximumFractionDigits: 2,
|
||||||
|
minimumFractionDigits: 2,
|
||||||
|
});
|
||||||
|
|
||||||
|
// const container = createContainer(
|
||||||
|
// {
|
||||||
|
// accent_color: 0x1da57a,
|
||||||
|
// },
|
||||||
|
// createTextDisplay(`
|
||||||
|
// # [Appraisal ${appraisal.id} @ ${appraisal.market.name}](https://janice.e-351.com/a/${appraisal.id})
|
||||||
|
// ### Buy: \`${formatter.format(appraisal.effectivePrices.totalBuyPrice)}\` ISK
|
||||||
|
// ### Split: \`${formatter.format(appraisal.effectivePrices.totalSplitPrice)}\` ISK
|
||||||
|
// ### Sell: \`${formatter.format(appraisal.effectivePrices.totalSellPrice)}\` ISK
|
||||||
|
// -# Volume: ${formatter.format(appraisal.totalPackagedVolume)} m³
|
||||||
|
// \`\`\`
|
||||||
|
// Buy: Sell: Qty: Item:
|
||||||
|
// ${appraisal.items.map((i) => `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
|
||||||
|
// \`\`\`
|
||||||
|
// -# https://janice.e-351.com/a/${appraisal.id}\n\n
|
||||||
|
// `),
|
||||||
|
// );
|
||||||
|
|
||||||
|
// if (pageCtx.state.currentPage !== 'share') {
|
||||||
|
// container.components.push(
|
||||||
|
// createActionRow(
|
||||||
|
// createButton('Share in Channel', 'share', {
|
||||||
|
// disabled: !interaction.channel?.id,
|
||||||
|
// }),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return {
|
||||||
|
// type: 1,
|
||||||
|
// components: [container],
|
||||||
|
// };
|
||||||
|
return (
|
||||||
|
<container accent={0x1da57a}>
|
||||||
|
<textDisplay
|
||||||
|
content={`
|
||||||
|
# [Appraisal ${appraisal.id} @ ${appraisal.market.name}](https://janice.e-351.com/a/${appraisal.id})
|
||||||
|
### Buy: \`${formatter.format(appraisal.effectivePrices.totalBuyPrice)}\` ISK
|
||||||
|
### Split: \`${formatter.format(appraisal.effectivePrices.totalSplitPrice)}\` ISK
|
||||||
|
### Sell: \`${formatter.format(appraisal.effectivePrices.totalSellPrice)}\` ISK
|
||||||
|
-# Volume: ${formatter.format(appraisal.totalPackagedVolume)} m³
|
||||||
|
\`\`\`
|
||||||
|
Buy: Sell: Qty: Item:
|
||||||
|
${appraisal.items.map((i) => `${formatNumberToShortForm(i.effectivePrices.buyPrice).padEnd(10)}${formatNumberToShortForm(i.effectivePrices.sellPrice).padEnd(10)}${formatNumberToShortForm(i.amount).padEnd(10)}${i.itemType.name}`).join('\n')}
|
||||||
|
\`\`\`
|
||||||
|
-# https://janice.e-351.com/a/${appraisal.id}\n\n
|
||||||
|
`}
|
||||||
|
/>
|
||||||
|
{pageCtx.state.currentPage !== 'share' ? (
|
||||||
|
<actionRow>
|
||||||
|
<button
|
||||||
|
customId="share"
|
||||||
|
label="Share in Channel"
|
||||||
|
disabled={!interaction.channel?.id}
|
||||||
|
style={StarKitten.ButtonStyle.PRIMARY}
|
||||||
|
/>
|
||||||
|
</actionRow>
|
||||||
|
) : undefined}
|
||||||
|
</container>
|
||||||
|
);
|
||||||
|
}
|
||||||
26
packages/eve-bot/src/test.tsx
Normal file
26
packages/eve-bot/src/test.tsx
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
export function renderAppraisal() {
|
||||||
|
const formatter = new Intl.NumberFormat('en-US', {
|
||||||
|
maximumFractionDigits: 2,
|
||||||
|
minimumFractionDigits: 2,
|
||||||
|
});
|
||||||
|
const world = 'world';
|
||||||
|
const rand = Math.random() * 1000;
|
||||||
|
const pageCtx = { state: { currentPage: 'home' } };
|
||||||
|
|
||||||
|
let jsx = (
|
||||||
|
<actionRow>
|
||||||
|
<container accent={0x1da57a}>
|
||||||
|
<textDisplay content={`Hello ${world}`} />
|
||||||
|
{pageCtx.state.currentPage !== 'share' ? (
|
||||||
|
<actionRow>
|
||||||
|
<button customId="share" label="Share in Channel" disabled={rand < 500} />
|
||||||
|
</actionRow>
|
||||||
|
) : undefined}
|
||||||
|
</container>
|
||||||
|
</actionRow>
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(jsx);
|
||||||
|
}
|
||||||
|
|
||||||
|
renderAppraisal();
|
||||||
@@ -1,38 +1,12 @@
|
|||||||
{
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
// Enable latest features
|
"composite": true,
|
||||||
"lib": ["ESNext"],
|
|
||||||
"target": "ESNext",
|
|
||||||
"module": "ESNext",
|
|
||||||
"moduleDetection": "force",
|
|
||||||
"jsx": "react-jsx",
|
"jsx": "react-jsx",
|
||||||
"jsxImportSource": "@star-kitten/discord",
|
"jsxImportSource": "@star-kitten/discord",
|
||||||
"allowJs": true,
|
|
||||||
|
|
||||||
// Bundler mode
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"noEmit": true,
|
|
||||||
|
|
||||||
// Best practices
|
|
||||||
"strict": false,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
|
|
||||||
// Some stricter flags (disabled by default)
|
|
||||||
"noUnusedLocals": false,
|
|
||||||
"noUnusedParameters": false,
|
|
||||||
"noPropertyAccessFromIndexSignature": false,
|
|
||||||
|
|
||||||
// Paths
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@*": ["./src/*"]
|
"@*": ["./src/*"]
|
||||||
},
|
},
|
||||||
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
|
|
||||||
"typeRoots": ["src/types", "./node_modules/@types"]
|
"typeRoots": ["src/types", "./node_modules/@types"]
|
||||||
},
|
},
|
||||||
"include": ["src", "types"],
|
"include": ["src", "types"],
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
|
|
||||||
#/ public-key encryption for .env files /
|
|
||||||
#/ [how it works](https://dotenvx.com/encryption) /
|
|
||||||
#/----------------------------------------------------------/
|
|
||||||
DOTENV_PUBLIC_KEY_DEVELOPMENT="02572da3d4f3a844588a944214c0e142a5a01deaa6551456af146d34b574024416"
|
|
||||||
|
|
||||||
# .env.development
|
|
||||||
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
|
|
||||||
#/ public-key encryption for .env files /
|
|
||||||
#/ [how it works](https://dotenvx.com/encryption) /
|
|
||||||
#/----------------------------------------------------------/
|
|
||||||
DOTENV_PUBLIC_KEY="02292a330aa041b5f7efc51504e0c208accba67a6877a217ab43cbb59c3c0c3e66"
|
|
||||||
|
|
||||||
# .env
|
|
||||||
DEBUG="encrypted:BC7p62nrs3NV7XdxnBbO1WsHGm8IgDEbOS1RmgORHSqh05vGIv+hmqwau61FamrU/puT4btAsG+iLcSeypCQV5e7bBpr0qu0HQoVyMzunBvrN5ivzNY0Af800lNynsBXzq0cXTY="
|
|
||||||
PORT="encrypted:BJpY7J2J+0z4LUNnKRr7HzcpETcdnWFuRAOC3hVl2cZyiCBl706vJqv+iY3BgA0mus73t9fwYjGRrPSXSQbcSEBzr+Jquj8Gkvy7loXKkKp4Gz1tqX554txfY0XjrgMO3oHATO8="
|
|
||||||
NODE_ENV="encrypted:BJun6Kdf/kBSrIYUgw7pfnMwlrTjvUUq/w2yjqn+X5UgaxUxzLsI0JabYlxQCxoDMSEagQYWI5HkRaZvYuXHzyN2aXm6drC2bahg9aWZTVyWYu00FFwIah7l/tuMA/caeO7s5dwkuOgCvlOQ"
|
|
||||||
LOG_LEVEL="encrypted:BKBvZDS7xkzgg5IqiTc9izmt4om4CjX7t4LA8gMY+0ru0NtVBpkSkchil4PvaRNhktcNjtIzfE6sduRoFw5T1tt88PjtKWIhORyACZk2ZtR3vuO/xecq2q1rIIp5kD1gcp4ujltK"
|
|
||||||
BASE_URL="encrypted:BMueek9QzKR3k+Foe0xUruZUxwwIXBcrL7B6ksdBNFaF92nHHy2HLLOhOpKNebGfSwb9mBR5kOXb095+hsDEcqAiv5nc5BjWGfk/wkFpRfFcmyEGYlmrxLclbFdQFXIqYrzmN7ae/VV1VlRzNLBipO0smJj4LZY649oV2A=="
|
|
||||||
EVE_CLIENT_ID="encrypted:BPOAohc2MmP7VvvLybwvcl7XgzYRqWC6IzBkOf+T73kN8YlHYKt611uYNjU27G6hkVRK3DSfgCuxTPzrQBPxvAY6pDbqFG8pVU9cKDmoeHYtiKh7KkHuBN/cEzll6x8hpIwwrY32nzQjxYMvyVO5UgG7OHK1T/jkeya2TW2DSgGn"
|
|
||||||
EVE_CLIENT_SECRET="encrypted:BE0VYniO3JEFNt1R4iUrGA7W7cSp7gQtG7Y86VQeWnte+idjnqSFmv2lmz83rc7Idvi/VU+ipuY6RL2+49jAb/oUaXGUiwguBAnlFU+ypOVy2Ed29o7yggqiB2+dUuu4xDAsLAfSXErnw4gsDsEPAMqaKhCYz0LHEvJX5ZdwfAcfrpWoLeI/Vm0="
|
|
||||||
EVE_CALLBACK_URL="encrypted:BIjACAnGtL06X0vkvmydydup9HZDcPA+DAYUAhlH3lsq8GJPD5XxlRwVx02VzZQuATfqm1JwGDyYbw8ceaWD2RLlcjSXPF7MWDpYzG1FExE7FZbFRBBO8XqGH9X8kfxYsuca/Td8KuIPjyS5BNkyM4GQcTlojKa15Hk4GXmpNP6Gyb45XNPCegRJL5aARQ=="
|
|
||||||
ESI_USER_AGENT="encrypted:BEUaqMbwPNvJeF/d5q5LJ5Owd5wcQ8Jg/BTGn6qns4cwlX/e6QqLLmfp8E8SxQ8Z6h+qDLpZj0HROJIOK9Y2Xb6qjB+hCnjceRMTx1QWpNS6jXQ85TQiZfYzee57QFleau621B77KIuM5DjPUZZ02efAL+2Yk83amrh3vnzvwrnvM5mMGTzc2TbeQwB6MEdjAdvAz65VGX9DnCwbtP3bMKE7og4+sKMUrTYZpCsILug="
|
|
||||||
DISCORD_APP_ID="encrypted:BM3yHCf9kTxcIQzzmNseT0/xol6ZLYTjZ3m3NKybW1oD2joZ/gTUIg2+mgfaeCqY1CPaSGppxguDPFgthMbWihAdeGuxiITiwLDulCTLcgjBsyT6IlsKUSsE5ZiEZl1A+ikNG1/8rxrF0MsIjVqfw+U+ev8="
|
|
||||||
DISCORD_APP_SECRET="encrypted:BNVLmKb2ZJq1+iIYKwGaCtcM+hak5NPXLNgJnPzTlpd/5zUTKc8OtYZLhg2oqtOYv8rxf8sbjpXNWB6lZL5J5NUuPcQSfVOMr3U1BN6b9WsfWZ/2Pr4cm8kqqqjJVTF49/DasRQU5VlIXodvCI2XfWrcPFV20NvE8HzsJQz/g5cF"
|
|
||||||
DISCORD_PUBLIC_KEY="encrypted:BEmxCcAqODfgukOza3EGzsXdrnXv3qVbzlLFYsD4Iba9mQFCaOwChIQNkN/+Ve5NV5sZeefU5sEXZRYbb/hRjJjMRX4NrhEZn2Pg3mI5/FG/+uCD0cWWs4JGzTRwUcBcG8FZ2Mw/kP1ymUqMRkJCYC+XdyYqcP8zNrQ6/aca3HLcqPma7j2/1lsbX4UJ3QcKDg3bsY+107MLLJJ4+TYiwcE="
|
|
||||||
DISCORD_BOT_TOKEN="encrypted:BCLvoICUVOYz7pkV3f+dufxEZiWcKxQ7E56cCUXtLQjjorW5WsCftgoCdP5NXKSbhHYZBqrTCAHqPp/kLgaVjDXxXu2+61DiCNjB3t/kNIudkfsuzJ0vusKcVzgnQOmTmYnOZ+SYo7hKPrjLi2/Vk8r6K26TATp9t+iuSBMsEs7t9nnnySSYIXyHfXRXbRBg4NUFOmeDRUqBhhix9mgr+MI5SPmQgsXCvA=="
|
|
||||||
DISCORD_TEST_GUILD_ID="encrypted:BKRJRRvQw2aoBrVoVZpPPYSzCy+2VXLLzBb1zNzUR5510qobPNDbUoIlJdm41moQS0ALG94l8miVLtkOKW6MGZyepq+gE1zSEu7eIJWHB8/eSUnGuNeqSghI4Kxr8kn04Bl4eDb1UgP1Fu+8XSXjVel85Q=="
|
|
||||||
JANICE_KEY="encrypted:BPq+CJycBbmmoDHNmHHYiQ00PeISDQTqp2IdlLZD52V2wWPOmXnRnqgvoXff64ebUayySaW1sQtvoaMJE3Gt9E/FUquYiRTPUMT5+oW7Xo60IRgAhRW9n2m/YUDIORxR0J0qxKc9cdE75VWJNqLELKKwsriBdpqj0+4yM/Mn6IaU"
|
|
||||||
PERPLEXITY_API_KEY="encrypted:BHxscbb6WwhFgt5Cp/WzrYGJ6nJvIFeoS3JrTaibPbQ7kiu3C/Zx8klgRhlBF25+HAA8chZHT5MeE99FSD59RqIQTcnKAyfUnxNq+ovoXMV7Nk2Fb/rrdLnvUf8VoeH7L4ZyOVF1wv0r4xm/7Qqc1JN50fME6Qa47KnnQekq/n6o2e5HVI153yJnlCQu/SvcyXCY6VW2"
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
|
|
||||||
#/ public-key encryption for .env files /
|
|
||||||
#/ [how it works](https://dotenvx.com/encryption) /
|
|
||||||
#/----------------------------------------------------------/
|
|
||||||
DOTENV_PUBLIC_KEY_PRODUCTION="02f0469506f6722d8fcc179c199ff159ca32f082000c8e7a1465891adb50a4c031"
|
|
||||||
|
|
||||||
# .env.production
|
|
||||||
DEBUG="encrypted:BKnKyDjoQANl7bGi3568JTnA/7sUBdUVlc8nNznTwxs5Lu/4iMDu1cY0x0iE7b0z+RXEuA/w6bERB5uTmWkCdglEI5S6LhnXZzcV55iLBY8rHO/MIDBF39vn/PBsMiA86gBmtaIn"
|
|
||||||
PORT="encrypted:BKaGvooBBBWB13491yjfYwYT2zG1MZiYi3+Y6wW8ZhuvMOEsfPuW94rv3cE2LoguALsBFXH9rn3lQJysZLJcYd9AxJoLqxmWHkEpbQ35PYDSvkJ0GsEGlrd74hVbnh57A7Dmqqc="
|
|
||||||
NODE_ENV="encrypted:BIiY7XZ9vy9stbiNC2u+o4ibruGTtMuRXUJPs3lMxkHKlK6gksg0ddTPbia/qZkZudGjnEhmqYDUPfSWQDdmf8gFsuBgSgYGhR2GCNw7mCCmsDO/wE3ojNnlvuetnVfLeJa7ugvOGjX5QTs="
|
|
||||||
LOG_LEVEL="encrypted:BEAJviH6nTAR4AdFEoiud4ZHV+dwvURoZys4M9KsYAn5MD+nlNEnzS+9vtE3NPwqzfkpK0Z/46xB+SUIXwhwaJ9Yzgz2WqLK1UXEB6fhQqHXdIqvW2ug/+hUxW9k0ueMu5I9btE="
|
|
||||||
BASE_URL="encrypted:BJ6YYd2cX31HuTvGnNxLK33KQgzWxU9yRtlwAc79hhbuioHP5lMu7LxCu8NnXfcaEvevWsEt3cG4I7PNqzlBmU1WhTwsdJ4Kqi2cvs6hKwMeVWvtgdI+ymojG/GoglkbHjSc9737dsth2+erI4qbjkafqYuOC9S9"
|
|
||||||
DISCORD_APP_ID="encrypted:BMqY+6wep/q7bWO9Yc/tJukPHH5H6vvItZpOFK5zaLP92Fx4S+qyZvH/LZKfUBSxZ1d1vbAqo4V+HPxNPyvwXaZyu/qlRf5ZTP/hkt1k9RoNb5UNOMSoD6GSZFS24/JEKuDPzQnvEOb0+prPHEJknvTMXmI="
|
|
||||||
DISCORD_APP_SECRET="encrypted:BBBWkXA3zi8rCWEiMH66v1hFb6Jqw0Bn4H/6b5qWbVakm5UDckOmgQSjXosJLA1VX0vY+38s5fT1ICPIBv2b0rzpaQ09GpRIwryyTT+VLvMcZfrt1CP4ISC0uzlE2p9qceK9EG+6I7ge4pRkzpxotwnWAg9SCqVcNb04kRwPhUvj"
|
|
||||||
DISCORD_PUBLIC_KEY="encrypted:BPqsvWPJ7/IBYynqFMHmEcpMBS+T5CXyfnzZU3flouPwcCaKkIc3xkLhtVco7nWdv2v/hw9ulysmVJhT6CiW9r1k0XRqRnv4q1PDDSTLrP0c1cXPg6pFLcOEv7e2CU+Gkj7UEFZz3xgrb6aWkkLRO0yATcA20xbdnOv3rbigOrJCfJwbbAWPQk7yun8oF6O/mGvWW9Blv8if54fp8vBOeUs="
|
|
||||||
DISCORD_BOT_TOKEN="encrypted:BMfVvYAKvIsMW+dS1X5SZcXfUIxrsunb3q4iXM2ifTlSP8ZlFpA2jxvgYj16jKcexiyVUBhWMSyUC4eS2AuIY/6fKCuA/5JtvqMltzcxPYAi3VEYIz3AgURiMRNy2QsNnqEXxNiakNaPq5Tv4dqVB4z7YeQ16QdvpDWxD4XUQFtG8Q5jZQK/ISj4xJT9cmaxLUJB9XQcbAa8Oseghpk/A1i5JXO05Rx4vQ=="
|
|
||||||
EVE_CLIENT_ID="encrypted:BCBtASu/2DN+EvLPM//WQjBdfwRscwSC5zKBHLTTTcXMfVur8GtDB6ZcBWstmC4YdiimjPobi1RJ+qdYndu1SM300g6UwOmmO2sNhOpG5nyP0mT2HNgwcJzl+Z7Ad1Vr/iByzYyqkc+uYr9NwhvJDPud+HP11dTjKvw+9Ht9/abA"
|
|
||||||
EVE_CLIENT_SECRET="encrypted:BMccZ43R9rT33amzo0zfIgLM8hKDCMXLrj+5h0TNLH1RhwrsUxcKgl17MAVqV+8uPBbB171kRRnjKLaQDjjJM27Jv1SV5bn316qrIx35Tkl2Ocd5wjEs7TSAjf8HwzUhiH9F68+IrQ36Vm8w27+RmsaRtvTtiWWVmYvBXw4PFMprTE7SG0bFq3M="
|
|
||||||
EVE_CALLBACK_URL="encrypted:BDsEZqRGXFzRigkBq50UYj14UvNjRM4Ao3PLSxVTeyc+2Fad1DQa9mfFE9yBnp3l1H5KMQcPJdWf/MxyAa9J0RvXm9l01lbmkgXu+C+HJXWHKJ7/b91NrQqngm2l76jp80WjtmdJ2D5WOUGrIxZatQaqgh8TexQAjVwjkTeQO97PJnbF0FyNQOlu"
|
|
||||||
ESI_USER_AGENT="encrypted:BJ9Pib5a8/qxfROzBfjlAKr/fEvgepN8o6NCI0l3aiYvFuk5hczaA57TKPMP6P2Ct/Juj47YuU8bqF147y8C556NMiY2HDPbrnenXKdAh4xCerjXhkFqowPvEMVxoeuiyhRM7mPmUSAw7AbYi7AxDtCTw80/6S2/b9/32XBk4eCnSdJmM9kFxwHVFQNK83V0Sr5XEymT4S1kntvqlFsBel/5KxMMfNieqTiT+b5mVyM="
|
|
||||||
AUTH_DB_PATH="encrypted:BAqssA/4tJHhxv+pQuSXln5reiqtIdaJzIakctW9fs3omlsZr8j7pXHvZEPQAyYnH2u396tXQxZLXSfdj68q5odUEXUDt6kxN70h3ikL/4gbkfpPkW24wd4NlVPA21GZR+rBpvfpZN1u57Lvp8Lm/QvUfTlka4H5"
|
|
||||||
JANICE_KEY="encrypted:BFEsjnnZNfYFIXvGXKVtko5c8zh5sZze7hjFORfAb4QsHqHh/SqXVKClMCyEa8OMCjNtd8Zmz8LOckaOUYAh09Xi57KM6Eh33CirHipys0rdeURcwSkI9RSXPZOvmOfKZ9yDmhd3iov3AF6b+wwDQ9/rhYZrqh/NWETeHV98Xgv1"
|
|
||||||
PERPLEXITY_API_KEY="encrypted:BIRn8UX4BgL/4QOCaz2cNZVfiJY3zR/Qclr2UI8FnDsUR8mu+hWi8SVWeaauzLSRwiWU1Ihc3/sWUxi8Jz/Ma1dGcDdPwPO7kiZuN2a1Tl3NKiSMmDlNYszLekhpESoUzVOa/605lcKsTemqC8SvVfq7rOPuC2QP7/7bIGSPGDShIfBjU7dUpvfpDX0/Vf++kLHkNiV1"
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
trailingComma: all
|
|
||||||
tabWidth: 2
|
|
||||||
useTabs: false
|
|
||||||
semi: true
|
|
||||||
singleQuote: true
|
|
||||||
printWidth: 140
|
|
||||||
experimentalTernaries: true
|
|
||||||
quoteProps: consistent
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# Star Kitten Web
|
|
||||||
|
|
||||||
Project created with [Brisa](https://github.com/brisa-build/brisa).
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Link the Library
|
|
||||||
|
|
||||||
`star-kitten-lib` has not been published, so link to it locally before running this web project.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd star-kitten-lib
|
|
||||||
bun link
|
|
||||||
cd ../web
|
|
||||||
bun link star-kitten-lib
|
|
||||||
```
|
|
||||||
|
|
||||||
### Download static eve reference data & Hoboleaks archive from [EVE Ref](https://everef.net/).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd star-kitten-lib
|
|
||||||
bun get-data
|
|
||||||
```
|
|
||||||
|
|
||||||
### Initialize the sqlite database
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd star-kitten-lib
|
|
||||||
bun generate-migrations
|
|
||||||
bun migrate
|
|
||||||
```
|
|
||||||
Drizzle's migrations seems to fail on the first try sometimes, so just grab the .sql from the generation and run those against the kitten.db file to create the tables & indexes.
|
|
||||||
|
|
||||||
## Environment Variables
|
|
||||||
|
|
||||||
Create a .env file in the root directory with the following values:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
#General
|
|
||||||
BASE_URL=http://localhost:3000
|
|
||||||
DEBUG=true
|
|
||||||
PORT=3000
|
|
||||||
NODE_ENV=development
|
|
||||||
LOG_LEVEL=debug
|
|
||||||
|
|
||||||
|
|
||||||
# EVE - https://developers.eveonline.com/applications
|
|
||||||
EVE_CLIENT_ID=YOUR_EVE_CLIENT_ID
|
|
||||||
EVE_CLIENT_SECRET=YOUR_EVE_SECRET
|
|
||||||
EVE_CALLBACK_URL=http://localhost:3000/auth/callback
|
|
||||||
ESI_USER_AGENT=ADD_YOUR_USER_AGENT_INFO_HERE
|
|
||||||
|
|
||||||
# For using Janice's Appraisal API
|
|
||||||
JANICE_KEY=XXX
|
|
||||||
|
|
||||||
# For using Perplexities AI API
|
|
||||||
PERPLEXITY_API_KEY=XXX
|
|
||||||
```
|
|
||||||
|
|
||||||
### Development
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Start
|
|
||||||
|
|
||||||
```bash
|
|
||||||
bun start
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import type { Configuration } from "brisa";
|
|
||||||
import tailwindcss from 'brisa-tailwindcss';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
integrations: [tailwindcss()],
|
|
||||||
} as Configuration;
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
export interface IntrinsicCustomElements {
|
|
||||||
'counter-client': JSX.WebComponentAttributes<typeof import("D:\dev\@star-kitten\packages\eve-web\src\web-components\counter-client.tsx").default>;
|
|
||||||
}
|
|
||||||
export type PageRoute = "/" | "/about" | "/auth/error" | "/auth/success";
|
|
||||||
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
@@ -1,55 +0,0 @@
|
|||||||
// @bun
|
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: () => mod[key],
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
||||||
var __require = import.meta.require;
|
|
||||||
|
|
||||||
// src/utils/cookies.ts
|
|
||||||
function getCookies(headers) {
|
|
||||||
if (!headers)
|
|
||||||
return {};
|
|
||||||
const cookieHeader = headers.get("Cookie");
|
|
||||||
const cookies = {};
|
|
||||||
if (cookieHeader === null)
|
|
||||||
return {};
|
|
||||||
for (const kv of cookieHeader.split(";")) {
|
|
||||||
const [cookieKey, ...cookieVal] = kv.split("=");
|
|
||||||
const key = cookieKey.trim();
|
|
||||||
cookies[key] = cookieVal.join("=");
|
|
||||||
}
|
|
||||||
return cookies;
|
|
||||||
}
|
|
||||||
function setCookie(response, key, value, maxAge) {
|
|
||||||
response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
|
|
||||||
}
|
|
||||||
function removeCookie(response, key) {
|
|
||||||
response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
|
|
||||||
}
|
|
||||||
// src/api/auth/discordID/[discordID]/characterID/[characterID]/scopes/[scopes].ts
|
|
||||||
async function GET({ store, route: { params } }) {
|
|
||||||
const eveauth = store.get("eveauth");
|
|
||||||
const response = await eveauth.redirect(params["scopes"]);
|
|
||||||
setCookie(response, "discordID", params["discordID"], 60 * 10);
|
|
||||||
setCookie(response, "characterID", params["characterID"], 60 * 10);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
export {
|
|
||||||
GET
|
|
||||||
};
|
|
||||||
|
|
||||||
//# debugId=AEE66F1C816CC1AD64756E2164756E21
|
|
||||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcdXRpbHNcXGNvb2tpZXMudHMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxjaGFyYWN0ZXJJRFxcW2NoYXJhY3RlcklEXVxcc2NvcGVzXFxbc2NvcGVzXS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29raWVzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKSByZXR1cm4ge307XG4gIGNvbnN0IGNvb2tpZUhlYWRlciA9IGhlYWRlcnMuZ2V0KFwiQ29va2llXCIpO1xuICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYgKGNvb2tpZUhlYWRlciA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIGZvciAoY29uc3Qga3Ygb2YgY29va2llSGVhZGVyLnNwbGl0KFwiO1wiKSkge1xuICAgIGNvbnN0IFtjb29raWVLZXksIC4uLmNvb2tpZVZhbF0gPSBrdi5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gY29va2llS2V5LnRyaW0oKTtcbiAgICBjb29raWVzW2tleV0gPSBjb29raWVWYWwuam9pbihcIj1cIik7XG4gIH1cblxuICByZXR1cm4gY29va2llcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtYXhBZ2U/OiBudW1iZXIpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PSR7dmFsdWV9JHttYXhBZ2UgPyAnOyBQYXRoPS87IE1heC1BZ2U9JyArIG1heEFnZSA6ICcnfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PVwiXCI7IFBhdGg9LzsgTWF4LUFnZT0tMTtgKTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgRVZFQXV0aCB9IGZyb20gJ0AvbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSUQvY2hhcmFjdGVySUQvOmNoYXJhY3RlcklEL3Njb3Blcy86c2NvcGVzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gR0VUKHsgc3RvcmUsIHJvdXRlOiB7IHBhcmFtcyB9IH06IFJlcXVlc3RDb250ZXh0KSB7XG4gIC8vIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIHNjb3BlcyB0aGF0IHdlcmUgc2VudCwgc28ganVzdCBwYXNzIHRoZW0gYWxvbmcgdG8gYXV0aCBkaXJlY3RseSBcbiAgLy8gd2l0aCB0aGUgcHJvdmlkZWQgc2NvcGVzXG4gIGNvbnN0IGV2ZWF1dGg6IEVWRUF1dGggPSBzdG9yZS5nZXQoJ2V2ZWF1dGgnKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBldmVhdXRoLnJlZGlyZWN0KHBhcmFtcyFbJ3Njb3BlcyddIGFzIHN0cmluZyk7XG4gIHNldENvb2tpZShyZXNwb25zZSwgJ2Rpc2NvcmRJRCcsIHBhcmFtcyFbJ2Rpc2NvcmRJRCddIGFzIHN0cmluZywgNjAgKiAxMCAvKiAxMCBtaW4gKi8pO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdjaGFyYWN0ZXJJRCcsIHBhcmFtcyFbJ2NoYXJhY3RlcklEJ10gYXMgc3RyaW5nLCA2MCAqIDEwIC8qIDEwIG1pbiAqLyk7XG4gIHJldHVybiByZXNwb25zZTtcbn0iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDTyxTQUFTLFVBQVUsQ0FBQyxTQUFrQjtBQUFBLEVBQzNDLEtBQUs7QUFBQSxJQUFTLE9BQU8sQ0FBQztBQUFBLEVBQ3RCLE1BQU0sZUFBZSxRQUFRLElBQUksUUFBUTtBQUFBLEVBQ3pDLE1BQU0sVUFBa0MsQ0FBQztBQUFBLEVBRXpDLElBQUksaUJBQWlCO0FBQUEsSUFBTSxPQUFPLENBQUM7QUFBQSxFQUVuQyxXQUFXLE1BQU0sYUFBYSxNQUFNLEdBQUcsR0FBRztBQUFBLElBQ3hDLE9BQU8sY0FBYyxhQUFhLEdBQUcsTUFBTSxHQUFHO0FBQUEsSUFDOUMsTUFBTSxNQUFNLFVBQVUsS0FBSztBQUFBLElBQzNCLFFBQVEsT0FBTyxVQUFVLEtBQUssR0FBRztBQUFBLEVBQ25DO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFHRixTQUFTLFNBQVMsQ0FBQyxVQUFvQixLQUFhLE9BQWUsUUFBaUI7QUFBQSxFQUN6RixTQUFTLFFBQVEsT0FBTyxjQUFjLEdBQUcsT0FBTyxRQUFRLFNBQVMsdUJBQXVCLFNBQVMsSUFBSTtBQUFBO0FBR2hHLFNBQVMsWUFBWSxDQUFDLFVBQW9CLEtBQWE7QUFBQSxFQUM1RCxTQUFTLFFBQVEsT0FBTyxjQUFjLEdBQUcsNkJBQTZCO0FBQUE7O0FDakJ4RSxlQUFzQixHQUFHLEdBQUcsT0FBTyxTQUFTLFlBQTRCO0FBQUEsRUFHdEUsTUFBTSxVQUFtQixNQUFNLElBQUksU0FBUztBQUFBLEVBQzVDLE1BQU0sV0FBVyxNQUFNLFFBQVEsU0FBUyxPQUFRLFNBQW1CO0FBQUEsRUFDbkUsVUFBVSxVQUFVLGFBQWEsT0FBUSxjQUF3QixLQUFLLEVBQWU7QUFBQSxFQUNyRixVQUFVLFVBQVUsZUFBZSxPQUFRLGdCQUEwQixLQUFLLEVBQWU7QUFBQSxFQUN6RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJBRUU2NkYxQzgxNkNDMUFENjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
// @bun
|
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: () => mod[key],
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
||||||
var __require = import.meta.require;
|
|
||||||
|
|
||||||
// src/utils/cookies.ts
|
|
||||||
function getCookies(headers) {
|
|
||||||
if (!headers)
|
|
||||||
return {};
|
|
||||||
const cookieHeader = headers.get("Cookie");
|
|
||||||
const cookies = {};
|
|
||||||
if (cookieHeader === null)
|
|
||||||
return {};
|
|
||||||
for (const kv of cookieHeader.split(";")) {
|
|
||||||
const [cookieKey, ...cookieVal] = kv.split("=");
|
|
||||||
const key = cookieKey.trim();
|
|
||||||
cookies[key] = cookieVal.join("=");
|
|
||||||
}
|
|
||||||
return cookies;
|
|
||||||
}
|
|
||||||
function setCookie(response, key, value, maxAge) {
|
|
||||||
response.headers.append("Set-Cookie", `${key}=${value}${maxAge ? "; Path=/; Max-Age=" + maxAge : ""}`);
|
|
||||||
}
|
|
||||||
function removeCookie(response, key) {
|
|
||||||
response.headers.append("Set-Cookie", `${key}=""; Path=/; Max-Age=-1;`);
|
|
||||||
}
|
|
||||||
// src/api/auth/discordID/[discordID]/index.ts
|
|
||||||
async function GET({ store, route: { params } }) {
|
|
||||||
const eveauth = store.get("eveauth");
|
|
||||||
const response = await eveauth.redirect("publicData");
|
|
||||||
setCookie(response, "discordID", params["discordID"], 60 * 10);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
export {
|
|
||||||
GET
|
|
||||||
};
|
|
||||||
|
|
||||||
//# debugId=7AF70B8658B4D3D064756E2164756E21
|
|
||||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcdXRpbHNcXGNvb2tpZXMudHMiLCAiLi5cXHNyY1xcYXBpXFxhdXRoXFxkaXNjb3JkSURcXFtkaXNjb3JkSURdXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29raWVzKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKSByZXR1cm4ge307XG4gIGNvbnN0IGNvb2tpZUhlYWRlciA9IGhlYWRlcnMuZ2V0KFwiQ29va2llXCIpO1xuICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYgKGNvb2tpZUhlYWRlciA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIGZvciAoY29uc3Qga3Ygb2YgY29va2llSGVhZGVyLnNwbGl0KFwiO1wiKSkge1xuICAgIGNvbnN0IFtjb29raWVLZXksIC4uLmNvb2tpZVZhbF0gPSBrdi5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gY29va2llS2V5LnRyaW0oKTtcbiAgICBjb29raWVzW2tleV0gPSBjb29raWVWYWwuam9pbihcIj1cIik7XG4gIH1cblxuICByZXR1cm4gY29va2llcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZShyZXNwb25zZTogUmVzcG9uc2UsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBtYXhBZ2U/OiBudW1iZXIpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PSR7dmFsdWV9JHttYXhBZ2UgPyAnOyBQYXRoPS87IE1heC1BZ2U9JyArIG1heEFnZSA6ICcnfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQ29va2llKHJlc3BvbnNlOiBSZXNwb25zZSwga2V5OiBzdHJpbmcpIHtcbiAgcmVzcG9uc2UuaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUnLCBgJHtrZXl9PVwiXCI7IFBhdGg9LzsgTWF4LUFnZT0tMTtgKTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgRVZFQXV0aCB9IGZyb20gJ0AvbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBzZXRDb29raWUgfSBmcm9tICdAL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICdicmlzYSc7XG5cbi8vIEdFVCAvYXBpL2F1dGgvZGlzY29yZElELzpkaXNjb3JkSURcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBHRVQoeyBzdG9yZSwgcm91dGU6IHsgcGFyYW1zIH19OiBSZXF1ZXN0Q29udGV4dCkge1xuICAvLyBjYWxsZWQgd2hlbiBhZGRpbmcgYSBuZXcgY2hhcmFjdGVyLCBzbyBqdXN0IHJlZGlyZWN0IHRvIGF1dGggYW5kIHNldCBjb29raWVzXG4gIGNvbnN0IGV2ZWF1dGg6IEVWRUF1dGggPSAgc3RvcmUuZ2V0KCdldmVhdXRoJyk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZXZlYXV0aC5yZWRpcmVjdCgncHVibGljRGF0YScpO1xuICBzZXRDb29raWUocmVzcG9uc2UsICdkaXNjb3JkSUQnLCBwYXJhbXMhWydkaXNjb3JkSUQnXSBhcyBzdHJpbmcsIDYwICogMTAgLyogMTAgbWluICovKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufSIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNPLFNBQVMsVUFBVSxDQUFDLFNBQWtCO0FBQUEsRUFDM0MsS0FBSztBQUFBLElBQVMsT0FBTyxDQUFDO0FBQUEsRUFDdEIsTUFBTSxlQUFlLFFBQVEsSUFBSSxRQUFRO0FBQUEsRUFDekMsTUFBTSxVQUFrQyxDQUFDO0FBQUEsRUFFekMsSUFBSSxpQkFBaUI7QUFBQSxJQUFNLE9BQU8sQ0FBQztBQUFBLEVBRW5DLFdBQVcsTUFBTSxhQUFhLE1BQU0sR0FBRyxHQUFHO0FBQUEsSUFDeEMsT0FBTyxjQUFjLGFBQWEsR0FBRyxNQUFNLEdBQUc7QUFBQSxJQUM5QyxNQUFNLE1BQU0sVUFBVSxLQUFLO0FBQUEsSUFDM0IsUUFBUSxPQUFPLFVBQVUsS0FBSyxHQUFHO0FBQUEsRUFDbkM7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUdGLFNBQVMsU0FBUyxDQUFDLFVBQW9CLEtBQWEsT0FBZSxRQUFpQjtBQUFBLEVBQ3pGLFNBQVMsUUFBUSxPQUFPLGNBQWMsR0FBRyxPQUFPLFFBQVEsU0FBUyx1QkFBdUIsU0FBUyxJQUFJO0FBQUE7QUFHaEcsU0FBUyxZQUFZLENBQUMsVUFBb0IsS0FBYTtBQUFBLEVBQzVELFNBQVMsUUFBUSxPQUFPLGNBQWMsR0FBRyw2QkFBNkI7QUFBQTs7QUNqQnhFLGVBQXNCLEdBQUcsR0FBRyxPQUFPLFNBQVMsWUFBMkI7QUFBQSxFQUVyRSxNQUFNLFVBQW9CLE1BQU0sSUFBSSxTQUFTO0FBQUEsRUFDN0MsTUFBTSxXQUFXLE1BQU0sUUFBUSxTQUFTLFlBQVk7QUFBQSxFQUNwRCxVQUFVLFVBQVUsYUFBYSxPQUFRLGNBQXdCLEtBQUssRUFBZTtBQUFBLEVBQ3JGLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjdBRjcwQjg2NThCNEQzRDA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,31 +0,0 @@
|
|||||||
// @bun
|
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: () => mod[key],
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
||||||
var __require = import.meta.require;
|
|
||||||
|
|
||||||
// src/api/auth/index.ts
|
|
||||||
function GET(request) {
|
|
||||||
const eveauth = request.store.get("eveauth");
|
|
||||||
return eveauth.redirect();
|
|
||||||
}
|
|
||||||
export {
|
|
||||||
GET
|
|
||||||
};
|
|
||||||
|
|
||||||
//# debugId=2B9DFE71D16A520B64756E2164756E21
|
|
||||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHNyY1xcYXBpXFxhdXRoXFxpbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnYnJpc2EnO1xuaW1wb3J0IHR5cGUgeyBFVkVBdXRoIH0gZnJvbSAnQC9taWRkbGV3YXJlJztcblxuLy8gR0VUIC9hcGkvYXV0aC9cbmV4cG9ydCBmdW5jdGlvbiBHRVQocmVxdWVzdDogUmVxdWVzdENvbnRleHQpIHtcbiAgY29uc3QgZXZlYXV0aDogRVZFQXV0aCA9ICByZXF1ZXN0LnN0b3JlLmdldCgnZXZlYXV0aCcpO1xuICByZXR1cm4gZXZlYXV0aC5yZWRpcmVjdCgpO1xufSIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlPLFNBQVMsR0FBRyxDQUFDLFNBQXlCO0FBQUEsRUFDM0MsTUFBTSxVQUFvQixRQUFRLE1BQU0sSUFBSSxTQUFTO0FBQUEsRUFDckQsT0FBTyxRQUFRLFNBQVM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjJCOURGRTcxRDE2QTUyMEI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export default ["style-4253422825010316650.css","style-4799912372787954844.css","style-16814944961881043919.css"]
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
l$=new Set;u$=(k)=>{let g=(f)=>document.getElementById(f);l$.add(k);for(let f of l$){let j=g(`S:${f}`),h=g(`U:${f}`);if(j&&h)l$.delete(f),j.replaceWith(h.content.cloneNode(!0)),h.remove(),g(`R:${f}`)?.remove()}};
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
\pages\index.js
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,56 +0,0 @@
|
|||||||
// @bun
|
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: () => mod[key],
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
||||||
var __require = import.meta.require;
|
|
||||||
|
|
||||||
// node_modules/brisa/jsx-runtime/index.js
|
|
||||||
var n = Symbol.for("isJSX");
|
|
||||||
function S(r) {
|
|
||||||
return i(null, r);
|
|
||||||
}
|
|
||||||
function i(r, { children: e, ...o }, s) {
|
|
||||||
let a = e;
|
|
||||||
if (Array.isArray(e) && !l(e))
|
|
||||||
a = e.map((t) => t?.[n] ? t : S({ children: t }));
|
|
||||||
return Object.assign([r, { ...o, key: s }, a], { [n]: true });
|
|
||||||
}
|
|
||||||
function l(r) {
|
|
||||||
return Array.isArray(r) && ((n in r) || m(r));
|
|
||||||
}
|
|
||||||
function m(r) {
|
|
||||||
return r?.[0] === "HTML" && typeof r[1]?.html === "string";
|
|
||||||
}
|
|
||||||
|
|
||||||
// src/pages/auth/error.tsx
|
|
||||||
function Error() {
|
|
||||||
return i(S, {
|
|
||||||
children: i("div", {
|
|
||||||
children: [i("h1", {
|
|
||||||
children: "EVE auth failed, close this tab and try again."
|
|
||||||
}, undefined, false, undefined, this), i("p", {
|
|
||||||
children: "If this issue persists reach out to an Administrator."
|
|
||||||
}, undefined, false, undefined, this)]
|
|
||||||
}, undefined, true, undefined, this)
|
|
||||||
}, undefined, false, undefined, this);
|
|
||||||
}
|
|
||||||
export {
|
|
||||||
Error as default
|
|
||||||
};
|
|
||||||
|
|
||||||
//# debugId=F0E3E3449C64DA0864756E2164756E21
|
|
||||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXG5vZGVfbW9kdWxlc1xcYnJpc2FcXGpzeC1ydW50aW1lXFxpbmRleC5qcyIsICIuLlxcc3JjXFxwYWdlc1xcYXV0aFxcZXJyb3IudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEBidW5cbnZhciBuPVN5bWJvbC5mb3IoXCJpc0pTWFwiKTtmdW5jdGlvbiBTKHIpe3JldHVybiBpKG51bGwscil9ZnVuY3Rpb24gaShyLHtjaGlsZHJlbjplLC4uLm99LHMpe2xldCBhPWU7aWYoQXJyYXkuaXNBcnJheShlKSYmIWwoZSkpYT1lLm1hcCgodCk9PnQ/LltuXT90OlMoe2NoaWxkcmVuOnR9KSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oW3Isey4uLm8sa2V5OnN9LGFdLHtbbl06ITB9KX1mdW5jdGlvbiBsKHIpe3JldHVybiBBcnJheS5pc0FycmF5KHIpJiYoKG4gaW4gcil8fG0ocikpfWZ1bmN0aW9uIG0ocil7cmV0dXJuIHI/LlswXT09PVwiSFRNTFwiJiZ0eXBlb2YgclsxXT8uaHRtbD09PVwic3RyaW5nXCJ9ZXhwb3J0e2kgYXMganN4cyxpIGFzIGpzeERFVixpIGFzIGpzeCxtIGFzIGlzRGFuZ2VySFRNTCxsIGFzIGlzQXJyYXdPZkpTWENvbnRlbnQsUyBhcyBGcmFnbWVudH07XG4iLAogICAgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEVycm9yKCkge1xuICByZXR1cm4ganN4REVWXzd4ODFoMGtuKEZyYWdtZW50Xzh2Zzl4M3NxLCB7XG4gICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcImRpdlwiLCB7XG4gICAgICBjaGlsZHJlbjogW2pzeERFVl83eDgxaDBrbihcImgxXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IFwiRVZFIGF1dGggZmFpbGVkLCBjbG9zZSB0aGlzIHRhYiBhbmQgdHJ5IGFnYWluLlwiXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpLCBqc3hERVZfN3g4MWgwa24oXCJwXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IFwiSWYgdGhpcyBpc3N1ZSBwZXJzaXN0cyByZWFjaCBvdXQgdG8gYW4gQWRtaW5pc3RyYXRvci5cIlxuICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKV1cbiAgICB9LCB1bmRlZmluZWQsIHRydWUsIHVuZGVmaW5lZCwgdGhpcylcbiAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKTtcbn1cbmltcG9ydCB7IGpzeCBhcyBqc3hfdzc3eWFmczQsIGpzeHMgYXMganN4c19laDZjNzhuaiwganN4REVWIGFzIGpzeERFVl83eDgxaDBrbiwgRnJhZ21lbnQgYXMgRnJhZ21lbnRfOHZnOXgzc3EgfSBmcm9tICdicmlzYS9qc3gtcnVudGltZSc7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFJLElBQUUsT0FBTyxJQUFJLE9BQU87QUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFO0FBQUEsRUFBQyxPQUFPLEVBQUUsTUFBSyxDQUFDO0FBQUE7QUFBRSxTQUFTLENBQUMsQ0FBQyxLQUFHLFVBQVMsTUFBSyxLQUFHLEdBQUU7QUFBQSxFQUFDLElBQUksSUFBRTtBQUFBLEVBQUUsSUFBRyxNQUFNLFFBQVEsQ0FBQyxNQUFJLEVBQUUsQ0FBQztBQUFBLElBQUUsSUFBRSxFQUFFLElBQUksQ0FBQyxNQUFJLElBQUksS0FBRyxJQUFFLEVBQUUsRUFBQyxVQUFTLEVBQUMsQ0FBQyxDQUFDO0FBQUEsRUFBRSxPQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUUsS0FBSSxHQUFFLEtBQUksRUFBQyxHQUFFLENBQUMsR0FBRSxHQUFFLElBQUcsS0FBRSxDQUFDO0FBQUE7QUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFFO0FBQUEsRUFBQyxPQUFPLE1BQU0sUUFBUSxDQUFDLE9BQUssS0FBSyxNQUFJLEVBQUUsQ0FBQztBQUFBO0FBQUcsU0FBUyxDQUFDLENBQUMsR0FBRTtBQUFBLEVBQUMsT0FBTyxJQUFJLE9BQUssVUFBUSxPQUFPLEVBQUUsSUFBSSxTQUFPO0FBQUE7OztBQ0R6VSxTQUF3QixLQUFLLEdBQUc7QUFBQSxFQUM5QixPQUFPLEVBQWdCLEdBQW1CO0FBQUEsSUFDeEMsVUFBVSxFQUFnQixPQUFPO0FBQUEsTUFDL0IsVUFBVSxDQUFDLEVBQWdCLE1BQU07QUFBQSxRQUMvQixVQUFVO0FBQUEsTUFDWixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUksR0FBRyxFQUFnQixLQUFLO0FBQUEsUUFDMUQsVUFBVTtBQUFBLE1BQ1osR0FBRyxXQUFXLE9BQU8sV0FBVyxJQUFJLENBQUM7QUFBQSxJQUN2QyxHQUFHLFdBQVcsTUFBTSxXQUFXLElBQUk7QUFBQSxFQUNyQyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkYwRTNFMzQ0OUM2NERBMDg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
// @bun
|
|
||||||
var __create = Object.create;
|
|
||||||
var __getProtoOf = Object.getPrototypeOf;
|
|
||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
||||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
||||||
var __toESM = (mod, isNodeMode, target) => {
|
|
||||||
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
||||||
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
||||||
for (let key of __getOwnPropNames(mod))
|
|
||||||
if (!__hasOwnProp.call(to, key))
|
|
||||||
__defProp(to, key, {
|
|
||||||
get: () => mod[key],
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
return to;
|
|
||||||
};
|
|
||||||
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
||||||
var __require = import.meta.require;
|
|
||||||
|
|
||||||
// node_modules/brisa/jsx-runtime/index.js
|
|
||||||
var n = Symbol.for("isJSX");
|
|
||||||
function S(r) {
|
|
||||||
return i(null, r);
|
|
||||||
}
|
|
||||||
function i(r, { children: e, ...o }, s) {
|
|
||||||
let a = e;
|
|
||||||
if (Array.isArray(e) && !l(e))
|
|
||||||
a = e.map((t) => t?.[n] ? t : S({ children: t }));
|
|
||||||
return Object.assign([r, { ...o, key: s }, a], { [n]: true });
|
|
||||||
}
|
|
||||||
function l(r) {
|
|
||||||
return Array.isArray(r) && ((n in r) || m(r));
|
|
||||||
}
|
|
||||||
function m(r) {
|
|
||||||
return r?.[0] === "HTML" && typeof r[1]?.html === "string";
|
|
||||||
}
|
|
||||||
|
|
||||||
// src/pages/auth/success.tsx
|
|
||||||
function Success() {
|
|
||||||
return i(S, {
|
|
||||||
children: i("div", {
|
|
||||||
class: "hero",
|
|
||||||
children: i("h1", {
|
|
||||||
children: "EVE auth success, you may close this browser tab."
|
|
||||||
}, undefined, false, undefined, this)
|
|
||||||
}, undefined, false, undefined, this)
|
|
||||||
}, undefined, false, undefined, this);
|
|
||||||
}
|
|
||||||
export {
|
|
||||||
Success as default
|
|
||||||
};
|
|
||||||
|
|
||||||
//# debugId=DE19EB2F6E2E7A6A64756E2164756E21
|
|
||||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXG5vZGVfbW9kdWxlc1xcYnJpc2FcXGpzeC1ydW50aW1lXFxpbmRleC5qcyIsICIuLlxcc3JjXFxwYWdlc1xcYXV0aFxcc3VjY2Vzcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLy8gQGJ1blxudmFyIG49U3ltYm9sLmZvcihcImlzSlNYXCIpO2Z1bmN0aW9uIFMocil7cmV0dXJuIGkobnVsbCxyKX1mdW5jdGlvbiBpKHIse2NoaWxkcmVuOmUsLi4ub30scyl7bGV0IGE9ZTtpZihBcnJheS5pc0FycmF5KGUpJiYhbChlKSlhPWUubWFwKCh0KT0+dD8uW25dP3Q6Uyh7Y2hpbGRyZW46dH0pKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihbcix7Li4ubyxrZXk6c30sYV0se1tuXTohMH0pfWZ1bmN0aW9uIGwocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocikmJigobiBpbiByKXx8bShyKSl9ZnVuY3Rpb24gbShyKXtyZXR1cm4gcj8uWzBdPT09XCJIVE1MXCImJnR5cGVvZiByWzFdPy5odG1sPT09XCJzdHJpbmdcIn1leHBvcnR7aSBhcyBqc3hzLGkgYXMganN4REVWLGkgYXMganN4LG0gYXMgaXNEYW5nZXJIVE1MLGwgYXMgaXNBcnJhd09mSlNYQ29udGVudCxTIGFzIEZyYWdtZW50fTtcbiIsCiAgICAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3VjY2VzcygpIHtcbiAgcmV0dXJuIGpzeERFVl83eDgxaDBrbihGcmFnbWVudF84dmc5eDNzcSwge1xuICAgIGNoaWxkcmVuOiBqc3hERVZfN3g4MWgwa24oXCJkaXZcIiwge1xuICAgICAgY2xhc3M6IFwiaGVyb1wiLFxuICAgICAgY2hpbGRyZW46IGpzeERFVl83eDgxaDBrbihcImgxXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IFwiRVZFIGF1dGggc3VjY2VzcywgeW91IG1heSBjbG9zZSB0aGlzIGJyb3dzZXIgdGFiLlwiXG4gICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpXG4gICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdW5kZWZpbmVkLCB0aGlzKVxuICB9LCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHRoaXMpO1xufVxuaW1wb3J0IHsganN4IGFzIGpzeF93Nzd5YWZzNCwganN4cyBhcyBqc3hzX2VoNmM3OG5qLCBqc3hERVYgYXMganN4REVWXzd4ODFoMGtuLCBGcmFnbWVudCBhcyBGcmFnbWVudF84dmc5eDNzcSB9IGZyb20gJ2JyaXNhL2pzeC1ydW50aW1lJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLElBQUksSUFBRSxPQUFPLElBQUksT0FBTztBQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUU7QUFBQSxFQUFDLE9BQU8sRUFBRSxNQUFLLENBQUM7QUFBQTtBQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUcsVUFBUyxNQUFLLEtBQUcsR0FBRTtBQUFBLEVBQUMsSUFBSSxJQUFFO0FBQUEsRUFBRSxJQUFHLE1BQU0sUUFBUSxDQUFDLE1BQUksRUFBRSxDQUFDO0FBQUEsSUFBRSxJQUFFLEVBQUUsSUFBSSxDQUFDLE1BQUksSUFBSSxLQUFHLElBQUUsRUFBRSxFQUFDLFVBQVMsRUFBQyxDQUFDLENBQUM7QUFBQSxFQUFFLE9BQU8sT0FBTyxPQUFPLENBQUMsR0FBRSxLQUFJLEdBQUUsS0FBSSxFQUFDLEdBQUUsQ0FBQyxHQUFFLEdBQUUsSUFBRyxLQUFFLENBQUM7QUFBQTtBQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUU7QUFBQSxFQUFDLE9BQU8sTUFBTSxRQUFRLENBQUMsT0FBSyxLQUFLLE1BQUksRUFBRSxDQUFDO0FBQUE7QUFBRyxTQUFTLENBQUMsQ0FBQyxHQUFFO0FBQUEsRUFBQyxPQUFPLElBQUksT0FBSyxVQUFRLE9BQU8sRUFBRSxJQUFJLFNBQU87QUFBQTs7O0FDRHpVLFNBQXdCLE9BQU8sR0FBRztBQUFBLEVBQ2hDLE9BQU8sRUFBZ0IsR0FBbUI7QUFBQSxJQUN4QyxVQUFVLEVBQWdCLE9BQU87QUFBQSxNQUMvQixPQUFPO0FBQUEsTUFDUCxVQUFVLEVBQWdCLE1BQU07QUFBQSxRQUM5QixVQUFVO0FBQUEsTUFDWixHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxJQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQSxFQUN0QyxHQUFHLFdBQVcsT0FBTyxXQUFXLElBQUk7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkRFMTlFQjJGNkUyRTdBNkE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg width="100%" height="100%" viewBox="0 0 200 199" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
||||||
<g transform="matrix(1,0,0,1,-1.46627e-05,-0.862671)">
|
|
||||||
<path d="M124.615,158.942C194.326,134.262 190.916,42.893 140.767,0.863C184.318,20.349 206.756,72.952 198.203,118.905C191.512,154.854 164.558,184.522 129.69,194.524C111.34,199.788 91.695,200.819 73.085,196.201C36.436,187.108 7.653,155.954 1.303,118.778C-3.783,88.998 6.075,58.343 29.922,38.996C54.808,18.806 92.107,14.056 119.324,32.517C146.142,50.708 155.776,89.452 135.231,116.111C124.748,129.714 107.413,137.633 90.191,135.012C72.184,132.272 58.17,116.038 60.606,97.494C63.655,121.563 92.134,130.674 109.243,113.883C125.024,98.394 116.512,74.337 100.517,62.603C87.184,52.821 68.389,55.268 55.26,64.22C39.06,75.266 32.739,94.717 36.289,113.574C44.063,154.866 87.626,172.037 124.615,158.942L124.615,158.942Z" style="fill:url(#_Radial1);"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<radialGradient id="_Radial1" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(52.186,-99.1373,99.1373,52.186,88.8208,100)"><stop offset="0" style="stop-color:rgb(44,240,204);stop-opacity:1"/><stop offset="0.53" style="stop-color:rgb(44,230,209);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(44,195,228);stop-opacity:1"/></radialGradient>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
|||||||
footer {
|
|
||||||
display: grid;
|
|
||||||
font-family: "Poppins", sans-serif;
|
|
||||||
font-size: 27px;
|
|
||||||
line-height: 1.5;
|
|
||||||
height: 15vh;
|
|
||||||
place-items: center;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/* Navigation Styles */
|
|
||||||
@@ -1,329 +0,0 @@
|
|||||||
{
|
|
||||||
"lockfileVersion": 1,
|
|
||||||
"workspaces": {
|
|
||||||
"": {
|
|
||||||
"name": "Star Kitten Web",
|
|
||||||
"dependencies": {
|
|
||||||
"brisa": "0.2.7",
|
|
||||||
"brisa-tailwindcss": "0.2.7",
|
|
||||||
"drizzle-orm": "^0.40.0",
|
|
||||||
"oslo": "^1.2.1",
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/bun": "latest",
|
|
||||||
"daisyui": "^5.0.0",
|
|
||||||
"drizzle-kit": "^0.30.5",
|
|
||||||
"typescript": "latest",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"packages": {
|
|
||||||
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
|
|
||||||
|
|
||||||
"@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="],
|
|
||||||
|
|
||||||
"@emnapi/core": ["@emnapi/core@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw=="],
|
|
||||||
|
|
||||||
"@emnapi/runtime": ["@emnapi/runtime@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="],
|
|
||||||
|
|
||||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="],
|
|
||||||
|
|
||||||
"@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="],
|
|
||||||
|
|
||||||
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="],
|
|
||||||
|
|
||||||
"@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="],
|
|
||||||
|
|
||||||
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="],
|
|
||||||
|
|
||||||
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="],
|
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="],
|
|
||||||
|
|
||||||
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="],
|
|
||||||
|
|
||||||
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="],
|
|
||||||
|
|
||||||
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="],
|
|
||||||
|
|
||||||
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="],
|
|
||||||
|
|
||||||
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="],
|
|
||||||
|
|
||||||
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="],
|
|
||||||
|
|
||||||
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="],
|
|
||||||
|
|
||||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2": ["@node-rs/argon2@1.7.0", "", { "optionalDependencies": { "@node-rs/argon2-android-arm-eabi": "1.7.0", "@node-rs/argon2-android-arm64": "1.7.0", "@node-rs/argon2-darwin-arm64": "1.7.0", "@node-rs/argon2-darwin-x64": "1.7.0", "@node-rs/argon2-freebsd-x64": "1.7.0", "@node-rs/argon2-linux-arm-gnueabihf": "1.7.0", "@node-rs/argon2-linux-arm64-gnu": "1.7.0", "@node-rs/argon2-linux-arm64-musl": "1.7.0", "@node-rs/argon2-linux-x64-gnu": "1.7.0", "@node-rs/argon2-linux-x64-musl": "1.7.0", "@node-rs/argon2-wasm32-wasi": "1.7.0", "@node-rs/argon2-win32-arm64-msvc": "1.7.0", "@node-rs/argon2-win32-ia32-msvc": "1.7.0", "@node-rs/argon2-win32-x64-msvc": "1.7.0" } }, "sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-android-arm-eabi": ["@node-rs/argon2-android-arm-eabi@1.7.0", "", { "os": "android", "cpu": "arm" }, "sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-android-arm64": ["@node-rs/argon2-android-arm64@1.7.0", "", { "os": "android", "cpu": "arm64" }, "sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-darwin-arm64": ["@node-rs/argon2-darwin-arm64@1.7.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-darwin-x64": ["@node-rs/argon2-darwin-x64@1.7.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-freebsd-x64": ["@node-rs/argon2-freebsd-x64@1.7.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-linux-arm-gnueabihf": ["@node-rs/argon2-linux-arm-gnueabihf@1.7.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-linux-arm64-gnu": ["@node-rs/argon2-linux-arm64-gnu@1.7.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-linux-arm64-musl": ["@node-rs/argon2-linux-arm64-musl@1.7.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-linux-x64-gnu": ["@node-rs/argon2-linux-x64-gnu@1.7.0", "", { "os": "linux", "cpu": "x64" }, "sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-linux-x64-musl": ["@node-rs/argon2-linux-x64-musl@1.7.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-wasm32-wasi": ["@node-rs/argon2-wasm32-wasi@1.7.0", "", { "dependencies": { "@emnapi/core": "^0.45.0", "@emnapi/runtime": "^0.45.0", "@tybys/wasm-util": "^0.8.1", "memfs-browser": "^3.4.13000" }, "cpu": "none" }, "sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-win32-arm64-msvc": ["@node-rs/argon2-win32-arm64-msvc@1.7.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-win32-ia32-msvc": ["@node-rs/argon2-win32-ia32-msvc@1.7.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg=="],
|
|
||||||
|
|
||||||
"@node-rs/argon2-win32-x64-msvc": ["@node-rs/argon2-win32-x64-msvc@1.7.0", "", { "os": "win32", "cpu": "x64" }, "sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt": ["@node-rs/bcrypt@1.9.0", "", { "optionalDependencies": { "@node-rs/bcrypt-android-arm-eabi": "1.9.0", "@node-rs/bcrypt-android-arm64": "1.9.0", "@node-rs/bcrypt-darwin-arm64": "1.9.0", "@node-rs/bcrypt-darwin-x64": "1.9.0", "@node-rs/bcrypt-freebsd-x64": "1.9.0", "@node-rs/bcrypt-linux-arm-gnueabihf": "1.9.0", "@node-rs/bcrypt-linux-arm64-gnu": "1.9.0", "@node-rs/bcrypt-linux-arm64-musl": "1.9.0", "@node-rs/bcrypt-linux-x64-gnu": "1.9.0", "@node-rs/bcrypt-linux-x64-musl": "1.9.0", "@node-rs/bcrypt-wasm32-wasi": "1.9.0", "@node-rs/bcrypt-win32-arm64-msvc": "1.9.0", "@node-rs/bcrypt-win32-ia32-msvc": "1.9.0", "@node-rs/bcrypt-win32-x64-msvc": "1.9.0" } }, "sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-android-arm-eabi": ["@node-rs/bcrypt-android-arm-eabi@1.9.0", "", { "os": "android", "cpu": "arm" }, "sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-android-arm64": ["@node-rs/bcrypt-android-arm64@1.9.0", "", { "os": "android", "cpu": "arm64" }, "sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-darwin-arm64": ["@node-rs/bcrypt-darwin-arm64@1.9.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-darwin-x64": ["@node-rs/bcrypt-darwin-x64@1.9.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-freebsd-x64": ["@node-rs/bcrypt-freebsd-x64@1.9.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-linux-arm-gnueabihf": ["@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-linux-arm64-gnu": ["@node-rs/bcrypt-linux-arm64-gnu@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-linux-arm64-musl": ["@node-rs/bcrypt-linux-arm64-musl@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-linux-x64-gnu": ["@node-rs/bcrypt-linux-x64-gnu@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-linux-x64-musl": ["@node-rs/bcrypt-linux-x64-musl@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-wasm32-wasi": ["@node-rs/bcrypt-wasm32-wasi@1.9.0", "", { "dependencies": { "@emnapi/core": "^0.45.0", "@emnapi/runtime": "^0.45.0", "@tybys/wasm-util": "^0.8.1", "memfs-browser": "^3.4.13000" }, "cpu": "none" }, "sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-win32-arm64-msvc": ["@node-rs/bcrypt-win32-arm64-msvc@1.9.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-win32-ia32-msvc": ["@node-rs/bcrypt-win32-ia32-msvc@1.9.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA=="],
|
|
||||||
|
|
||||||
"@node-rs/bcrypt-win32-x64-msvc": ["@node-rs/bcrypt-win32-x64-msvc@1.9.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w=="],
|
|
||||||
|
|
||||||
"@petamoriken/float16": ["@petamoriken/float16@3.9.1", "", {}, "sha512-j+ejhYwY6PeB+v1kn7lZFACUIG97u90WxMuGosILFsl9d4Ovi0sjk0GlPfoEcx+FzvXZDAfioD+NGnnPamXgMA=="],
|
|
||||||
|
|
||||||
"@tailwindcss/node": ["@tailwindcss/node@4.0.9", "", { "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "tailwindcss": "4.0.9" } }, "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.9", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.9", "@tailwindcss/oxide-darwin-arm64": "4.0.9", "@tailwindcss/oxide-darwin-x64": "4.0.9", "@tailwindcss/oxide-freebsd-x64": "4.0.9", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", "@tailwindcss/oxide-linux-x64-musl": "4.0.9", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" } }, "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.9", "", { "os": "android", "cpu": "arm64" }, "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.9", "", { "os": "linux", "cpu": "arm" }, "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.9", "", { "os": "linux", "cpu": "x64" }, "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.9", "", { "os": "linux", "cpu": "x64" }, "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ=="],
|
|
||||||
|
|
||||||
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.9", "", { "os": "win32", "cpu": "x64" }, "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA=="],
|
|
||||||
|
|
||||||
"@tailwindcss/postcss": ["@tailwindcss/postcss@4.0.9", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.0.9", "@tailwindcss/oxide": "4.0.9", "lightningcss": "^1.29.1", "postcss": "^8.4.41", "tailwindcss": "4.0.9" } }, "sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ=="],
|
|
||||||
|
|
||||||
"@tybys/wasm-util": ["@tybys/wasm-util@0.8.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q=="],
|
|
||||||
|
|
||||||
"@types/bun": ["@types/bun@1.2.4", "", { "dependencies": { "bun-types": "1.2.4" } }, "sha512-QtuV5OMR8/rdKJs213iwXDpfVvnskPXY/S0ZiFbsTjQZycuqPbMW8Gf/XhLfwE5njW8sxI2WjISURXPlHypMFA=="],
|
|
||||||
|
|
||||||
"@types/node": ["@types/node@22.13.8", "", { "dependencies": { "undici-types": "~6.20.0" } }, "sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ=="],
|
|
||||||
|
|
||||||
"@types/ws": ["@types/ws@8.5.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw=="],
|
|
||||||
|
|
||||||
"astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
|
|
||||||
|
|
||||||
"brisa": ["brisa@0.2.7", "", { "dependencies": { "astring": "1.9.0", "csstype": "3.1.3", "diff-dom-streaming": "0.6.5", "meriyah": "6.0.5" }, "bin": { "brisa": "index.js" } }, "sha512-76fjLQkwfbAxdkA7bpQf7RUdvwsuC6l1nsNndn3yL6C2uD+SQ9RvHTuqwt8hWOz37j2zfN31AIxkJkuA9zwFMg=="],
|
|
||||||
|
|
||||||
"brisa-tailwindcss": ["brisa-tailwindcss@0.2.7", "", { "peerDependencies": { "@tailwindcss/postcss": "^4.0.0", "postcss": "^8.4.48", "tailwindcss": "^4.0.1" } }, "sha512-ZH4iSEWqY1V+G2sfn7l9YpR/d0AcEK+pWbpIQgoPeFG/qeyDVihHahg7Vp2ZWVp8Bbqq4v0vUhI09zV+OJLFdA=="],
|
|
||||||
|
|
||||||
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
|
|
||||||
|
|
||||||
"bun-types": ["bun-types@1.2.4", "", { "dependencies": { "@types/node": "*", "@types/ws": "~8.5.10" } }, "sha512-nDPymR207ZZEoWD4AavvEaa/KZe/qlrbMSchqpQwovPZCKc7pwMoENjEtHgMKaAjJhy+x6vfqSBA1QU3bJgs0Q=="],
|
|
||||||
|
|
||||||
"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
|
|
||||||
|
|
||||||
"daisyui": ["daisyui@5.0.0", "", {}, "sha512-U0K9Bac3Bi3zZGm6ojrw12F0vBHTpEgf46zv/BYxLe07hF0Xnx7emIQliwaRBgJuYhY0BhwQ6wSnq5cJXHA2yA=="],
|
|
||||||
|
|
||||||
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
|
|
||||||
|
|
||||||
"detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
|
|
||||||
|
|
||||||
"diff-dom-streaming": ["diff-dom-streaming@0.6.5", "", {}, "sha512-S6a7AVm5S0cwOkIYLTg+ilPaCnHM4/QoPol11PLYRKYqud/MfW+wW54+K2zBFqNY3DoNZZXO8yaF3iwFeJkz+A=="],
|
|
||||||
|
|
||||||
"drizzle-kit": ["drizzle-kit@0.30.5", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA=="],
|
|
||||||
|
|
||||||
"drizzle-orm": ["drizzle-orm@0.40.0", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-7ptk/HQiMSrEZHnAsSlBESXWj52VwgMmyTEfoNmpNN2ZXpcz13LwHfXTIghsAEud7Z5UJhDOp8U07ujcqme7wg=="],
|
|
||||||
|
|
||||||
"enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
|
|
||||||
|
|
||||||
"env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="],
|
|
||||||
|
|
||||||
"esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="],
|
|
||||||
|
|
||||||
"esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="],
|
|
||||||
|
|
||||||
"fs-monkey": ["fs-monkey@1.0.6", "", {}, "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg=="],
|
|
||||||
|
|
||||||
"gel": ["gel@2.0.0", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-Oq3Fjay71s00xzDc0BF/mpcLmnA+uRqMEJK8p5K4PaZjUEsxaeo+kR9OHBVAf289/qPd+0OcLOLUN0UhqiUCog=="],
|
|
||||||
|
|
||||||
"get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="],
|
|
||||||
|
|
||||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
|
||||||
|
|
||||||
"isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="],
|
|
||||||
|
|
||||||
"jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
|
|
||||||
|
|
||||||
"lightningcss": ["lightningcss@1.29.1", "", { "dependencies": { "detect-libc": "^1.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.1", "lightningcss-darwin-x64": "1.29.1", "lightningcss-freebsd-x64": "1.29.1", "lightningcss-linux-arm-gnueabihf": "1.29.1", "lightningcss-linux-arm64-gnu": "1.29.1", "lightningcss-linux-arm64-musl": "1.29.1", "lightningcss-linux-x64-gnu": "1.29.1", "lightningcss-linux-x64-musl": "1.29.1", "lightningcss-win32-arm64-msvc": "1.29.1", "lightningcss-win32-x64-msvc": "1.29.1" } }, "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q=="],
|
|
||||||
|
|
||||||
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw=="],
|
|
||||||
|
|
||||||
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA=="],
|
|
||||||
|
|
||||||
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ=="],
|
|
||||||
|
|
||||||
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.1", "", { "os": "linux", "cpu": "arm" }, "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg=="],
|
|
||||||
|
|
||||||
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ=="],
|
|
||||||
|
|
||||||
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw=="],
|
|
||||||
|
|
||||||
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw=="],
|
|
||||||
|
|
||||||
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.1", "", { "os": "linux", "cpu": "x64" }, "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw=="],
|
|
||||||
|
|
||||||
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog=="],
|
|
||||||
|
|
||||||
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.1", "", { "os": "win32", "cpu": "x64" }, "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q=="],
|
|
||||||
|
|
||||||
"memfs": ["memfs@3.5.3", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw=="],
|
|
||||||
|
|
||||||
"memfs-browser": ["memfs-browser@3.5.10302", "", { "dependencies": { "memfs": "3.5.3" } }, "sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw=="],
|
|
||||||
|
|
||||||
"meriyah": ["meriyah@6.0.5", "", {}, "sha512-SrMqQCox7TTwtftWKHy/ZaVe+ZRpRl20pAgDo+PS9hzcAJrMjYsBJQPPiLXTnjztrqdfGS+Zz99r6Bwvydta1w=="],
|
|
||||||
|
|
||||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
|
||||||
|
|
||||||
"nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
|
|
||||||
|
|
||||||
"oslo": ["oslo@1.2.1", "", { "dependencies": { "@node-rs/argon2": "1.7.0", "@node-rs/bcrypt": "1.9.0" } }, "sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA=="],
|
|
||||||
|
|
||||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
|
||||||
|
|
||||||
"postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
|
|
||||||
|
|
||||||
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
|
|
||||||
|
|
||||||
"semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
|
|
||||||
|
|
||||||
"shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="],
|
|
||||||
|
|
||||||
"source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
|
||||||
|
|
||||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
|
||||||
|
|
||||||
"source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
|
|
||||||
|
|
||||||
"tailwindcss": ["tailwindcss@4.0.9", "", {}, "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw=="],
|
|
||||||
|
|
||||||
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
|
|
||||||
|
|
||||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
|
||||||
|
|
||||||
"typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="],
|
|
||||||
|
|
||||||
"undici-types": ["undici-types@6.20.0", "", {}, "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="],
|
|
||||||
|
|
||||||
"which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.18.20", "", { "os": "android", "cpu": "x64" }, "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.18.20", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.18.20", "", { "os": "darwin", "cpu": "x64" }, "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.18.20", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.18.20", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.18.20", "", { "os": "linux", "cpu": "arm" }, "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.18.20", "", { "os": "linux", "cpu": "arm64" }, "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.18.20", "", { "os": "linux", "cpu": "ia32" }, "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.18.20", "", { "os": "linux", "cpu": "ppc64" }, "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.18.20", "", { "os": "linux", "cpu": "none" }, "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.18.20", "", { "os": "linux", "cpu": "s390x" }, "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.18.20", "", { "os": "linux", "cpu": "x64" }, "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.18.20", "", { "os": "none", "cpu": "x64" }, "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.18.20", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.18.20", "", { "os": "sunos", "cpu": "x64" }, "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.18.20", "", { "os": "win32", "cpu": "arm64" }, "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.18.20", "", { "os": "win32", "cpu": "ia32" }, "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g=="],
|
|
||||||
|
|
||||||
"@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
[test]
|
|
||||||
preload = "brisa/test"
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@star-kitten/eve-web",
|
|
||||||
"module": "src/pages/index.tsx",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "bunx dotenvx run -f .env.development -- brisa dev",
|
|
||||||
"dev:debug": "brisa dev --debug",
|
|
||||||
"build": "brisa build",
|
|
||||||
"start": "bunx dotenvx run -f .env.production -- brisa start"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"brisa": "0.2.7",
|
|
||||||
"brisa-tailwindcss": "0.2.7",
|
|
||||||
"drizzle-orm": "^0.40.0",
|
|
||||||
"oslo": "^1.2.1",
|
|
||||||
"@star-kitten/util": "workspace:^0.0.0",
|
|
||||||
"@star-kitten/eve": "workspace:^0.0.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/bun": "latest",
|
|
||||||
"daisyui": "^5.0.0",
|
|
||||||
"drizzle-kit": "^0.30.5",
|
|
||||||
"typescript": "latest"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { getCookies, removeCookie, setCookie } from '@/utils';
|
|
||||||
import { CharacterAPI, characterIdFromToken } from '@star-kitten/eve/esi';
|
|
||||||
import { CharacterHelper, UserHelper } from '@star-kitten/eve/db';
|
|
||||||
|
|
||||||
// GET /api/auth/callback
|
|
||||||
export async function GET(request: RequestContext) {
|
|
||||||
const eveauth: EVEAuth = request.store.get('eveauth');
|
|
||||||
const response = new Response('', { status: 302 });
|
|
||||||
|
|
||||||
try {
|
|
||||||
const cookies = getCookies(request.headers);
|
|
||||||
const cookieDiscordID = cookies['discordID'];
|
|
||||||
if (!cookieDiscordID) {
|
|
||||||
throw new Error(`Missing discordID cookie in /api/auth/callback`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const cookieCharacterID = cookies['characterID'];
|
|
||||||
const token = await eveauth.validate(response);
|
|
||||||
const characterID = characterIdFromToken(token.access_token);
|
|
||||||
if (cookieCharacterID && parseInt(cookieCharacterID) !== characterID) {
|
|
||||||
throw new Error(`Character ID mismatch: ${cookieCharacterID} !== ${characterID}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
let user = UserHelper.findByDiscordId(cookieDiscordID);
|
|
||||||
let character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
user = UserHelper.create(cookieDiscordID);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
throw new Error(`Something went wrong with creating a user for id: ${cookieDiscordID}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!character) {
|
|
||||||
const data = await CharacterAPI.getCharacterPublicData(characterID);
|
|
||||||
if (!data) {
|
|
||||||
throw new Error(`Failed to retreive character public data for id: ${characterID} - unable to create character`);
|
|
||||||
}
|
|
||||||
character = CharacterHelper.create(characterID, data.name || 'UNKNOWN NAME', user, token);
|
|
||||||
|
|
||||||
// refetch from db to get id
|
|
||||||
user = UserHelper.findByDiscordId(cookieDiscordID);
|
|
||||||
character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
|
|
||||||
if (!character) {
|
|
||||||
throw new Error(`Failed to retreive character from db for id: ${characterID}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user.mainCharacterID) {
|
|
||||||
user.mainCharacterID = character.id;
|
|
||||||
UserHelper.save(user);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Update existing character with new token
|
|
||||||
character.accessToken = token.access_token;
|
|
||||||
character.expiresAt = new Date(Date.now() + token.expires_in * 1000);
|
|
||||||
character.refreshToken = token.refresh_token;
|
|
||||||
CharacterHelper.save(character);
|
|
||||||
}
|
|
||||||
|
|
||||||
setCookie(response, 'currentUser', user.id + '', 60 * 60 * 24 * 30 /* 30 days */);
|
|
||||||
response.headers.set('location', '/auth/success');
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`Error: Callback failed with ${err}`);
|
|
||||||
response.headers.set('location', '/auth/error');
|
|
||||||
return response;
|
|
||||||
} finally {
|
|
||||||
removeCookie(response, 'discordID');
|
|
||||||
removeCookie(response, 'characterID');
|
|
||||||
removeCookie(response, 'state');
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { CharacterHelper, UserHelper } from '@star-kitten/eve/db';
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID/addScopes/characterID/:characterID/scopes/:scopes
|
|
||||||
export async function GET({ store, route: { params } }: RequestContext) {
|
|
||||||
const eveauth: EVEAuth = store.get('eveauth');
|
|
||||||
|
|
||||||
const discordID = params!['discordID'] as string;
|
|
||||||
const characterID = params!['characterID'] as string;
|
|
||||||
const requiredScopes = (params!['scopes'] as string).split(',');
|
|
||||||
|
|
||||||
const user = UserHelper.findByDiscordId(discordID);
|
|
||||||
const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
|
|
||||||
if (!character) {
|
|
||||||
throw new Error(`Character ${characterID} not found`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentScopes = CharacterHelper.getScopes(character);
|
|
||||||
const set = new Set(currentScopes);
|
|
||||||
requiredScopes.forEach((scope) => set.add(scope));
|
|
||||||
const scopes = Array.from(set).join(' ');
|
|
||||||
|
|
||||||
// As this is adding scopes, we need to redirect the user to the auth page
|
|
||||||
const response = await eveauth.redirect(scopes);
|
|
||||||
setCookie(response, 'discordID', discordID, 60 * 10 /* 10 min */);
|
|
||||||
setCookie(response, 'characterID', characterID, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { joinScopes, SCOPES } from '@star-kitten/eve/esi';
|
|
||||||
|
|
||||||
const allScopes = Object.values(SCOPES).filter((value) => typeof value === 'string') as string[];
|
|
||||||
const allScopesString = allScopes.join(' ');
|
|
||||||
|
|
||||||
const module_Scopes: { [key: string]: string } = {
|
|
||||||
'Full ESI': allScopesString,
|
|
||||||
'Public': joinScopes(SCOPES.PUBLIC_DATA),
|
|
||||||
'Characters': joinScopes(SCOPES.PUBLIC_DATA),
|
|
||||||
'Mail': joinScopes(SCOPES.MAIL_READ_MAIL, SCOPES.MAIL_SEND_MAIL, SCOPES.MAIL_ORGANIZE_MAIL),
|
|
||||||
'Skills': joinScopes(SCOPES.SKILLS_READ_SKILLQUEUE, SCOPES.SKILLS_READ_SKILLS),
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID/characterID/:characterID/modules/:modules
|
|
||||||
export async function GET({ store, route: { params } }: RequestContext) {
|
|
||||||
// we need to check the modules that were sent, in order to get the correct scopes
|
|
||||||
// that each module requires.
|
|
||||||
let modules = (params!['modules'] as string).split(' ');
|
|
||||||
let scopes = joinScopes(...modules.map((module) => module_Scopes[module]));
|
|
||||||
|
|
||||||
const eveauth: EVEAuth = store.get('eveauth');
|
|
||||||
const response = await eveauth.redirect(scopes);
|
|
||||||
setCookie(response, 'discordID', params!['discordID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
setCookie(response, 'characterID', params!['characterID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { CharacterHelper, UserHelper } from '@star-kitten/eve/db';
|
|
||||||
import { joinScopes } from '@star-kitten/eve/esi';
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID/characterID/:characterID/refresh
|
|
||||||
export async function GET({ store, route: { params } }: RequestContext) {
|
|
||||||
|
|
||||||
const discordID = params!['discordID'] as string;
|
|
||||||
const characterID = params!['characterID'] as string;
|
|
||||||
|
|
||||||
const user = UserHelper.findByDiscordId(discordID);
|
|
||||||
const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
|
|
||||||
if (!user) {
|
|
||||||
throw new Error(`User not found for discordID: ${discordID}`);
|
|
||||||
}
|
|
||||||
if (!character) {
|
|
||||||
throw new Error(`Character not found for user: ${user.id} and characterID: ${characterID}`);
|
|
||||||
}
|
|
||||||
const scopes = CharacterHelper.getScopes(character);
|
|
||||||
|
|
||||||
const eveauth: EVEAuth = store.get('eveauth');
|
|
||||||
const response = await eveauth.redirect(joinScopes(...scopes));
|
|
||||||
setCookie(response, 'discordID', discordID, 60 * 10 /* 10 min */);
|
|
||||||
setCookie(response, 'characterID', characterID, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID/characterID/:characterID/scopes/:scopes
|
|
||||||
export async function GET({ store, route: { params } }: RequestContext) {
|
|
||||||
// this is used to set the scopes that were sent, so just pass them along to auth directly
|
|
||||||
// with the provided scopes
|
|
||||||
const eveauth: EVEAuth = store.get('eveauth');
|
|
||||||
const response = await eveauth.redirect(params!['scopes'] as string);
|
|
||||||
setCookie(response, 'discordID', params!['discordID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
setCookie(response, 'characterID', params!['characterID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID
|
|
||||||
export async function GET({ store, route: { params }}: RequestContext) {
|
|
||||||
// called when adding a new character, so just redirect to auth and set cookies
|
|
||||||
const eveauth: EVEAuth = store.get('eveauth');
|
|
||||||
const response = await eveauth.redirect('publicData');
|
|
||||||
setCookie(response, 'discordID', params!['discordID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { setCookie } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { CharacterHelper, UserHelper } from '@star-kitten/eve/db'
|
|
||||||
|
|
||||||
// GET /api/auth/discordID/:discordID/removeScopes/characterID/:characterID/scopes/:scopes
|
|
||||||
export function GET({ route: { params } }: RequestContext) {
|
|
||||||
const discordID = params!['discordID'] as string;
|
|
||||||
const characterID = params!['characterID'] as string;
|
|
||||||
const removeScopes = (params!['scopes'] as string).split(',');
|
|
||||||
|
|
||||||
const user = UserHelper.findByDiscordId(discordID);
|
|
||||||
const character = CharacterHelper.findByUserAndEveID(user.id, Number(characterID));
|
|
||||||
if (!character) {
|
|
||||||
throw new Error(`Character ${characterID} not found`);
|
|
||||||
}
|
|
||||||
const currentScopes = CharacterHelper.getScopes(character);
|
|
||||||
const set = new Set(currentScopes);
|
|
||||||
removeScopes.forEach((scope) => set.delete(scope));
|
|
||||||
|
|
||||||
// As this is removing scopes, we can do this without user interaction
|
|
||||||
CharacterHelper.refreshTokens(character, Array.from(set).join(' '));
|
|
||||||
|
|
||||||
// redirect to success page
|
|
||||||
const response = new Response('', { status: 302 });
|
|
||||||
response.headers.set('location', '/auth/success');
|
|
||||||
setCookie(response, 'discordID', params!['discordID'] as string, 60 * 10 /* 10 min */);
|
|
||||||
setCookie(response, 'discordID', characterID, 60 * 10 /* 10 min */);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import type { EVEAuth } from '@/middleware';
|
|
||||||
|
|
||||||
// GET /api/auth/
|
|
||||||
export function GET(request: RequestContext) {
|
|
||||||
const eveauth: EVEAuth = request.store.get('eveauth');
|
|
||||||
return eveauth.redirect();
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import { renderComponent } from 'brisa/server';
|
|
||||||
|
|
||||||
export default function CounterServer({
|
|
||||||
initialValue = 0,
|
|
||||||
}: {
|
|
||||||
initialValue: number;
|
|
||||||
}) {
|
|
||||||
function increment(e: Event) {
|
|
||||||
const value = Number((e.target as HTMLButtonElement).dataset.value);
|
|
||||||
renderComponent({ element: <CounterServer initialValue={value + 1} /> });
|
|
||||||
}
|
|
||||||
|
|
||||||
function decrement(e: Event) {
|
|
||||||
const value = Number((e.target as HTMLButtonElement).dataset.value);
|
|
||||||
renderComponent({ element: <CounterServer initialValue={value - 1} /> });
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class="counter">
|
|
||||||
<div class="counter-container">
|
|
||||||
<h2>Server counter</h2>
|
|
||||||
<button
|
|
||||||
data-value={initialValue}
|
|
||||||
class="increment-button"
|
|
||||||
onClick={increment}
|
|
||||||
></button>
|
|
||||||
<div class="counter-value">{initialValue}</div>
|
|
||||||
<button
|
|
||||||
data-value={initialValue}
|
|
||||||
class="decrement-button"
|
|
||||||
onClick={decrement}
|
|
||||||
></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
export default function Footer() {
|
|
||||||
return (
|
|
||||||
<footer class="footer sm:footer-horizontal bg-neutral text-neutral-content items-center p-4">
|
|
||||||
<aside class="grid-flow-col items-center">
|
|
||||||
<svg
|
|
||||||
width="36"
|
|
||||||
height="36"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fillRule="evenodd"
|
|
||||||
clipRule="evenodd"
|
|
||||||
class="fill-current">
|
|
||||||
<path
|
|
||||||
d="M22.672 15.226l-2.432.811.841 2.515c.33 1.019-.209 2.127-1.23 2.456-1.15.325-2.148-.321-2.463-1.226l-.84-2.518-5.013 1.677.84 2.517c.391 1.203-.434 2.542-1.831 2.542-.88 0-1.601-.564-1.86-1.314l-.842-2.516-2.431.809c-1.135.328-2.145-.317-2.463-1.229-.329-1.018.211-2.127 1.231-2.456l2.432-.809-1.621-4.823-2.432.808c-1.355.384-2.558-.59-2.558-1.839 0-.817.509-1.582 1.327-1.846l2.433-.809-.842-2.515c-.33-1.02.211-2.129 1.232-2.458 1.02-.329 2.13.209 2.461 1.229l.842 2.515 5.011-1.677-.839-2.517c-.403-1.238.484-2.553 1.843-2.553.819 0 1.585.509 1.85 1.326l.841 2.517 2.431-.81c1.02-.33 2.131.211 2.461 1.229.332 1.018-.21 2.126-1.23 2.456l-2.433.809 1.622 4.823 2.433-.809c1.242-.401 2.557.484 2.557 1.838 0 .819-.51 1.583-1.328 1.847m-8.992-6.428l-5.01 1.675 1.619 4.828 5.011-1.674-1.62-4.829z"></path>
|
|
||||||
</svg>
|
|
||||||
<p>Copyright © {new Date().getFullYear()} Star Kitten Cafe - All rights reserved</p>
|
|
||||||
</aside>
|
|
||||||
<nav class="grid-flow-col gap-4 md:place-self-center md:justify-self-end">
|
|
||||||
<a href="https://github.com/roman-kaas/star-kitten" target='_blank'>
|
|
||||||
<svg
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 98 96"
|
|
||||||
class="fill-current">
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z" fill="#fff"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
{/* <a>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
class="fill-current">
|
|
||||||
<path
|
|
||||||
d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"></path>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
<a>
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
class="fill-current">
|
|
||||||
<path
|
|
||||||
d="M9 8h-3v4h3v12h5v-12h3.642l.358-4h-4v-1.667c0-.955.192-1.333 1.115-1.333h2.885v-5h-3.808c-3.596 0-5.192 1.583-5.192 4.615v3.385z"></path>
|
|
||||||
</svg>
|
|
||||||
</a> */}
|
|
||||||
</nav>
|
|
||||||
</footer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
import { CharacterHelper, type User } from '@star-kitten/eve/db';
|
|
||||||
import { CharacterAPI } from '@star-kitten/eve/esi';
|
|
||||||
|
|
||||||
export default function Nav({
|
|
||||||
user,
|
|
||||||
}: {
|
|
||||||
user: User;
|
|
||||||
}) {
|
|
||||||
const main = user.mainCharacterID && CharacterHelper.find(user.mainCharacterID);
|
|
||||||
return (
|
|
||||||
<div class="navbar bg-base-100 shadow-sm">
|
|
||||||
<div class="flex-1">
|
|
||||||
<a class="btn btn-ghost text-xl">Star Kitten</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<input type="text" placeholder="Search" class="input input-bordered w-24 md:w-auto" />
|
|
||||||
<div class="dropdown dropdown-end">
|
|
||||||
<div tabIndex={0} role="button" class="btn btn-ghost btn-circle avatar">
|
|
||||||
<div class="w-10 rounded-full">
|
|
||||||
<img
|
|
||||||
alt="Tailwind CSS Navbar component"
|
|
||||||
src={main && CharacterAPI.getPortraitURL(main.eveID) || ''} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<ul
|
|
||||||
tabIndex={0}
|
|
||||||
class="menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-2 shadow">
|
|
||||||
<li>
|
|
||||||
{main && main.name}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a class="justify-between">
|
|
||||||
Characters
|
|
||||||
<span class="badge">{user.characterIDs.length}</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li><a>Link Character</a></li>
|
|
||||||
<li><a>Settings</a></li>
|
|
||||||
<li><a>Logout</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import { type Character } from '@star-kitten/eve/db';
|
|
||||||
import { calculateTrainingPercentage, getCharacterSkillQueue } from '@star-kitten/eve/esi';
|
|
||||||
import { getSkill, getType } from '@star-kitten/eve/models';
|
|
||||||
|
|
||||||
export default async function SkillQueueStat({
|
|
||||||
character,
|
|
||||||
}: {
|
|
||||||
character: Character;
|
|
||||||
}) {
|
|
||||||
|
|
||||||
const queue = await getCharacterSkillQueue(character);
|
|
||||||
const current = queue?.find((skill) => skill.queue_position === 0);
|
|
||||||
if (!current || !current.start_date) {
|
|
||||||
return (
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">No Skills Training</div>
|
|
||||||
</div >
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const skill = await getSkill(current.skill_id);
|
|
||||||
const percentage = calculateTrainingPercentage(current) * 100;
|
|
||||||
return (
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">Currently Training</div>
|
|
||||||
<div class="stat-value">{(await getType(skill.type_id)).name.en} {current.finished_level}</div>
|
|
||||||
<div class="stat-desc"><progress class="progress progress-primary w-full" value={percentage} max="100"></progress></div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
SkillQueueStat.suspense = () => (
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">Currently Training</div>
|
|
||||||
<div class="flex w-52 flex-col gap-4">
|
|
||||||
<div class="skeleton h-16 w-full"></div>
|
|
||||||
<div class="skeleton h-4 w-full"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import { renderComponent } from 'brisa/server';
|
|
||||||
import { type Character } from '@star-kitten/eve/db';
|
|
||||||
import { CharacterAPI } from '@star-kitten/eve/esi';
|
|
||||||
import { formatNumberToShortForm } from '@star-kitten/util/text.js';
|
|
||||||
|
|
||||||
export default async function WalletStat({
|
|
||||||
character,
|
|
||||||
}: {
|
|
||||||
character: Character;
|
|
||||||
}) {
|
|
||||||
|
|
||||||
const balance = await CharacterAPI.getCharacterWallet(character) || 0;
|
|
||||||
const journal = await CharacterAPI.getCharacterWalletJournal(character, 1);
|
|
||||||
// get earliest transaction today from list of journal transactionsbun d
|
|
||||||
const earliestTransaction = journal?.filter((transaction) => {
|
|
||||||
const date = new Date(transaction.date!);
|
|
||||||
return date.getDate() === new Date().getDate();
|
|
||||||
}).sort((a, b) => new Date(a.date!).getTime() - new Date(b.date!).getTime())[0];
|
|
||||||
|
|
||||||
const balanceChange = balance - (earliestTransaction?.balance || balance);
|
|
||||||
const balanceChangePercentage = (balanceChange / (earliestTransaction?.balance || balance)) * 100;
|
|
||||||
const balanceChangeDirection = balanceChange > 0 ? '↗︎' : '↘︎';
|
|
||||||
const balanceChangeText = `${balanceChangeDirection} ${formatNumberToShortForm(Math.abs(balanceChange))} (${Math.abs(Number(balanceChangePercentage.toFixed(2)))}%)`;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">Wallet</div>
|
|
||||||
<div class="stat-value">{formatNumberToShortForm(balance)} ISK</div>
|
|
||||||
<div class="stat-desc">{balanceChangeText}</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
WalletStat.suspense = () => (
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">Wallet</div>
|
|
||||||
<div class="flex w-52 flex-col gap-4">
|
|
||||||
<div class="skeleton h-16 w-full"></div>
|
|
||||||
<div class="skeleton h-4 w-full"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import Nav from '@/components/navigation';
|
|
||||||
import Footer from '@/components/footer';
|
|
||||||
|
|
||||||
import '@/styles/style.css';
|
|
||||||
import '@/styles/nav.css';
|
|
||||||
import '@/styles/footer.css';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { UserHelper } from '@star-kitten/eve/db';
|
|
||||||
import { getCookies } from '@/utils';
|
|
||||||
|
|
||||||
export default function Layout({ children }: { children: JSX.Element }, request: RequestContext) {
|
|
||||||
// const cookies = getCookies(request.headers);
|
|
||||||
// const userId = cookies.currentUser;
|
|
||||||
// if (!userId) {
|
|
||||||
// throw new Error('No user found');
|
|
||||||
// }
|
|
||||||
// const user = User.find(Number(userId));
|
|
||||||
|
|
||||||
const user = UserHelper.find(1);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<html lang="en" data-theme="dark">
|
|
||||||
<head>
|
|
||||||
<title id="title">Brisa</title>
|
|
||||||
<meta name="theme-color" content="#ad1457" />
|
|
||||||
<link rel="shortcut icon" href="/brisa.svg" />
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
||||||
<link
|
|
||||||
rel="preconnect"
|
|
||||||
href="https://fonts.gstatic.com"
|
|
||||||
crossorigin="true"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
href="https://fonts.googleapis.com/css2?family=Permanent+Marker&display=swap"
|
|
||||||
rel="stylesheet"
|
|
||||||
/>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<Nav user={user} />
|
|
||||||
</header>
|
|
||||||
<main>{children}</main>
|
|
||||||
{/* <Footer /> */}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import {
|
|
||||||
createAuthorizationURL as eveAuthURL,
|
|
||||||
validateAuthorizationCode,
|
|
||||||
validateToken,
|
|
||||||
type EveTokens,
|
|
||||||
} from '@star-kitten/eve/esi';
|
|
||||||
import { getCookies, removeCookie, setCookie } from '@/utils/cookies';
|
|
||||||
import { OAuth2RequestError } from 'oslo/oauth2';
|
|
||||||
import { options } from '@star-kitten/eve/esi';
|
|
||||||
|
|
||||||
export type EVEAuth = {
|
|
||||||
validateToken: typeof validateToken;
|
|
||||||
validateAuthorizationCode: (code: string) => Promise<EveTokens>;
|
|
||||||
validate: (response: Response) => Promise<EveTokens>;
|
|
||||||
redirect: (scopes?: string) => Promise<Response>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async function middleware(req: RequestContext) {
|
|
||||||
|
|
||||||
req.store.set('options', options);
|
|
||||||
|
|
||||||
const redirect = async (scopes?: string): Promise<Response> => {
|
|
||||||
const { url, state } = await eveAuthURL(scopes);
|
|
||||||
const response = new Response('', { status: 302 });
|
|
||||||
setCookie(response, 'state', state, 60 * 10 /* 10 min */);
|
|
||||||
response.headers.set('location', url.href);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
const eveauth: EVEAuth = {
|
|
||||||
validateAuthorizationCode: (code: string) => {
|
|
||||||
try {
|
|
||||||
return validateAuthorizationCode(code);
|
|
||||||
} catch (error) {
|
|
||||||
throw new OAuth2RequestError(req, {
|
|
||||||
error: `Failed to authenticate with EVE Online ${error}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
validateToken,
|
|
||||||
|
|
||||||
validate: async (response: Response) => {
|
|
||||||
const query = new URL(req.url).searchParams;
|
|
||||||
const code = query.get('code');
|
|
||||||
if (!code) {
|
|
||||||
throw Error(`code missing from query parameters, there may be an error with the OAuth provider`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const cookies = getCookies(req.headers);
|
|
||||||
|
|
||||||
if (cookies['state'] !== query.get('state')) throw Error('invalid state');
|
|
||||||
removeCookie(response, 'state');
|
|
||||||
|
|
||||||
try {
|
|
||||||
const tokens = await validateAuthorizationCode(code);
|
|
||||||
const decoded = await validateToken(tokens.access_token);
|
|
||||||
if (!decoded) throw 'Invalid Token';
|
|
||||||
return tokens;
|
|
||||||
} catch (error) {
|
|
||||||
throw new OAuth2RequestError(req, {
|
|
||||||
error: `Failed to authenticate with EVE Online ${error}`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
redirect,
|
|
||||||
}
|
|
||||||
|
|
||||||
req.store.set('eveauth', eveauth);
|
|
||||||
|
|
||||||
// -----------------------------------------
|
|
||||||
|
|
||||||
// Route Authorization
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
export function Head() {
|
|
||||||
return <title id="title">About Brisa</title>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function About() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div class="hero">
|
|
||||||
<h1>
|
|
||||||
<span class="h1_addition">About </span>Brisa
|
|
||||||
</h1>
|
|
||||||
<p class="edit-note">✏️ Change this page on </p>
|
|
||||||
<code>src/pages/about/index.tsx</code>
|
|
||||||
</div>
|
|
||||||
<div class="about-sections">
|
|
||||||
<section>
|
|
||||||
<h2>Curious for more details? Let's dive in!</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Brisa is the Web Platform Framework. Its pages are dynamically
|
|
||||||
server-rendered JSX components, so there's zero JavaScript shipped
|
|
||||||
to the browser by default.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Everything runs exclusively on the server by default, except the Web
|
|
||||||
Components folder which, of course, also runs on the client.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We have solved the burden of writing and processing Web Components.
|
|
||||||
Easy to write with Signals, Server-Side rendering, and optimized in
|
|
||||||
build time to be fast and small; if you use Web Components, it adds
|
|
||||||
+3KB.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
You can also use the Brisa compiler to create libraries of Web
|
|
||||||
Components that work in any framework- or even without a framework,
|
|
||||||
and they are supported by Server-Side rendering.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We have also solved the Server Actions. With Brisa, the server
|
|
||||||
components can capture any browser event: onSubmit, onInput,
|
|
||||||
onFocus, onClick, and, all events from Web Components, like
|
|
||||||
onClickOnMyComponent. These are all Server-Actions now, so you don't
|
|
||||||
need to put "use client" nor "use server" any more. On the server
|
|
||||||
they are simply Server-Actions, and on the client they are simply
|
|
||||||
browser-events.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To make this possible we have improved the communication between
|
|
||||||
both worlds, creating new concepts like "Action Signals". With
|
|
||||||
these, the server can react to Web Components without the need for
|
|
||||||
rerenders. We have also added ideas from HTMX; you have extra
|
|
||||||
attributes in the HTML for debouncing or managing errors and pending
|
|
||||||
states.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>Brisa not only uses Hypermedia, it streams it over the wire.</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Brisa is also the only framework with full Internationalization
|
|
||||||
support. not only routing, but you can also translate your pages and
|
|
||||||
the URL pathnames if you need it. If you use i18n, the server
|
|
||||||
components are 0 Bytes, but in Web Components are 800 B. At the end
|
|
||||||
we use the Web Platform; we make a bridge with the ECMAScript Intl
|
|
||||||
API to make it easier for you to translate your Web Components.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In Brisa we like the idea that all the tooling is integrated, that's
|
|
||||||
why Brisa is made with Bun we have extended the Matchers and added
|
|
||||||
an API so you can run with Bun the tests of your Components.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Bun is great and improves the development experience a lot. Although
|
|
||||||
we recommend Bun.js also as runtime, as output you can use Node.js
|
|
||||||
or Deno if you want, generate a static output and upload it to a
|
|
||||||
CDN, or generate an executable app for Android (.apk), iOS (.ipa),
|
|
||||||
Windows (.exe), Mac (.dmg), or Linux (.deb). Yes, Brisa is
|
|
||||||
multiplatform thanks to its integration with Tauri.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We support Partial Prerendering, you can prerender only a part of
|
|
||||||
your page, such as the footer.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
We also support many more features like middleware, layouts,
|
|
||||||
WebSockets, API routes, suspense, etc.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Brisa is the future of the Web, and the future is now. We invite you
|
|
||||||
to try it and contribute to the community.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="CTA-text">
|
|
||||||
Ready to start?{' '}
|
|
||||||
<a
|
|
||||||
class="CTA"
|
|
||||||
href="https://brisa.build"
|
|
||||||
target="_blank"
|
|
||||||
data-replace="Read the docs"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
<span>Read the docs</span>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
|
|
||||||
export default function Error() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
EVE auth failed, close this tab and try again.
|
|
||||||
</h1>
|
|
||||||
<p>If this issue persists reach out to an Administrator.</p>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
|
|
||||||
export default function Success() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div class="hero">
|
|
||||||
<h1>
|
|
||||||
EVE auth success, you may close this browser tab.
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { render } from 'brisa/test';
|
|
||||||
import { describe, expect, it } from 'bun:test';
|
|
||||||
import Home from '.';
|
|
||||||
|
|
||||||
describe('Index', () => {
|
|
||||||
it('should render "Welcome to Brisa"', async () => {
|
|
||||||
const { container } = await render(<Home />);
|
|
||||||
|
|
||||||
expect(container).toContainTextContent('Welcome to Brisa');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
import { getCookies } from '@/utils';
|
|
||||||
import type { RequestContext } from 'brisa';
|
|
||||||
import { CharacterHelper, UserHelper } from '@star-kitten/eve/db';
|
|
||||||
import SkillQueueStat from '@/components/stats/skill-queue';
|
|
||||||
import WalletStat from '@/components/stats/wallet';
|
|
||||||
|
|
||||||
export default function Homepage(props: any, request: RequestContext) {
|
|
||||||
|
|
||||||
// const cookies = getCookies(request.headers);
|
|
||||||
// const userId = cookies.currentUser;
|
|
||||||
// if (!userId) {
|
|
||||||
// throw new Error('No user found');
|
|
||||||
// }
|
|
||||||
|
|
||||||
const user = UserHelper.find(1);
|
|
||||||
const character = user.mainCharacterID && CharacterHelper.find(user.mainCharacterID);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div class="bg-gray-900 py-24 sm:py-32">
|
|
||||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
|
||||||
<div class="mx-auto max-w-2xl lg:max-w-none">
|
|
||||||
<div class="stats shadow">
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
class="inline-block h-8 w-8 stroke-current">
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">Characters</div>
|
|
||||||
<div class="stat-value">{user.characterIDs.length}</div>
|
|
||||||
<div class="stat-desc">Jan 1st - Feb 1st</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{character && <SkillQueueStat character={character} />}
|
|
||||||
{character && <WalletStat character={character} />}
|
|
||||||
|
|
||||||
<div class="stat">
|
|
||||||
<div class="stat-figure text-secondary">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
class="inline-block h-8 w-8 stroke-current">
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"></path>
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
<div class="stat-title">New Registers</div>
|
|
||||||
<div class="stat-value">1,200</div>
|
|
||||||
<div class="stat-desc">↘︎ 90 (14%)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<svg width="100%" height="100%" viewBox="0 0 200 199" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
||||||
<g transform="matrix(1,0,0,1,-1.46627e-05,-0.862671)">
|
|
||||||
<path d="M124.615,158.942C194.326,134.262 190.916,42.893 140.767,0.863C184.318,20.349 206.756,72.952 198.203,118.905C191.512,154.854 164.558,184.522 129.69,194.524C111.34,199.788 91.695,200.819 73.085,196.201C36.436,187.108 7.653,155.954 1.303,118.778C-3.783,88.998 6.075,58.343 29.922,38.996C54.808,18.806 92.107,14.056 119.324,32.517C146.142,50.708 155.776,89.452 135.231,116.111C124.748,129.714 107.413,137.633 90.191,135.012C72.184,132.272 58.17,116.038 60.606,97.494C63.655,121.563 92.134,130.674 109.243,113.883C125.024,98.394 116.512,74.337 100.517,62.603C87.184,52.821 68.389,55.268 55.26,64.22C39.06,75.266 32.739,94.717 36.289,113.574C44.063,154.866 87.626,172.037 124.615,158.942L124.615,158.942Z" style="fill:url(#_Radial1);"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<radialGradient id="_Radial1" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(52.186,-99.1373,99.1373,52.186,88.8208,100)"><stop offset="0" style="stop-color:rgb(44,240,204);stop-opacity:1"/><stop offset="0.53" style="stop-color:rgb(44,230,209);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(44,195,228);stop-opacity:1"/></radialGradient>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,8 +0,0 @@
|
|||||||
footer {
|
|
||||||
display: grid;
|
|
||||||
font-family: "Poppins", sans-serif;
|
|
||||||
font-size: 27px;
|
|
||||||
line-height: 1.5;
|
|
||||||
height: 15vh;
|
|
||||||
place-items: center;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/* Navigation Styles */
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
@import "tailwindcss";
|
|
||||||
@plugin "daisyui" {
|
|
||||||
themes: dark --default --prefersdark, dim;
|
|
||||||
};
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
|
|
||||||
export function getCookies(headers: Headers) {
|
|
||||||
if (!headers) return {};
|
|
||||||
const cookieHeader = headers.get("Cookie");
|
|
||||||
const cookies: Record<string, string> = {};
|
|
||||||
|
|
||||||
if (cookieHeader === null) return {};
|
|
||||||
|
|
||||||
for (const kv of cookieHeader.split(";")) {
|
|
||||||
const [cookieKey, ...cookieVal] = kv.split("=");
|
|
||||||
const key = cookieKey.trim();
|
|
||||||
cookies[key] = cookieVal.join("=");
|
|
||||||
}
|
|
||||||
|
|
||||||
return cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setCookie(response: Response, key: string, value: string, maxAge?: number) {
|
|
||||||
response.headers.append('Set-Cookie', `${key}=${value}${maxAge ? '; Path=/; Max-Age=' + maxAge : ''}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function removeCookie(response: Response, key: string) {
|
|
||||||
response.headers.append('Set-Cookie', `${key}=""; Path=/; Max-Age=-1;`);
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export * from './cookies';
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import type { WebContext } from 'brisa';
|
|
||||||
|
|
||||||
export default function Counter(
|
|
||||||
{ initialValue = 0 }: { initialValue: number },
|
|
||||||
{ state }: WebContext,
|
|
||||||
) {
|
|
||||||
const count = state(initialValue);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div class="counter">
|
|
||||||
<div class="counter-container">
|
|
||||||
<h2>Client counter</h2>
|
|
||||||
<button class="increment-button" onClick={() => count.value++}></button>
|
|
||||||
<div class="counter-value">{count.value}</div>
|
|
||||||
<button class="decrement-button" onClick={() => count.value--}></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"include": [
|
|
||||||
"src"
|
|
||||||
],
|
|
||||||
"compilerOptions": {
|
|
||||||
"lib": [
|
|
||||||
"dom",
|
|
||||||
"dom.iterable",
|
|
||||||
"esnext"
|
|
||||||
],
|
|
||||||
"module": "esnext",
|
|
||||||
"target": "esnext",
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"moduleDetection": "force",
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"composite": true,
|
|
||||||
"strict": true,
|
|
||||||
"downlevelIteration": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"jsx": "react-jsx",
|
|
||||||
"jsxImportSource": "brisa",
|
|
||||||
"allowSyntheticDefaultImports": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"allowJs": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"types": [
|
|
||||||
"brisa"
|
|
||||||
],
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
"paths": {
|
|
||||||
"@/*": [
|
|
||||||
"./src/*"
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
4
packages/eve/src/third-party/janice.ts
vendored
4
packages/eve/src/third-party/janice.ts
vendored
@@ -375,7 +375,7 @@ export const fetchAppraisal = async (code: string): Promise<Appraisal> => {
|
|||||||
* @returns Promise resolving to Appraisal
|
* @returns Promise resolving to Appraisal
|
||||||
* @throws Error if API call fails or validation fails
|
* @throws Error if API call fails or validation fails
|
||||||
*/
|
*/
|
||||||
export const appraiseItems = async (text: string, market_id: number = 2): Promise<Appraisal> => {
|
export const appraiseItems = async (text: string, market_id: number = 2, apiKey: string | undefined = process.env.JANICE_KEY): Promise<Appraisal> => {
|
||||||
if (!isNonEmptyString(text)) {
|
if (!isNonEmptyString(text)) {
|
||||||
throw new Error('Invalid text: must be a non-empty string');
|
throw new Error('Invalid text: must be a non-empty string');
|
||||||
}
|
}
|
||||||
@@ -388,7 +388,7 @@ export const appraiseItems = async (text: string, market_id: number = 2): Promis
|
|||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'text/plain',
|
'Content-Type': 'text/plain',
|
||||||
'X-ApiKey': process.env.JANICE_KEY || '',
|
'X-ApiKey': apiKey || '',
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
},
|
},
|
||||||
body: text,
|
body: text,
|
||||||
|
|||||||
@@ -1,25 +1,9 @@
|
|||||||
{
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"lib": ["ESNext", "DOM"],
|
"composite": true,
|
||||||
"target": "ESNext",
|
|
||||||
"module": "ESNext",
|
|
||||||
"moduleDetection": "force",
|
|
||||||
"jsx": "react-jsx",
|
|
||||||
"jsxImportSource": "@star-kitten/discord",
|
|
||||||
"allowJs": true,
|
|
||||||
"noImplicitAny": false,
|
|
||||||
"moduleResolution": "bundler",
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"noEmit": true,
|
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"skipLibCheck": true,
|
"lib": ["ESNext", "DOM"],
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noUnusedLocals": false,
|
|
||||||
"noUnusedParameters": false,
|
|
||||||
"noPropertyAccessFromIndexSignature": false,
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"emitDecoratorMetadata": true,
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"],
|
"@/*": ["./src/*"],
|
||||||
"@data/*": ["./data/*"]
|
"@data/*": ["./data/*"]
|
||||||
|
|||||||
2
packages/freight-web/.gitignore
vendored
Normal file
2
packages/freight-web/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
*.env
|
||||||
6
packages/freight-web/.prettierignore
Normal file
6
packages/freight-web/.prettierignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
coverage/
|
||||||
|
*.min.js
|
||||||
|
*.min.css
|
||||||
8
packages/freight-web/.prettierrc
Normal file
8
packages/freight-web/.prettierrc
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"useTabs": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"printWidth": 100,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"plugins": ["@ripple-ts/prettier-plugin"]
|
||||||
|
}
|
||||||
49
packages/freight-web/README.md
Normal file
49
packages/freight-web/README.md
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# Ripple Basic Template
|
||||||
|
|
||||||
|
A minimal Ripple application template with TypeScript and Vite.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
1. Install dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install # or pnpm or yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Start the development server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Build for production:
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Formatting
|
||||||
|
|
||||||
|
This template includes Prettier with the Ripple plugin for consistent code formatting.
|
||||||
|
|
||||||
|
### Available Commands
|
||||||
|
|
||||||
|
- `npm run format` - Format all files
|
||||||
|
- `npm run format:check` - Check if files are formatted correctly
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Prettier is configured in `.prettierrc` with the following settings:
|
||||||
|
|
||||||
|
- Uses tabs for indentation
|
||||||
|
- Single quotes for strings
|
||||||
|
- 100 character line width
|
||||||
|
- Includes the `@ripple-ts/prettier-plugin` for `.ripple` file formatting
|
||||||
|
|
||||||
|
### VS Code Integration
|
||||||
|
|
||||||
|
For the best development experience, install the [Prettier VS Code extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) and the [Ripple VS Code extension](https://marketplace.visualstudio.com/items?itemName=ripple-ts.vscode-plugin).
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
- [Ripple Documentation](https://github.com/Ripple-TS/ripple)
|
||||||
|
- [Vite Documentation](https://vitejs.dev/)
|
||||||
3
packages/freight-web/eslint.config.js
Normal file
3
packages/freight-web/eslint.config.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import ripple from '@ripple-ts/eslint-plugin';
|
||||||
|
|
||||||
|
export default [...ripple.configs.recommended];
|
||||||
36
packages/freight-web/index.html
Normal file
36
packages/freight-web/index.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<link rel="shortcut icon" type="image/ico" href="/src/assets/favicon.ico" />
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/beercss@3.12.13/dist/cdn/beer.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<script
|
||||||
|
type="module"
|
||||||
|
src="https://cdn.jsdelivr.net/npm/beercss@3.12.13/dist/cdn/beer.min.js"
|
||||||
|
></script>
|
||||||
|
<!-- <script
|
||||||
|
type="module"
|
||||||
|
src="https://cdn.jsdelivr.net/npm/material-dynamic-colors@1.1.2/dist/cdn/material-dynamic-colors.min.js"
|
||||||
|
></script> -->
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
type="text/css"
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.1/src/regular/style.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
type="text/css"
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.1/src/fill/style.css"
|
||||||
|
/>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/src/assets/global.css" />
|
||||||
|
<title>Ripple App</title>
|
||||||
|
</head>
|
||||||
|
<body id="root">
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<script src="/src/index.ts" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
packages/freight-web/package.json
Normal file
35
packages/freight-web/package.json
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "freight-web",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A Ripple application created with create-ripple",
|
||||||
|
"type": "module",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.0.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"start": "vite",
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"serve": "vite preview",
|
||||||
|
"format": "prettier --write .",
|
||||||
|
"format:check": "prettier --check ."
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "^9.0.0",
|
||||||
|
"@ripple-ts/eslint-plugin": "latest",
|
||||||
|
"prettier": "^3.6.2",
|
||||||
|
"@ripple-ts/prettier-plugin": "latest",
|
||||||
|
"typescript": "^5.9.2",
|
||||||
|
"vite": "^7.1.4",
|
||||||
|
"@ripple-ts/vite-plugin": "latest",
|
||||||
|
"@ripple-ts/typescript-plugin": "latest"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"lucide-ripple": "^0.0.6",
|
||||||
|
"ripple": "latest",
|
||||||
|
"vite-tsconfig-paths": "^5.1.4",
|
||||||
|
"@star-kitten/eve": "workspace:^0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
29
packages/freight-web/src/App.ripple
Normal file
29
packages/freight-web/src/App.ripple
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { track } from 'ripple';
|
||||||
|
import { Quoute } from './components/calculator/Quoute.ripple';
|
||||||
|
import { Header } from './components/Header.ripple';
|
||||||
|
import { Footer } from './components/Footer.ripple';
|
||||||
|
|
||||||
|
export component App() {
|
||||||
|
<Header />
|
||||||
|
<main class="responsive">
|
||||||
|
<div class="grid">
|
||||||
|
<div class="s8">
|
||||||
|
<Quoute />
|
||||||
|
</div>
|
||||||
|
<div class="s4">
|
||||||
|
<article class="border medium no-padding center-align middle-align">
|
||||||
|
<div class="padding">
|
||||||
|
<h5>{'Placeholder Contract Info'}</h5>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<Footer />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
main.responsive {
|
||||||
|
max-inline-size: min(150vw, 100rem);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
}
|
||||||
BIN
packages/freight-web/src/assets/favicon.ico
Normal file
BIN
packages/freight-web/src/assets/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
39
packages/freight-web/src/assets/global.css
Normal file
39
packages/freight-web/src/assets/global.css
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
:root,
|
||||||
|
body.dark {
|
||||||
|
--primary: #78dc77;
|
||||||
|
--on-primary: #00390a;
|
||||||
|
--primary-container: #005313;
|
||||||
|
--on-primary-container: #94f990;
|
||||||
|
--secondary: #baccb3;
|
||||||
|
--on-secondary: #253423;
|
||||||
|
--secondary-container: #3b4b38;
|
||||||
|
--on-secondary-container: #d5e8cf;
|
||||||
|
--tertiary: #a0cfd4;
|
||||||
|
--on-tertiary: #00363b;
|
||||||
|
--tertiary-container: #1f4d52;
|
||||||
|
--on-tertiary-container: #bcebf0;
|
||||||
|
--error: #ffb4ab;
|
||||||
|
--on-error: #690005;
|
||||||
|
--error-container: #93000a;
|
||||||
|
--on-error-container: #ffb4ab;
|
||||||
|
--background: #1a1c19;
|
||||||
|
--on-background: #e2e3dd;
|
||||||
|
--surface: #121411;
|
||||||
|
--on-surface: #e2e3dd;
|
||||||
|
--surface-variant: #424940;
|
||||||
|
--on-surface-variant: #c2c9bd;
|
||||||
|
--outline: #8c9388;
|
||||||
|
--outline-variant: #424940;
|
||||||
|
--shadow: #000000;
|
||||||
|
--scrim: #000000;
|
||||||
|
--inverse-surface: #e2e3dd;
|
||||||
|
--inverse-on-surface: #2f312d;
|
||||||
|
--inverse-primary: #006e1c;
|
||||||
|
--surface-dim: #121411;
|
||||||
|
--surface-bright: #383a36;
|
||||||
|
--surface-container-lowest: #0c0f0c;
|
||||||
|
--surface-container-low: #1a1c19;
|
||||||
|
--surface-container: #1e201d;
|
||||||
|
--surface-container-high: #282b27;
|
||||||
|
--surface-container-highest: #333531;
|
||||||
|
}
|
||||||
BIN
packages/freight-web/src/assets/ripple-logo-horizontal.png
Normal file
BIN
packages/freight-web/src/assets/ripple-logo-horizontal.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
5
packages/freight-web/src/components/Footer.ripple
Normal file
5
packages/freight-web/src/components/Footer.ripple
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export component Footer() {
|
||||||
|
<footer>
|
||||||
|
<p>{'© 2025 Asgard Logistics'}</p>
|
||||||
|
</footer>
|
||||||
|
}
|
||||||
12
packages/freight-web/src/components/Header.ripple
Normal file
12
packages/freight-web/src/components/Header.ripple
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
export component Header() {
|
||||||
|
<header class="secondary-container">
|
||||||
|
<nav>
|
||||||
|
<button class="circle transparent">
|
||||||
|
<i>{'rocket_launch'}</i>
|
||||||
|
</button>
|
||||||
|
<h3 class="max left-align">{'Asgard Logistics'}</h3>
|
||||||
|
<a href="#" class="active">{'Freight Calculator'}</a>
|
||||||
|
<a href="#">{'View Rates'}</a>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
}
|
||||||
126
packages/freight-web/src/components/calculator/Quoute.ripple
Normal file
126
packages/freight-web/src/components/calculator/Quoute.ripple
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
import { track, effect } from 'ripple';
|
||||||
|
import { Icon } from '../core/Icon.ripple';
|
||||||
|
import { RouteSelect } from './RouteSelect.ripple';
|
||||||
|
import { formatNumber } from '../../lib/utils';
|
||||||
|
import { fetchRoutes, type Route } from '../../lib/route';
|
||||||
|
import { RouteDetails } from './RouteDetals.ripple';
|
||||||
|
import { janice } from '@star-kitten/eve/third-party';
|
||||||
|
|
||||||
|
export component Quoute() {
|
||||||
|
const routes = #[] as TrackedArray<Route>;
|
||||||
|
let rush = track(false);
|
||||||
|
let cargo = track('');
|
||||||
|
|
||||||
|
effect(async () => {
|
||||||
|
const fetchedRoutes = await fetchRoutes();
|
||||||
|
routes.push(...fetchedRoutes);
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedRouteId = track(-1);
|
||||||
|
const selectedRoute = track(() => {
|
||||||
|
return routes.find((r) => r.id === @selectedRouteId);
|
||||||
|
});
|
||||||
|
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<h4>
|
||||||
|
<i>{'calculate'}</i>
|
||||||
|
{' Freight Calculator'}
|
||||||
|
</h4>
|
||||||
|
</header>
|
||||||
|
<section>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'1. Select a route'}</legend>
|
||||||
|
<RouteSelect {@routes} onChange={(id) => (@selectedRouteId = id)} />
|
||||||
|
if (@selectedRoute) {
|
||||||
|
<RouteDetails route={@selectedRoute} />
|
||||||
|
}
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'2. Add cargo'}</legend>
|
||||||
|
<div class="field border label textarea extra">
|
||||||
|
<textarea onChange={(e) => (@cargo = (e.target as HTMLTextArea).value)} />
|
||||||
|
<label>
|
||||||
|
{`Paste your cargo here... (one item per line, e.g. Tritanium 10000)`}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'3. Apply adjustments (optional)'}</legend>
|
||||||
|
<div class="field middle-align">
|
||||||
|
<nav>
|
||||||
|
<div class="max">
|
||||||
|
<h6>{'Add Rush Shipping'}</h6>
|
||||||
|
<span class="helper">
|
||||||
|
{'Guaranteed delivery within 24 hours or the entire contract is free!'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<label class="switch">
|
||||||
|
<input type="checkbox" onChange={(e) => (@rush = !@rush)} />
|
||||||
|
<span />
|
||||||
|
</label>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field suffix">
|
||||||
|
<input type="number" min="1" placeholder="Additional Volume (m³)" />
|
||||||
|
<Icon name="cube" />
|
||||||
|
<span class="helper">
|
||||||
|
{'In addition to the calculated volume from your cargo.'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="field suffix">
|
||||||
|
<input type="number" min="0" placeholder="Additional Collateral (ISK)" />
|
||||||
|
<i>{'currency_exchange'}</i>
|
||||||
|
<span class="helper">
|
||||||
|
{'In addition to the calculated value of your cargo.'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<button class="circle small">
|
||||||
|
<i>{'done'}</i>
|
||||||
|
</button>
|
||||||
|
<div>{'Select a route'}</div>
|
||||||
|
<hr class="max" />
|
||||||
|
<button class="circle small">{'2'}</button>
|
||||||
|
<div>{'Add cargo'}</div>
|
||||||
|
<hr class="max" />
|
||||||
|
<button class="circle small" disabled>{'3'}</button>
|
||||||
|
<div>{'Apply adjustments'}</div>
|
||||||
|
<hr class="max" />
|
||||||
|
<button class="circle small" disabled>{'4'}</button>
|
||||||
|
<div>{'Calculate'}</div>
|
||||||
|
</nav>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
// Calculate quote logic goes here
|
||||||
|
<button
|
||||||
|
class="responsive large-elevate extra"
|
||||||
|
onClick={async () => {
|
||||||
|
console.log('Calculating quote...');
|
||||||
|
console.log('Selected Route ID:', @selectedRouteId);
|
||||||
|
console.log('Rush Shipping:', @rush);
|
||||||
|
console.log('Cargo:', @cargo);
|
||||||
|
const appraisal = await janice.appraiseItems(
|
||||||
|
@cargo,
|
||||||
|
2,
|
||||||
|
'DUyi5Q3Dod48IoswUBkEfNRs8Qf3cwNN',
|
||||||
|
);
|
||||||
|
console.log('Appraised Cargo:', appraisal);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{'Calculate Quote'}
|
||||||
|
</button>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
pre {
|
||||||
|
color: var(--secondary);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import type { Route } from '../../lib/route';
|
||||||
|
import { formatNumber } from '../../lib/utils';
|
||||||
|
|
||||||
|
export component RouteDetails({ route }: { route: Route }) {
|
||||||
|
<div class="s12">
|
||||||
|
<fieldset>
|
||||||
|
<legend>
|
||||||
|
{'Route Details'}
|
||||||
|
</legend>
|
||||||
|
<div class="grid">
|
||||||
|
<div class="s4">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Max Volume'}</legend>
|
||||||
|
<h6>{formatNumber(route.max_volume)}</h6>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="s4">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Min Volume'}</legend>
|
||||||
|
<h6>{formatNumber(route.min_volume || 0)}</h6>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="s4">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Restrictions'}</legend>
|
||||||
|
{'No Assembled Ships or Containers'}
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="s6">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Base Price'}</legend>
|
||||||
|
<h6>{(route.isk_m3 ? formatNumber(route.isk_m3 || 0) + ' ISK/m³ + ' : route.isk_flatrate + ' ISK flatrate + ') + formatNumber(route.collat_pct) + '% of total collateral'}</h6>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="s6">
|
||||||
|
<fieldset>
|
||||||
|
<legend>
|
||||||
|
{'Rush Fee '}
|
||||||
|
<i>{'warning'}</i>
|
||||||
|
<div class="tooltip top">{'Guaranteed delivery in 24 hours or your money back'}</div>
|
||||||
|
</legend>
|
||||||
|
<h6>{'+' + (route.rush_pct ? formatNumber(route.rush_pct) + '%' : route.rush_fee + ' ISK')}</h6>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import { track, type TrackedArray } from 'ripple';
|
||||||
|
import { Selector } from './Selector.ripple';
|
||||||
|
import type { Route } from '../../lib/route';
|
||||||
|
import { formatNumber } from '../../lib/utils';
|
||||||
|
|
||||||
|
export interface RouteSelectProps {
|
||||||
|
routes: TrackedArray<Route>;
|
||||||
|
onChange?: (id: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export component RouteSelect({ routes, onChange }: RouteSelectProps) {
|
||||||
|
let typeTab = track('JF');
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<nav class="tabbed small">
|
||||||
|
<a class={'JF' === @typeTab ? 'active' : ''} onClick={() => {
|
||||||
|
@typeTab = 'JF';
|
||||||
|
onChange?.('');
|
||||||
|
}}>
|
||||||
|
<i>{'rocket'}</i>
|
||||||
|
<span>{'Jump Freighter'}</span>
|
||||||
|
</a>
|
||||||
|
<a class={'DST' === @typeTab ? 'active' : ''} onClick={() => {
|
||||||
|
@typeTab = 'DST';
|
||||||
|
onChange?.('');
|
||||||
|
}}>
|
||||||
|
<i>{'pallet'}</i>
|
||||||
|
<span>{'Deep Space Transport'}</span>
|
||||||
|
</a>
|
||||||
|
<a class={'BR' === @typeTab ? 'active' : ''} onClick={() => {
|
||||||
|
@typeTab = 'BR';
|
||||||
|
onChange?.('');
|
||||||
|
}}>
|
||||||
|
<i>{'visibility_off'}</i>
|
||||||
|
<span>{'Blockade Runner'}</span>
|
||||||
|
</a>
|
||||||
|
</nav>
|
||||||
|
<div class={'page padding' + ('JF' === @typeTab ? ' active' : '')}>
|
||||||
|
<Selector
|
||||||
|
routes={@routes.filter((r) => r.route_type === 'JF')}
|
||||||
|
onChange={(routeId: string) => {
|
||||||
|
onChange?.(routeId);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class={'page padding' + ('DST' === @typeTab ? ' active' : '')}>
|
||||||
|
<Selector
|
||||||
|
routes={@routes.filter((r) => r.route_type === 'DST')}
|
||||||
|
onChange={(routeId: string) => {
|
||||||
|
onChange?.(routeId);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class={'page padding' + ('BR' === @typeTab ? ' active' : '')}>
|
||||||
|
<Selector
|
||||||
|
routes={@routes.filter((r) => r.route_type === 'BR')}
|
||||||
|
onChange={(routeId: string) => {
|
||||||
|
onChange?.(routeId);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import { track, type TrackedArray } from 'ripple';
|
||||||
|
import type { Route } from '../../lib/route';
|
||||||
|
import { formatNumber } from '../../lib/utils';
|
||||||
|
|
||||||
|
export interface OriginDestProps {
|
||||||
|
routes: TrackedArray<Route>;
|
||||||
|
onChange?: (routeId: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export component Selector({ routes, onChange }: OriginDestProps) {
|
||||||
|
const selectedRoute = track<Route>(undefined);
|
||||||
|
let origin = track('');
|
||||||
|
|
||||||
|
const origins = track(() => {
|
||||||
|
const uniqueOrigins = new Set<string>();
|
||||||
|
for (const route of routes) {
|
||||||
|
uniqueOrigins.add(route.origin);
|
||||||
|
}
|
||||||
|
return Array.from(uniqueOrigins);
|
||||||
|
});
|
||||||
|
|
||||||
|
<div class="grid">
|
||||||
|
<div class="s6">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Origin'}</legend>
|
||||||
|
<div class="field suffix border">
|
||||||
|
<select
|
||||||
|
onChange={(e) => {
|
||||||
|
@origin = (e.target as HTMLSelectElement).value;
|
||||||
|
@selectedRoute = undefined;
|
||||||
|
onChange?.('');
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<option value="">{'Select origin'}</option>
|
||||||
|
for (const text of @origins) {
|
||||||
|
<option value={text}>{text}</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
<i>{'arrow_drop_down'}</i>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
<div class="s6">
|
||||||
|
<fieldset>
|
||||||
|
<legend>{'Destination'}</legend>
|
||||||
|
<div class="field suffix border">
|
||||||
|
<select
|
||||||
|
onChange={(e) => {
|
||||||
|
const id = (e.target as HTMLSelectElement).value;
|
||||||
|
@selectedRoute = @routes.find((r: Route) => r.id === id);
|
||||||
|
onChange?.(id);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<option value="">{'Select a route'}</option>
|
||||||
|
for (const route of @routes) {
|
||||||
|
const rt = route as Route;
|
||||||
|
if (rt.origin === @origin) {
|
||||||
|
<option value={rt.id}>{rt.destination}</option>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
<i>{'arrow_drop_down'}</i>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.field {
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
}
|
||||||
|
|
||||||
8
packages/freight-web/src/components/core/Icon.ripple
Normal file
8
packages/freight-web/src/components/core/Icon.ripple
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export interface IconProps {
|
||||||
|
name: string;
|
||||||
|
style?: Record<string, string | number>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export component Icon({ name, style }: IconProps) {
|
||||||
|
<i class={`ph ph-${name}`} {style} />
|
||||||
|
}
|
||||||
7
packages/freight-web/src/index.ts
Normal file
7
packages/freight-web/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { mount } from 'ripple';
|
||||||
|
// @ts-expect-error: known issue, we're working on it
|
||||||
|
import { App } from './App.ripple';
|
||||||
|
|
||||||
|
mount(App, {
|
||||||
|
target: document.getElementById('root'),
|
||||||
|
});
|
||||||
38
packages/freight-web/src/lib/route.ts
Normal file
38
packages/freight-web/src/lib/route.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
export interface Route {
|
||||||
|
id: string;
|
||||||
|
route_type: 'JF' | 'DST' | 'BR';
|
||||||
|
origin: string;
|
||||||
|
origin_type: string;
|
||||||
|
destination: string;
|
||||||
|
detination_type: string;
|
||||||
|
max_volume: number;
|
||||||
|
max_collat: string;
|
||||||
|
collat_pct: number;
|
||||||
|
isk_m3?: number;
|
||||||
|
isk_flatrate?: string;
|
||||||
|
min_volume?: number;
|
||||||
|
rush_pct?: number;
|
||||||
|
rush_fee?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchRoutes(): Promise<Route[]> {
|
||||||
|
const response = await fetch(
|
||||||
|
'https://docs.google.com/spreadsheets/d/e/2PACX-1vSuUV7yKNkgSFFLz2LSUqD4WRQ71usoRuYUMKL00HsJHz52VfgFAIkE8w2DG59V93kCkEKFlqFux-OI/pub?gid=0&single=true&output=csv'
|
||||||
|
);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to fetch routes: ${response.status} ${response.statusText}`);
|
||||||
|
}
|
||||||
|
const text = await response.text();
|
||||||
|
const lines = text.trim().split('\n');
|
||||||
|
const routes: Route[] = [];
|
||||||
|
const headers = lines[0].split(',').map((h) => h.trim());
|
||||||
|
for (let i = 1; i < lines.length; i++) {
|
||||||
|
const values = lines[i].split(',').map((v) => v.trim());
|
||||||
|
const row: any = {};
|
||||||
|
for (let j = 0; j < headers.length; j++) {
|
||||||
|
row[headers[j]] = values[j];
|
||||||
|
}
|
||||||
|
routes.push(row);
|
||||||
|
}
|
||||||
|
return routes;
|
||||||
|
}
|
||||||
3
packages/freight-web/src/lib/utils.ts
Normal file
3
packages/freight-web/src/lib/utils.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export function formatNumber(num: number): string {
|
||||||
|
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
||||||
|
}
|
||||||
18
packages/freight-web/tsconfig.json
Normal file
18
packages/freight-web/tsconfig.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ESNext",
|
||||||
|
"module": "ESNext",
|
||||||
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"jsx": "preserve",
|
||||||
|
"jsxImportSource": "ripple",
|
||||||
|
"noEmit": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"plugins": [{ "name": "@ripple-ts/typescript-plugin" }],
|
||||||
|
"paths": {
|
||||||
|
"@*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
13
packages/freight-web/vite.config.js
Normal file
13
packages/freight-web/vite.config.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import { defineConfig } from 'vite';
|
||||||
|
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||||
|
import { ripple } from '@ripple-ts/vite-plugin';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [tsconfigPaths(), ripple()],
|
||||||
|
server: {
|
||||||
|
port: 3000,
|
||||||
|
},
|
||||||
|
build: {
|
||||||
|
target: 'esnext',
|
||||||
|
},
|
||||||
|
});
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user