mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2024-12-23 00:36:28 +00:00
Compare commits
No commits in common. "7c6ba654f6709b3e319e2307c0dc81e2bf88d9d4" and "868b49c1c3f1b285ed7b0a3dfa39625748696b62" have entirely different histories.
7c6ba654f6
...
868b49c1c3
@ -11,6 +11,9 @@
|
||||
},
|
||||
{
|
||||
"path": "packages/cli"
|
||||
},
|
||||
{
|
||||
"path": "packages/shared"
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
|
2
packages/backend/Cargo.lock
generated
2
packages/backend/Cargo.lock
generated
@ -261,7 +261,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cryptgeon"
|
||||
version = "2.8.1"
|
||||
version = "2.8.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"bs62",
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "cryptgeon"
|
||||
version = "2.8.1"
|
||||
version = "2.8.0"
|
||||
authors = ["cupcakearmy <hi@nicco.io>"]
|
||||
edition = "2021"
|
||||
rust-version = "1.80"
|
||||
|
@ -1,14 +1,13 @@
|
||||
import { build } from 'tsup'
|
||||
import pkg from './package.json' with { type: 'json' }
|
||||
import { build } from 'tsup'
|
||||
|
||||
const watch = process.argv.slice(2)[0] === '--watch'
|
||||
|
||||
await build({
|
||||
entry: ['src/index.ts', 'src/cli.ts', 'src/shared/shared.ts'],
|
||||
entry: ['src/index.ts', 'src/cli.ts'],
|
||||
dts: true,
|
||||
minify: true,
|
||||
format: ['esm', 'cjs'],
|
||||
target: 'es2020',
|
||||
clean: true,
|
||||
define: { VERSION: `"${pkg.version}"` },
|
||||
watch,
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cryptgeon",
|
||||
"version": "2.8.1",
|
||||
"version": "2.8.0",
|
||||
"homepage": "https://github.com/cupcakearmy/cryptgeon",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -9,11 +9,7 @@
|
||||
},
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": "./dist/index.js",
|
||||
"./shared": {
|
||||
"import": "./dist/shared/shared.js",
|
||||
"types": "./dist/shared/shared.d.ts"
|
||||
}
|
||||
".": "./dist/index.js"
|
||||
},
|
||||
"types": "./dist/index.d.ts",
|
||||
"bin": {
|
||||
@ -29,14 +25,15 @@
|
||||
"prepublishOnly": "run-s build"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commander-js/extra-typings": "^12.1.0",
|
||||
"@commander-js/extra-typings": "^12.0.1",
|
||||
"@cryptgeon/shared": "workspace:*",
|
||||
"@types/inquirer": "^9.0.7",
|
||||
"@types/mime": "^4.0.0",
|
||||
"@types/mime": "^3.0.4",
|
||||
"@types/node": "^20.11.24",
|
||||
"commander": "^12.1.0",
|
||||
"commander": "^12.0.0",
|
||||
"inquirer": "^9.2.15",
|
||||
"mime": "^4.0.1",
|
||||
"occulto": "^2.0.6",
|
||||
"occulto": "^2.0.3",
|
||||
"pretty-bytes": "^6.1.1",
|
||||
"tsup": "^8.2.4",
|
||||
"typescript": "^5.3.3"
|
||||
|
@ -1,14 +1,14 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { Argument, Option, program } from '@commander-js/extra-typings'
|
||||
import { setOptions, status } from '@cryptgeon/shared'
|
||||
import prettyBytes from 'pretty-bytes'
|
||||
|
||||
import { download } from './actions/download.js'
|
||||
import { upload } from './actions/upload.js'
|
||||
import { API } from './shared/api.js'
|
||||
import { parseFile, parseNumber } from './utils/parsers.js'
|
||||
import { getStdin } from './utils/stdin.js'
|
||||
import { checkConstrains, exit } from './utils/utils.js'
|
||||
import { download } from './download.js'
|
||||
import { parseFile, parseNumber } from './parsers.js'
|
||||
import { getStdin } from './stdin.js'
|
||||
import { upload } from './upload.js'
|
||||
import { checkConstrains, exit } from './utils.js'
|
||||
|
||||
const defaultServer = process.env['CRYPTGEON_SERVER'] || 'https://cryptgeon.org'
|
||||
const server = new Option('-s --server <url>', 'the cryptgeon server to use').default(defaultServer)
|
||||
@ -33,8 +33,8 @@ program
|
||||
.description('show information about the server')
|
||||
.addOption(server)
|
||||
.action(async (options) => {
|
||||
API.setOptions({ server: options.server })
|
||||
const response = await API.status()
|
||||
setOptions({ server: options.server })
|
||||
const response = await status()
|
||||
const formatted = {
|
||||
...response,
|
||||
max_size: prettyBytes(response.max_size),
|
||||
@ -54,7 +54,7 @@ send
|
||||
.addOption(minutes)
|
||||
.addOption(password)
|
||||
.action(async (files, options) => {
|
||||
API.setOptions({ server: options.server })
|
||||
setOptions({ server: options.server })
|
||||
await checkConstrains(options)
|
||||
options.password ||= await getStdin()
|
||||
try {
|
||||
@ -72,7 +72,7 @@ send
|
||||
.addOption(minutes)
|
||||
.addOption(password)
|
||||
.action(async (text, options) => {
|
||||
API.setOptions({ server: options.server })
|
||||
setOptions({ server: options.server })
|
||||
await checkConstrains(options)
|
||||
options.password ||= await getStdin()
|
||||
try {
|
||||
|
@ -1,15 +1,14 @@
|
||||
import { Adapters, get, info, setOptions } from '@cryptgeon/shared'
|
||||
import inquirer from 'inquirer'
|
||||
import { access, constants, writeFile } from 'node:fs/promises'
|
||||
import { basename, resolve } from 'node:path'
|
||||
import { AES, Hex } from 'occulto'
|
||||
import pretty from 'pretty-bytes'
|
||||
import { Adapters } from '../shared/adapters.js'
|
||||
import { API } from '../shared/api.js'
|
||||
|
||||
export async function download(url: URL, all: boolean, suggestedPassword?: string) {
|
||||
API.setOptions({ server: url.origin })
|
||||
setOptions({ server: url.origin })
|
||||
const id = url.pathname.split('/')[2]
|
||||
const preview = await API.info(id).catch(() => {
|
||||
const preview = await info(id).catch(() => {
|
||||
throw new Error('Note does not exist or is expired')
|
||||
})
|
||||
|
||||
@ -34,7 +33,7 @@ export async function download(url: URL, all: boolean, suggestedPassword?: strin
|
||||
}
|
||||
|
||||
const key = derivation ? (await AES.derive(password, derivation))[0] : Hex.decode(password)
|
||||
const note = await API.get(id)
|
||||
const note = await get(id)
|
||||
|
||||
const couldNotDecrypt = new Error('Could not decrypt note. Probably an invalid password')
|
||||
switch (note.meta.type) {
|
@ -1,4 +1,4 @@
|
||||
export * from './actions/download.js'
|
||||
export * from './actions/upload.js'
|
||||
export * from './shared/adapters.js'
|
||||
export * from './shared/api.js'
|
||||
export * from '@cryptgeon/shared'
|
||||
export * from './download.js'
|
||||
export * from './upload.js'
|
||||
export * from './utils.js'
|
||||
|
@ -21,7 +21,7 @@ export function parseURL(value: string, _: URL): URL {
|
||||
}
|
||||
|
||||
export function parseNumber(value: string, _: number): number {
|
||||
const n = Number.parseInt(value, 10)
|
||||
if (Number.isNaN(n)) throw new InvalidOptionArgumentError('invalid number')
|
||||
const n = parseInt(value, 10)
|
||||
if (isNaN(n)) throw new InvalidOptionArgumentError('invalid number')
|
||||
return n
|
||||
}
|
@ -18,7 +18,6 @@ export function getStdin(timeout: number = 10): Promise<string> {
|
||||
resolve('')
|
||||
}, timeout)
|
||||
|
||||
process.stdin.on('error', reject)
|
||||
process.stdin.on('data', dataHandler)
|
||||
process.stdin.on('end', endHandler)
|
||||
})
|
@ -1,10 +1,9 @@
|
||||
import { readFile, stat } from 'node:fs/promises'
|
||||
import { basename } from 'node:path'
|
||||
|
||||
import { Adapters, create, getOptions, FileDTO, Note, NoteMeta } from '@cryptgeon/shared'
|
||||
import mime from 'mime'
|
||||
import { AES, Hex } from 'occulto'
|
||||
import { Adapters } from '../shared/adapters.js'
|
||||
import { API, FileDTO, Note, NoteMeta } from '../shared/api.js'
|
||||
|
||||
export type UploadOptions = Pick<Note, 'views' | 'expiration'> & { password?: string }
|
||||
|
||||
@ -39,8 +38,8 @@ export async function upload(input: string | string[], options: UploadOptions):
|
||||
|
||||
// Create the actual note and upload it.
|
||||
const note: Note = { ...noteOptions, contents, meta: { type, derivation: derived?.[1] } }
|
||||
const result = await API.create(note)
|
||||
let url = `${API.getOptions().server}/note/${result.id}`
|
||||
const result = await create(note)
|
||||
let url = `${getOptions().server}/note/${result.id}`
|
||||
if (!derived) url += `#${Hex.encode(key)}`
|
||||
return url
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
import { status } from '@cryptgeon/shared'
|
||||
import { exit as exitNode } from 'node:process'
|
||||
import { API } from '../shared/api.js'
|
||||
|
||||
export function exit(message: string) {
|
||||
console.error(message)
|
||||
@ -11,7 +11,7 @@ export async function checkConstrains(constrains: { views?: number; minutes?: nu
|
||||
if (views && minutes) exit('cannot set view and minutes constrains simultaneously')
|
||||
if (!views && !minutes) constrains.views = 1
|
||||
|
||||
const response = await API.status()
|
||||
const response = await status()
|
||||
if (views && views > response.max_views)
|
||||
exit(`Only a maximum of ${response.max_views} views allowed. ${views} given.`)
|
||||
if (minutes && minutes > response.max_expiration)
|
@ -2,7 +2,7 @@
|
||||
"compilerOptions": {
|
||||
"target": "es2022",
|
||||
"module": "es2022",
|
||||
"moduleResolution": "Bundler",
|
||||
"moduleResolution": "node",
|
||||
"declaration": true,
|
||||
"emitDeclarationOnly": true,
|
||||
"strict": true,
|
||||
|
@ -17,6 +17,7 @@
|
||||
"@sveltejs/adapter-static": "^3.0.1",
|
||||
"@sveltejs/kit": "^2.5.2",
|
||||
"@sveltejs/vite-plugin-svelte": "^3.0.2",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"@zerodevx/svelte-toast": "^0.9.5",
|
||||
"adm-zip": "^0.5.10",
|
||||
"dotenv": "^16.4.5",
|
||||
@ -28,9 +29,11 @@
|
||||
"vite": "^5.1.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"cryptgeon": "workspace:*",
|
||||
"@cryptgeon/shared": "workspace:*",
|
||||
"@fontsource/fira-mono": "^5.0.8",
|
||||
"occulto": "^2.0.6",
|
||||
"copy-to-clipboard": "^3.3.3",
|
||||
"file-saver": "^2.0.5",
|
||||
"occulto": "^2.0.3",
|
||||
"pretty-bytes": "^6.1.1",
|
||||
"qrious": "^4.0.2"
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { API, type Status } from 'cryptgeon/shared'
|
||||
import { status as getStatus, type Status } from '@cryptgeon/shared'
|
||||
import { writable } from 'svelte/store'
|
||||
|
||||
export const status = writable<null | Status>(null)
|
||||
|
||||
export async function init() {
|
||||
status.set(await API.status())
|
||||
status.set(await getStatus())
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { toast } from '@zerodevx/svelte-toast'
|
||||
import { toast, type SvelteToastOptions } from '@zerodevx/svelte-toast'
|
||||
|
||||
export enum NotifyType {
|
||||
Success = 'success',
|
||||
Error = 'error',
|
||||
}
|
||||
|
||||
const themeMapping: Record<NotifyType, Record<string, string>> = {
|
||||
const themeMapping: Record<NotifyType, SvelteToastOptions['theme']> = {
|
||||
[NotifyType.Success]: {
|
||||
'--toastBackground': 'var(--ui-clr-primary)',
|
||||
'--toastBarBackground': 'var(--ui-clr-primary-alt)',
|
||||
@ -17,7 +17,7 @@ const themeMapping: Record<NotifyType, Record<string, string>> = {
|
||||
}
|
||||
|
||||
function notifyFN(message: string, type: NotifyType = NotifyType.Success) {
|
||||
const options = {
|
||||
const options: SvelteToastOptions = {
|
||||
duration: 5_000,
|
||||
theme: {
|
||||
...themeMapping[type],
|
||||
|
@ -4,7 +4,7 @@
|
||||
import { status } from '$lib/stores/status'
|
||||
import Switch from '$lib/ui/Switch.svelte'
|
||||
import TextInput from '$lib/ui/TextInput.svelte'
|
||||
import type { Note } from 'cryptgeon/shared'
|
||||
import type { Note } from '@cryptgeon/shared'
|
||||
|
||||
export let note: Note
|
||||
export let timeExpiration = false
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
import Button from '$lib/ui/Button.svelte'
|
||||
import MaxSize from '$lib/ui/MaxSize.svelte'
|
||||
import type { FileDTO } from 'cryptgeon/shared'
|
||||
import type { FileDTO } from '@cryptgeon/shared'
|
||||
|
||||
export let label: string = ''
|
||||
export let files: FileDTO[] = []
|
||||
|
@ -1,26 +1,16 @@
|
||||
<script lang="ts" context="module">
|
||||
export type DecryptedNote = Omit<NotePublic, 'contents'> & { contents: any }
|
||||
|
||||
function saveAs(file: File) {
|
||||
const url = window.URL.createObjectURL(file)
|
||||
const a = document.createElement('a')
|
||||
a.style.display = 'none'
|
||||
a.href = url
|
||||
a.download = file.name
|
||||
document.body.appendChild(a)
|
||||
a.click()
|
||||
window.URL.revokeObjectURL(url)
|
||||
a.remove()
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import pkg from 'file-saver'
|
||||
const { saveAs } = pkg
|
||||
import prettyBytes from 'pretty-bytes'
|
||||
import { t } from 'svelte-intl-precompile'
|
||||
|
||||
import Button from '$lib/ui/Button.svelte'
|
||||
import { copy } from '$lib/utils'
|
||||
import type { FileDTO, NotePublic } from 'cryptgeon/shared'
|
||||
import type { FileDTO, NotePublic } from '@cryptgeon/shared'
|
||||
|
||||
export let note: DecryptedNote
|
||||
|
||||
|
@ -1,10 +1,11 @@
|
||||
import copyToClipboard from 'copy-to-clipboard'
|
||||
import { t } from 'svelte-intl-precompile'
|
||||
import { get } from 'svelte/store'
|
||||
|
||||
import { notify } from './toast'
|
||||
|
||||
export function copy(value: string) {
|
||||
window.navigator.clipboard.writeText(value)
|
||||
copyToClipboard(value)
|
||||
const msg = get(t)('common.copied_to_clipboard')
|
||||
notify.success(msg)
|
||||
}
|
||||
|
@ -13,7 +13,8 @@
|
||||
import Result, { type NoteResult } from '$lib/ui/NoteResult.svelte'
|
||||
import Switch from '$lib/ui/Switch.svelte'
|
||||
import TextArea from '$lib/ui/TextArea.svelte'
|
||||
import { Adapters, API, PayloadToLargeError, type FileDTO, type Note } from 'cryptgeon/shared'
|
||||
import type { FileDTO, Note } from '@cryptgeon/shared'
|
||||
import { Adapters, PayloadToLargeError, create } from '@cryptgeon/shared'
|
||||
|
||||
let note: Note = {
|
||||
contents: '',
|
||||
@ -76,7 +77,7 @@
|
||||
else data.views = parseInt(note.views as any)
|
||||
|
||||
loading = $t('common.uploading')
|
||||
const response = await API.create(data)
|
||||
const response = await create(data)
|
||||
result = {
|
||||
id: response.id,
|
||||
password: customPassword ? undefined : Hex.encode(key),
|
||||
|
@ -7,7 +7,7 @@
|
||||
import Loader from '$lib/ui/Loader.svelte'
|
||||
import ShowNote, { type DecryptedNote } from '$lib/ui/ShowNote.svelte'
|
||||
import TextInput from '$lib/ui/TextInput.svelte'
|
||||
import { Adapters, API, type NoteMeta } from 'cryptgeon/shared'
|
||||
import { Adapters, get, info, type NoteMeta } from '@cryptgeon/shared'
|
||||
import type { PageData } from './$types'
|
||||
|
||||
export let data: PageData
|
||||
@ -28,7 +28,7 @@
|
||||
try {
|
||||
loading = $t('common.loading')
|
||||
password = window.location.hash.slice(1)
|
||||
const note = await API.info(id)
|
||||
const note = await info(id)
|
||||
meta = note.meta
|
||||
exists = true
|
||||
} catch {
|
||||
@ -51,7 +51,7 @@
|
||||
// Load note
|
||||
error = null
|
||||
loading = $t('common.downloading')
|
||||
const data = await API.get(id)
|
||||
const data = await get(id)
|
||||
loading = $t('common.decrypting')
|
||||
const derived = meta?.derivation && (await AES.derive(password!, meta.derivation))
|
||||
const key = derived ? derived[0] : Hex.decode(password!)
|
||||
|
22
packages/shared/package.json
Normal file
22
packages/shared/package.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@cryptgeon/shared",
|
||||
"type": "module",
|
||||
"types": "./dist/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
"import": "./dist/index.js"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "tsc -w",
|
||||
"build": "tsc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"occulto": "^2.0.3"
|
||||
}
|
||||
}
|
@ -39,15 +39,15 @@ export let client: ClientOptions = {
|
||||
server: '',
|
||||
}
|
||||
|
||||
function setOptions(options: Partial<ClientOptions>) {
|
||||
export function setOptions(options: Partial<ClientOptions>) {
|
||||
client = { ...client, ...options }
|
||||
}
|
||||
|
||||
function getOptions(): ClientOptions {
|
||||
export function getOptions(): ClientOptions {
|
||||
return client
|
||||
}
|
||||
|
||||
async function call(options: CallOptions) {
|
||||
export async function call(options: CallOptions) {
|
||||
const url = client.server + '/api/' + options.url
|
||||
const response = await fetch(url, {
|
||||
method: options.method,
|
||||
@ -65,7 +65,7 @@ async function call(options: CallOptions) {
|
||||
return response.json()
|
||||
}
|
||||
|
||||
async function create(note: Note) {
|
||||
export async function create(note: Note) {
|
||||
const { meta, ...rest } = note
|
||||
const body: NoteCreate = {
|
||||
...rest,
|
||||
@ -79,7 +79,7 @@ async function create(note: Note) {
|
||||
return data as { id: string }
|
||||
}
|
||||
|
||||
async function get(id: string): Promise<NotePublic> {
|
||||
export async function get(id: string): Promise<NotePublic> {
|
||||
const data = await call({
|
||||
url: `notes/${id}`,
|
||||
method: 'delete',
|
||||
@ -93,7 +93,7 @@ async function get(id: string): Promise<NotePublic> {
|
||||
return note
|
||||
}
|
||||
|
||||
async function info(id: string): Promise<NoteInfo> {
|
||||
export async function info(id: string): Promise<NoteInfo> {
|
||||
const data = await call({
|
||||
url: `notes/${id}`,
|
||||
method: 'get',
|
||||
@ -112,7 +112,6 @@ export type Status = {
|
||||
max_views: number
|
||||
max_expiration: number
|
||||
allow_advanced: boolean
|
||||
allow_files: boolean
|
||||
theme_image: string
|
||||
theme_text: string
|
||||
theme_favicon: string
|
||||
@ -120,19 +119,10 @@ export type Status = {
|
||||
theme_new_note_notice: boolean
|
||||
}
|
||||
|
||||
async function status() {
|
||||
export async function status() {
|
||||
const data = await call({
|
||||
url: 'status/',
|
||||
method: 'get',
|
||||
})
|
||||
return data as Status
|
||||
}
|
||||
|
||||
export const API = {
|
||||
setOptions,
|
||||
getOptions,
|
||||
create,
|
||||
get,
|
||||
info,
|
||||
status,
|
||||
}
|
12
packages/shared/tsconfig.json
Normal file
12
packages/shared/tsconfig.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"incremental": true,
|
||||
"composite": true,
|
||||
"target": "es2022",
|
||||
"module": "es2022",
|
||||
"rootDir": "./src",
|
||||
"moduleResolution": "node",
|
||||
"outDir": "./dist",
|
||||
"strict": true
|
||||
}
|
||||
}
|
103
pnpm-lock.yaml
generated
103
pnpm-lock.yaml
generated
@ -26,20 +26,23 @@ importers:
|
||||
packages/cli:
|
||||
devDependencies:
|
||||
'@commander-js/extra-typings':
|
||||
specifier: ^12.1.0
|
||||
version: 12.1.0(commander@12.1.0)
|
||||
specifier: ^12.0.1
|
||||
version: 12.0.1(commander@12.0.0)
|
||||
'@cryptgeon/shared':
|
||||
specifier: workspace:*
|
||||
version: link:../shared
|
||||
'@types/inquirer':
|
||||
specifier: ^9.0.7
|
||||
version: 9.0.7
|
||||
'@types/mime':
|
||||
specifier: ^4.0.0
|
||||
version: 4.0.0
|
||||
specifier: ^3.0.4
|
||||
version: 3.0.4
|
||||
'@types/node':
|
||||
specifier: ^20.11.24
|
||||
version: 20.11.24
|
||||
commander:
|
||||
specifier: ^12.1.0
|
||||
version: 12.1.0
|
||||
specifier: ^12.0.0
|
||||
version: 12.0.0
|
||||
inquirer:
|
||||
specifier: ^9.2.15
|
||||
version: 9.2.15
|
||||
@ -47,8 +50,8 @@ importers:
|
||||
specifier: ^4.0.1
|
||||
version: 4.0.1
|
||||
occulto:
|
||||
specifier: ^2.0.6
|
||||
version: 2.0.6
|
||||
specifier: ^2.0.3
|
||||
version: 2.0.3
|
||||
pretty-bytes:
|
||||
specifier: ^6.1.1
|
||||
version: 6.1.1
|
||||
@ -61,15 +64,21 @@ importers:
|
||||
|
||||
packages/frontend:
|
||||
dependencies:
|
||||
'@cryptgeon/shared':
|
||||
specifier: workspace:*
|
||||
version: link:../shared
|
||||
'@fontsource/fira-mono':
|
||||
specifier: ^5.0.8
|
||||
version: 5.0.8
|
||||
cryptgeon:
|
||||
specifier: workspace:*
|
||||
version: link:../cli
|
||||
copy-to-clipboard:
|
||||
specifier: ^3.3.3
|
||||
version: 3.3.3
|
||||
file-saver:
|
||||
specifier: ^2.0.5
|
||||
version: 2.0.5
|
||||
occulto:
|
||||
specifier: ^2.0.6
|
||||
version: 2.0.6
|
||||
specifier: ^2.0.3
|
||||
version: 2.0.3
|
||||
pretty-bytes:
|
||||
specifier: ^6.1.1
|
||||
version: 6.1.1
|
||||
@ -89,6 +98,9 @@ importers:
|
||||
'@sveltejs/vite-plugin-svelte':
|
||||
specifier: ^3.0.2
|
||||
version: 3.0.2(svelte@4.2.12)(vite@5.1.7(@types/node@22.5.0))
|
||||
'@types/file-saver':
|
||||
specifier: ^2.0.7
|
||||
version: 2.0.7
|
||||
'@zerodevx/svelte-toast':
|
||||
specifier: ^0.9.5
|
||||
version: 0.9.5(svelte@4.2.12)
|
||||
@ -123,6 +135,16 @@ importers:
|
||||
specifier: ^1.18.1
|
||||
version: 1.18.1
|
||||
|
||||
packages/shared:
|
||||
dependencies:
|
||||
occulto:
|
||||
specifier: ^2.0.3
|
||||
version: 2.0.3
|
||||
devDependencies:
|
||||
typescript:
|
||||
specifier: ^5.3.3
|
||||
version: 5.3.3
|
||||
|
||||
packages:
|
||||
|
||||
'@ampproject/remapping@2.3.0':
|
||||
@ -220,10 +242,10 @@ packages:
|
||||
resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@commander-js/extra-typings@12.1.0':
|
||||
resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==}
|
||||
'@commander-js/extra-typings@12.0.1':
|
||||
resolution: {integrity: sha512-OvkMobb1eMqOCuJdbuSin/KJkkZr7n24/UNV+Lcz/0Dhepf3r2p9PaGwpRpAWej7A+gQnny4h8mGhpFl4giKkg==}
|
||||
peerDependencies:
|
||||
commander: ~12.1.0
|
||||
commander: ~12.0.0
|
||||
|
||||
'@esbuild/aix-ppc64@0.19.12':
|
||||
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
|
||||
@ -756,12 +778,14 @@ packages:
|
||||
'@types/estree@1.0.5':
|
||||
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
|
||||
|
||||
'@types/file-saver@2.0.7':
|
||||
resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==}
|
||||
|
||||
'@types/inquirer@9.0.7':
|
||||
resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==}
|
||||
|
||||
'@types/mime@4.0.0':
|
||||
resolution: {integrity: sha512-5eEkJZ/BLvTE3vXGKkWlyTSUVZuzj23Wj8PoyOq2lt5I3CYbiLBOPb3XmCW6QcuOibIUE6emHXHt9E/F/rCa6w==}
|
||||
deprecated: This is a stub types definition. mime provides its own type definitions, so you do not need this installed.
|
||||
'@types/mime@3.0.4':
|
||||
resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==}
|
||||
|
||||
'@types/node@20.11.24':
|
||||
resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==}
|
||||
@ -956,8 +980,8 @@ packages:
|
||||
color-name@1.1.4:
|
||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||
|
||||
commander@12.1.0:
|
||||
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
|
||||
commander@12.0.0:
|
||||
resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
commander@4.1.1:
|
||||
@ -978,6 +1002,9 @@ packages:
|
||||
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
copy-to-clipboard@3.3.3:
|
||||
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
|
||||
|
||||
cross-spawn@6.0.5:
|
||||
resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==}
|
||||
engines: {node: '>=4.8'}
|
||||
@ -1126,6 +1153,9 @@ packages:
|
||||
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
file-saver@2.0.5:
|
||||
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
|
||||
|
||||
fill-range@7.0.1:
|
||||
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
|
||||
engines: {node: '>=8'}
|
||||
@ -1588,9 +1618,9 @@ packages:
|
||||
resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
occulto@2.0.6:
|
||||
resolution: {integrity: sha512-oaCwtnQjr+fTfFVfSPEDC5rh+L13OcEJ6uQzhmG8PlLxxYn2MxTDPmoCUVHKD7rUxwxCpH7/N4hbTu5U4mqZag==}
|
||||
engines: {node: '>=18'}
|
||||
occulto@2.0.3:
|
||||
resolution: {integrity: sha512-rLXDNqsxM3Gusp4cn8QsveeKsmX36SbnIUcUc3mSeM88pGsNY5Tn6VnWItw/7zST01z9gtaZWQFk0F1L53jMCQ==}
|
||||
engines: {node: '>=16', npm: please-use-pnpm, pnpm: '>=8', yarn: please-use-pnpm}
|
||||
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
@ -2049,6 +2079,9 @@ packages:
|
||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||
engines: {node: '>=8.0'}
|
||||
|
||||
toggle-selection@1.0.6:
|
||||
resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
|
||||
|
||||
totalist@3.0.1:
|
||||
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
|
||||
engines: {node: '>=6'}
|
||||
@ -2344,9 +2377,9 @@ snapshots:
|
||||
'@babel/helper-validator-identifier': 7.22.20
|
||||
to-fast-properties: 2.0.0
|
||||
|
||||
'@commander-js/extra-typings@12.1.0(commander@12.1.0)':
|
||||
'@commander-js/extra-typings@12.0.1(commander@12.0.0)':
|
||||
dependencies:
|
||||
commander: 12.1.0
|
||||
commander: 12.0.0
|
||||
|
||||
'@esbuild/aix-ppc64@0.19.12':
|
||||
optional: true
|
||||
@ -2700,14 +2733,14 @@ snapshots:
|
||||
|
||||
'@types/estree@1.0.5': {}
|
||||
|
||||
'@types/file-saver@2.0.7': {}
|
||||
|
||||
'@types/inquirer@9.0.7':
|
||||
dependencies:
|
||||
'@types/through': 0.0.33
|
||||
rxjs: 7.8.1
|
||||
|
||||
'@types/mime@4.0.0':
|
||||
dependencies:
|
||||
mime: 4.0.1
|
||||
'@types/mime@3.0.4': {}
|
||||
|
||||
'@types/node@20.11.24':
|
||||
dependencies:
|
||||
@ -2909,7 +2942,7 @@ snapshots:
|
||||
|
||||
color-name@1.1.4: {}
|
||||
|
||||
commander@12.1.0: {}
|
||||
commander@12.0.0: {}
|
||||
|
||||
commander@4.1.1: {}
|
||||
|
||||
@ -2921,6 +2954,10 @@ snapshots:
|
||||
|
||||
cookie@0.6.0: {}
|
||||
|
||||
copy-to-clipboard@3.3.3:
|
||||
dependencies:
|
||||
toggle-selection: 1.0.6
|
||||
|
||||
cross-spawn@6.0.5:
|
||||
dependencies:
|
||||
nice-try: 1.0.5
|
||||
@ -3153,6 +3190,8 @@ snapshots:
|
||||
dependencies:
|
||||
escape-string-regexp: 1.0.5
|
||||
|
||||
file-saver@2.0.5: {}
|
||||
|
||||
fill-range@7.0.1:
|
||||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
@ -3584,7 +3623,7 @@ snapshots:
|
||||
has-symbols: 1.0.3
|
||||
object-keys: 1.1.1
|
||||
|
||||
occulto@2.0.6: {}
|
||||
occulto@2.0.3: {}
|
||||
|
||||
once@1.4.0:
|
||||
dependencies:
|
||||
@ -4078,6 +4117,8 @@ snapshots:
|
||||
dependencies:
|
||||
is-number: 7.0.0
|
||||
|
||||
toggle-selection@1.0.6: {}
|
||||
|
||||
totalist@3.0.1: {}
|
||||
|
||||
tr46@1.0.1:
|
||||
|
Loading…
Reference in New Issue
Block a user