feat: add API
- try localhost:1225/search?search_term=akk
This commit is contained in:
parent
fdae502ec7
commit
38919f3a5a
13 changed files with 367 additions and 161 deletions
|
|
@ -25,6 +25,7 @@
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"google-auth-library": "^10.3.0",
|
"google-auth-library": "^10.3.0",
|
||||||
"googleapis": "^159.0.0",
|
"googleapis": "^159.0.0",
|
||||||
|
"node-fetch": "^3.3.2",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"sqlite3": "^5.1.7",
|
"sqlite3": "^5.1.7",
|
||||||
"typeorm": "0.3.26"
|
"typeorm": "0.3.26"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
import { promises as fs } from "fs";
|
import { promises as fs } from "fs";
|
||||||
|
import fetch from 'node-fetch';
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import { authenticate } from "@google-cloud/local-auth";
|
import { authenticate } from "@google-cloud/local-auth";
|
||||||
import { google } from "googleapis";
|
import { google } from "googleapis";
|
||||||
|
|
|
||||||
|
|
@ -1,124 +1,120 @@
|
||||||
import "reflect-metadata"
|
import "reflect-metadata";
|
||||||
import {
|
import {
|
||||||
Entity,
|
Entity,
|
||||||
PrimaryGeneratedColumn,
|
PrimaryGeneratedColumn,
|
||||||
Column,
|
Column,
|
||||||
PrimaryColumn,
|
PrimaryColumn,
|
||||||
BaseEntity,
|
BaseEntity,
|
||||||
ManyToOne,
|
ManyToOne,
|
||||||
OneToMany,
|
OneToMany,
|
||||||
OneToOne,
|
OneToOne,
|
||||||
ManyToMany,
|
ManyToMany,
|
||||||
JoinTable,
|
JoinTable,
|
||||||
ColumnType
|
ColumnType,
|
||||||
} from "typeorm";
|
} from "typeorm";
|
||||||
|
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Lemma extends BaseEntity {
|
export class Lemma extends BaseEntity {
|
||||||
@PrimaryColumn({type: 'text'})
|
@PrimaryColumn({ type: "text" })
|
||||||
lemma_name: string;
|
lemma_name: string;
|
||||||
|
|
||||||
@OneToMany(() => WordForm, (word_form) => word_form.lemma)
|
@OneToMany(() => WordForm, (word_form) => word_form.lemma, { cascade: true})
|
||||||
word_forms: WordForm[];
|
word_forms: WordForm[];
|
||||||
|
|
||||||
@OneToMany(() => Example, (example) => example.lemma)
|
@OneToMany(() => Example, (example) => example.lemma)
|
||||||
examples: Example[];
|
examples: Example[];
|
||||||
|
|
||||||
@OneToMany(() => Definition, (definition) => definition.lemma)
|
@OneToMany(() => Definition, (definition) => definition.lemma)
|
||||||
definitions: Definition[];
|
definitions: Definition[];
|
||||||
|
|
||||||
@OneToMany(() => Comment, (comment) => comment.lemma)
|
@OneToMany(() => Comment, (comment) => comment.lemma)
|
||||||
comments: Comment[];
|
comments: Comment[];
|
||||||
|
|
||||||
@OneToMany(() => Media, (media) => media.lemma)
|
@OneToMany(() => Media, (media) => media.lemma)
|
||||||
media: Media[];
|
media: Media[];
|
||||||
|
|
||||||
@ManyToMany(() => PartOfSpeech)
|
|
||||||
@JoinTable()
|
|
||||||
parts_of_speech: PartOfSpeech[];
|
|
||||||
|
|
||||||
|
@ManyToMany(() => PartOfSpeech)
|
||||||
|
@JoinTable()
|
||||||
|
parts_of_speech: PartOfSpeech[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Lect extends BaseEntity {
|
export class Lect extends BaseEntity {
|
||||||
@PrimaryColumn({type: 'text'})
|
@PrimaryColumn({ type: "text" })
|
||||||
name: string;
|
name: string;
|
||||||
|
|
||||||
@OneToMany(() => WordForm, (w) => w.lect)
|
|
||||||
word_forms: WordForm[];
|
|
||||||
|
|
||||||
|
@OneToMany(() => WordForm, (w) => w.lect)
|
||||||
|
word_forms: WordForm[];
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class WordForm extends BaseEntity {
|
export class WordForm extends BaseEntity {
|
||||||
@PrimaryColumn({type: 'integer'})
|
@PrimaryColumn({ type: "integer" })
|
||||||
word_form_id: number
|
word_form_id: number;
|
||||||
|
|
||||||
@Column({type: 'text'})
|
|
||||||
word_form: string;
|
|
||||||
|
|
||||||
@ManyToOne(() => Lemma, (lemma) => lemma.word_forms)
|
@Column({ type: "text" })
|
||||||
lemma: Lemma;
|
word_form: string;
|
||||||
|
|
||||||
@ManyToOne(() => Lect, (lect) => lect.word_forms)
|
@ManyToOne(() => Lemma, (lemma) => lemma.word_forms)
|
||||||
lect: Lect;
|
lemma: Lemma;
|
||||||
|
|
||||||
|
@ManyToOne(() => Lect, (lect) => lect.word_forms)
|
||||||
|
lect: Lect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Example extends BaseEntity {
|
export class Example extends BaseEntity {
|
||||||
@PrimaryGeneratedColumn()
|
@PrimaryGeneratedColumn()
|
||||||
example_id: number;
|
example_id: number;
|
||||||
|
|
||||||
@Column({ nullable: false, type: 'text' })
|
@Column({ nullable: false, type: "text" })
|
||||||
example_text: string;
|
example_text: string;
|
||||||
|
|
||||||
@ManyToOne(() => Lemma, (lemma) => lemma.examples)
|
@ManyToOne(() => Lemma, (lemma) => lemma.examples)
|
||||||
lemma: Lemma;
|
lemma: Lemma;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Media extends BaseEntity {
|
export class Media extends BaseEntity {
|
||||||
@PrimaryGeneratedColumn()
|
@PrimaryGeneratedColumn()
|
||||||
media_id: number;
|
media_id: number;
|
||||||
|
|
||||||
@Column({ nullable: false, type: 'text'})
|
@Column({ nullable: false, type: "text" })
|
||||||
media_url: string;
|
media_url: string;
|
||||||
|
|
||||||
@ManyToOne(() => Lemma, (lemma) => lemma.media)
|
@ManyToOne(() => Lemma, (lemma) => lemma.media)
|
||||||
lemma: Lemma;
|
lemma: Lemma;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Definition extends BaseEntity {
|
export class Definition extends BaseEntity {
|
||||||
@PrimaryGeneratedColumn()
|
@PrimaryGeneratedColumn()
|
||||||
definition_id: number;
|
definition_id: number;
|
||||||
|
|
||||||
@Column({ nullable: false, type: 'text' })
|
@Column({ nullable: false, type: "text" })
|
||||||
definition_text: string;
|
definition_text: string;
|
||||||
|
|
||||||
@ManyToOne(() => Lemma, (lemma) => lemma.definitions)
|
@ManyToOne(() => Lemma, (lemma) => lemma.definitions)
|
||||||
lemma: Lemma;
|
lemma: Lemma;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class Comment extends BaseEntity {
|
export class Comment extends BaseEntity {
|
||||||
@PrimaryGeneratedColumn()
|
@PrimaryGeneratedColumn()
|
||||||
comment_id: number;
|
comment_id: number;
|
||||||
|
|
||||||
@Column({ nullable: false, type: 'text' })
|
@Column({ nullable: false, type: "text" })
|
||||||
comment_text: string;
|
comment_text: string;
|
||||||
|
|
||||||
@ManyToOne(() => Lemma, (lemma) => lemma.comments)
|
@ManyToOne(() => Lemma, (lemma) => lemma.comments)
|
||||||
lemma: Lemma;
|
lemma: Lemma;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class PartOfSpeech extends BaseEntity {
|
export class PartOfSpeech extends BaseEntity {
|
||||||
@PrimaryColumn({type: 'text'})
|
@PrimaryColumn({ type: "text" })
|
||||||
long_form: string;
|
long_form: string;
|
||||||
|
|
||||||
@Column({ nullable: false, unique: true, type: 'text' })
|
@Column({ nullable: false, unique: true, type: "text" })
|
||||||
short_form: string;
|
short_form: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
|
import fetch from "node-fetch";
|
||||||
import { SAMPLE } from "@repo/common/sample";
|
import { SAMPLE } from "@repo/common/sample";
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import { google, sheets_v4 } from "googleapis";
|
import { google, sheets_v4 } from "googleapis";
|
||||||
import { OAuth2Client } from 'google-auth-library';
|
import { OAuth2Client } from "google-auth-library";
|
||||||
import { appDataSource } from "./config/dbconfig.js";
|
import { appDataSource } from "./config/dbconfig.js";
|
||||||
import { authorize } from "./auth.js"
|
import { authorize } from "./auth.js";
|
||||||
import {
|
import {
|
||||||
Lemma,
|
Lemma,
|
||||||
WordForm,
|
WordForm,
|
||||||
|
|
@ -18,7 +19,7 @@ import {
|
||||||
|
|
||||||
const RELOAD_SHEET_ON_START = false;
|
const RELOAD_SHEET_ON_START = false;
|
||||||
|
|
||||||
|
global.fetch = fetch as any;
|
||||||
|
|
||||||
appDataSource
|
appDataSource
|
||||||
.initialize()
|
.initialize()
|
||||||
|
|
@ -39,7 +40,6 @@ appDataSource
|
||||||
})
|
})
|
||||||
.catch((error) => console.log(error));
|
.catch((error) => console.log(error));
|
||||||
|
|
||||||
|
|
||||||
function initExpress() {
|
function initExpress() {
|
||||||
const app = express();
|
const app = express();
|
||||||
const PORT = 1225;
|
const PORT = 1225;
|
||||||
|
|
@ -48,28 +48,19 @@ function initExpress() {
|
||||||
const word_form_repository = appDataSource.getRepository(WordForm);
|
const word_form_repository = appDataSource.getRepository(WordForm);
|
||||||
const lemma_repository = appDataSource.getRepository(Lemma);
|
const lemma_repository = appDataSource.getRepository(Lemma);
|
||||||
|
|
||||||
app.get("/", (req, res) => {
|
|
||||||
res.render("search", { title: "Suha", message: "Bratsa" });
|
|
||||||
});
|
|
||||||
|
|
||||||
app.get("/sample", (_req, res) => {
|
app.get("/sample", (_req, res) => {
|
||||||
res.status(200).send(SAMPLE);
|
res.status(200).send(SAMPLE);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/search", async (req, res) => {
|
app.get("/search", async (req, res) => {
|
||||||
|
|
||||||
const search_term = req.query.search_term?.toString();
|
const search_term = req.query.search_term?.toString();
|
||||||
|
|
||||||
if(!search_term) {
|
if (!search_term) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lemmas: Lemma[] = (
|
const lemmas: Lemma[] = (
|
||||||
await Lemma.find({
|
await Lemma.find({ relations: { word_forms: { lect: true } } })
|
||||||
relations: {
|
|
||||||
word_forms: { lect: true },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
).filter((e) => {
|
).filter((e) => {
|
||||||
for (const wf of e.word_forms) {
|
for (const wf of e.word_forms) {
|
||||||
if (wf.word_form.includes(search_term)) {
|
if (wf.word_form.includes(search_term)) {
|
||||||
|
|
@ -79,15 +70,34 @@ function initExpress() {
|
||||||
});
|
});
|
||||||
|
|
||||||
const lects = await Lect.find();
|
const lects = await Lect.find();
|
||||||
return res.render("search_results", {
|
res.status(200).send({
|
||||||
terms: lemmas.length,
|
terms: lemmas.length,
|
||||||
results: lemmas,
|
results: lemmas,
|
||||||
lects: lects,
|
lects: lects,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
app.set("views", "./res/views");
|
app.get("/lect", async (req, res) => {
|
||||||
app.set("view engine", "pug");
|
const name = req.query.name?.toString();
|
||||||
|
|
||||||
|
if (!name) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lect = await Lect.findOne({
|
||||||
|
where: { name: name },
|
||||||
|
relations: { word_forms: { lemma: true } },
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).send({ lect });
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get("/lects", async (req, res) => {
|
||||||
|
const lects = await Lect.find()
|
||||||
|
res.status(200).send({
|
||||||
|
lects
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
app.listen(PORT, () => {
|
app.listen(PORT, () => {
|
||||||
console.log(`Backend started @ http://localhost:${PORT} !`);
|
console.log(`Backend started @ http://localhost:${PORT} !`);
|
||||||
|
|
@ -99,86 +109,101 @@ function initExpress() {
|
||||||
* @param {google.auth.OAuth2Client} auth The authenticated Google OAuth client.
|
* @param {google.auth.OAuth2Client} auth The authenticated Google OAuth client.
|
||||||
*/
|
*/
|
||||||
async function loadSheet(auth: OAuth2Client) {
|
async function loadSheet(auth: OAuth2Client) {
|
||||||
const options: any = { version: "v4", auth };
|
const lect_repository = appDataSource.getRepository(Lect);
|
||||||
const sheets = google.sheets(options);
|
const word_form_repository = appDataSource.getRepository(WordForm);
|
||||||
const res = await sheets.spreadsheets.values.get({
|
const lemma_repository = appDataSource.getRepository(Lemma);
|
||||||
spreadsheetId: "1-YkCeynx_-KYdubvt14augSPo37_20YgUv_f-i8HVwY",
|
const options: any = { version: "v4", auth };
|
||||||
range: "al_ko_mit_govor",
|
const sheets = google.sheets(options);
|
||||||
});
|
const res = await sheets.spreadsheets.values.get({
|
||||||
|
spreadsheetId: "1-YkCeynx_-KYdubvt14augSPo37_20YgUv_f-i8HVwY",
|
||||||
|
range: "al_ko_mit_govor",
|
||||||
|
});
|
||||||
|
|
||||||
const rows = res.data.values;
|
const rows = res.data.values;
|
||||||
|
|
||||||
const keys_res = await sheets.spreadsheets.values.get({
|
|
||||||
spreadsheetId: "1-YkCeynx_-KYdubvt14augSPo37_20YgUv_f-i8HVwY",
|
|
||||||
range: "klucz",
|
|
||||||
});
|
|
||||||
|
|
||||||
const keys = keys_res.data.values;
|
const keys_res = await sheets.spreadsheets.values.get({
|
||||||
|
spreadsheetId: "1-YkCeynx_-KYdubvt14augSPo37_20YgUv_f-i8HVwY",
|
||||||
if (!rows || rows.length === 0) {
|
range: "klucz",
|
||||||
console.error("No data found.");
|
});
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!keys || keys.length === 0) {
|
const keys = keys_res.data.values;
|
||||||
console.error("No lemma keys found.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const lects = rows.shift();
|
if (!rows || rows.length === 0) {
|
||||||
|
console.error("No data found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (keys.length != rows.length) {
|
if (!keys || keys.length === 0) {
|
||||||
console.error("Lemma count doesn't match number of rows.");
|
console.error("No lemma keys found.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lects){
|
const lects = rows.shift();
|
||||||
console.error("No lects found");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const lect of lects) {
|
if (keys.length != rows.length) {
|
||||||
let l = new Lect();
|
console.error("Lemma count doesn't match number of rows.");
|
||||||
l.name = lect;
|
return;
|
||||||
l.save();
|
}
|
||||||
console.log(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
const nikolect = lects.indexOf("Nikomiko");
|
if (!lects) {
|
||||||
|
console.error("No lects found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < rows.length; i++) {
|
for (const lect of lects) {
|
||||||
const row = rows[i];
|
let l = new Lect();
|
||||||
|
l.name = lect;
|
||||||
|
l.save();
|
||||||
|
console.log(l);
|
||||||
|
}
|
||||||
|
|
||||||
const lemma_key = keys[i]?.[0];
|
const nikolect = lects.indexOf("Nikomiko");
|
||||||
const lemma = new Lemma();
|
const lemmas = Array<Lemma>();
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
const row = rows[i];
|
||||||
|
|
||||||
if (lemma_key == null || lemma_key.length == 0) {
|
const lemma_key = keys[i]?.[0];
|
||||||
//assign a random UUID to the lemma as punishment for our failures
|
const lemma = new Lemma();
|
||||||
lemma.lemma_name = crypto.randomUUID();
|
|
||||||
console.log(`womp womp, missing lemma name, calling it ${lemma.lemma_name}`)
|
|
||||||
} else {
|
|
||||||
lemma.lemma_name = lemma_key;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(lemma);
|
if (lemma_key == null || lemma_key.length == 0) {
|
||||||
await lemma.save();
|
//assign a random UUID to the lemma as punishment for our failures
|
||||||
|
lemma.lemma_name = crypto.randomUUID();
|
||||||
|
console.log(
|
||||||
|
`womp womp, missing lemma name, calling it ${lemma.lemma_name}`,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
lemma.lemma_name = lemma_key;
|
||||||
|
}
|
||||||
|
|
||||||
for(let i=0; i<rows.length; i++){
|
lemmas.push(lemma);
|
||||||
const cell = row?.[i];
|
lemma.word_forms = Array<WordForm>();
|
||||||
if (cell === null || cell === undefined || (typeof cell === "string" && cell.length === 0)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let word_form of cell.split(";")) {
|
for (let i = 0; i < rows.length; i++) {
|
||||||
const f = new WordForm();
|
const cell = row?.[i];
|
||||||
f.word_form = word_form;
|
if (
|
||||||
f.lemma = lemma;
|
cell === null
|
||||||
f.lect = lects[i];
|
|| cell === undefined
|
||||||
//console.log(f);
|
|| (typeof cell === "string" && cell.length === 0)
|
||||||
await f.save();
|
) {
|
||||||
}
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
for (let word_form of cell.split(";")) {
|
||||||
|
const f = new WordForm();
|
||||||
|
f.word_form = word_form;
|
||||||
|
f.lect = lects[i];
|
||||||
|
//console.log(f);
|
||||||
|
lemma.word_forms.push(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
for (let i = 0; i < lemmas.length; i += 100) {
|
||||||
}
|
await lemma_repository.save(lemmas.slice(i, i + 100));
|
||||||
|
console.log(
|
||||||
|
`Saved ${Math.min(i + 100, lemmas.length)} / ${lemmas.length} lemmas...`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Loaded ${lemmas.length} lemmas!`);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.1.6",
|
"@tailwindcss/vite": "^4.1.6",
|
||||||
"@types/node": "^22.15.17",
|
"@types/node": "^22.15.17",
|
||||||
|
"axios": "^1.11.0",
|
||||||
"bulma": "^1.0.4",
|
"bulma": "^1.0.4",
|
||||||
"tailwindcss": "^4.1.6",
|
"tailwindcss": "^4.1.6",
|
||||||
"vue": "^3.5.13",
|
"vue": "^3.5.13",
|
||||||
|
|
|
||||||
|
|
@ -42,9 +42,9 @@ const toggleBurger = (): void => {
|
||||||
<RouterLink class="navbar-item" to="/resources"
|
<RouterLink class="navbar-item" to="/resources"
|
||||||
>Resources</RouterLink
|
>Resources</RouterLink
|
||||||
>
|
>
|
||||||
<RouterLink class="navbar-item" to="/resources">{{
|
<RouterLink class="navbar-item" to="/kotoba">
|
||||||
SAMPLE
|
Kotoba
|
||||||
}}</RouterLink>
|
</RouterLink>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
||||||
17
apps/vdn-static/src/components/pages/KotobaPage.vue
Normal file
17
apps/vdn-static/src/components/pages/KotobaPage.vue
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<section class="section">
|
||||||
|
<h1 class="title">Tropos-agnostic search</h1>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="section container">
|
||||||
|
<input type="text" name="text" id="aaa">
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
@ -3,10 +3,12 @@ import type { RouteRecordRaw } from "vue-router";
|
||||||
|
|
||||||
import HomePage from "@/components/pages/HomePage.vue";
|
import HomePage from "@/components/pages/HomePage.vue";
|
||||||
import ResourcesPage from "@/components/pages/ResourcesPage.vue";
|
import ResourcesPage from "@/components/pages/ResourcesPage.vue";
|
||||||
|
import KotobaPage from "@/components/pages/KotobaPage.vue";
|
||||||
|
|
||||||
const routes: RouteRecordRaw[] = [
|
const routes: RouteRecordRaw[] = [
|
||||||
{ path: "/", name: "Home", component: HomePage },
|
{ path: "/", name: "Home", component: HomePage },
|
||||||
{ path: "/resources", name: "Resources", component: ResourcesPage },
|
{ path: "/resources", name: "Resources", component: ResourcesPage },
|
||||||
|
{ path: "/kotoba", name: "Kotoba", component: KotobaPage },
|
||||||
// {
|
// {
|
||||||
// path: '/:pathMatch(.*)*', // Vue Router 4 catch-all for 404s
|
// path: '/:pathMatch(.*)*', // Vue Router 4 catch-all for 404s
|
||||||
// name: 'NotFound',
|
// name: 'NotFound',
|
||||||
|
|
|
||||||
|
|
@ -21,5 +21,8 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"typescript": "~5.8.3"
|
"typescript": "~5.8.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"class-transformer": "^0.5.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
51
libs/common/src/dto.ts
Normal file
51
libs/common/src/dto.ts
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
export interface LemmaDto {
|
||||||
|
lemma_name: string;
|
||||||
|
word_forms: WordFormDto[];
|
||||||
|
examples: ExampleDto[];
|
||||||
|
definitions: DefinitionDto[];
|
||||||
|
comments: CommentDto[];
|
||||||
|
media: MediaDto[];
|
||||||
|
|
||||||
|
parts_of_speech: PartOfSpeechDto[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface LectDto {
|
||||||
|
name: string;
|
||||||
|
word_forms: WordFormDto[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface WordFormDto {
|
||||||
|
word_form_id: number;
|
||||||
|
word_form: string;
|
||||||
|
lemma: LemmaDto;
|
||||||
|
lect: LectDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExampleDto {
|
||||||
|
example_id: number;
|
||||||
|
example_text: string;
|
||||||
|
lemma: LemmaDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MediaDto {
|
||||||
|
media_id: number;
|
||||||
|
media_url: string;
|
||||||
|
lemma: LemmaDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DefinitionDto {
|
||||||
|
definition_id: number;
|
||||||
|
definition_text: string;
|
||||||
|
lemma: LemmaDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CommentDto {
|
||||||
|
comment_id: number;
|
||||||
|
comment_text: string;
|
||||||
|
lemma: LemmaDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PartOfSpeechDto {
|
||||||
|
long_form: string;
|
||||||
|
short_form: string;
|
||||||
|
}
|
||||||
13
package.json
13
package.json
|
|
@ -2,5 +2,16 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"turbo": "^2.5.4"
|
"turbo": "^2.5.4"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.11.0"
|
"packageManager": "pnpm@10.11.0",
|
||||||
|
"scripts": {
|
||||||
|
"build:vdb-backend": "npm run build -w apps/vdb-backend",
|
||||||
|
"build:vdn-static": "npm run build -w apps/vdn-static",
|
||||||
|
"run:dev:vdb-backend": "npm run dev -w apps/vdb-backend",
|
||||||
|
"run:dev:vdn-static": "npm run dev -w apps/vdn-static",
|
||||||
|
"run:dev:all": "run-p run:dev:vdb-backend run:dev:vdn-static"
|
||||||
|
},
|
||||||
|
"workspaces": [
|
||||||
|
"apps/vdb-backend",
|
||||||
|
"apps/vdn-static"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
98
pnpm-lock.yaml
generated
98
pnpm-lock.yaml
generated
|
|
@ -32,6 +32,9 @@ importers:
|
||||||
googleapis:
|
googleapis:
|
||||||
specifier: ^159.0.0
|
specifier: ^159.0.0
|
||||||
version: 159.0.0
|
version: 159.0.0
|
||||||
|
node-fetch:
|
||||||
|
specifier: ^3.3.2
|
||||||
|
version: 3.3.2
|
||||||
reflect-metadata:
|
reflect-metadata:
|
||||||
specifier: ^0.2.2
|
specifier: ^0.2.2
|
||||||
version: 0.2.2
|
version: 0.2.2
|
||||||
|
|
@ -60,6 +63,9 @@ importers:
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^22.15.17
|
specifier: ^22.15.17
|
||||||
version: 22.15.31
|
version: 22.15.31
|
||||||
|
axios:
|
||||||
|
specifier: ^1.11.0
|
||||||
|
version: 1.11.0
|
||||||
bulma:
|
bulma:
|
||||||
specifier: ^1.0.4
|
specifier: ^1.0.4
|
||||||
version: 1.0.4
|
version: 1.0.4
|
||||||
|
|
@ -114,6 +120,10 @@ importers:
|
||||||
version: 2.2.10(typescript@5.8.3)
|
version: 2.2.10(typescript@5.8.3)
|
||||||
|
|
||||||
libs/common:
|
libs/common:
|
||||||
|
dependencies:
|
||||||
|
class-transformer:
|
||||||
|
specifier: ^0.5.1
|
||||||
|
version: 0.5.1
|
||||||
devDependencies:
|
devDependencies:
|
||||||
rimraf:
|
rimraf:
|
||||||
specifier: ^6.0.1
|
specifier: ^6.0.1
|
||||||
|
|
@ -979,10 +989,16 @@ packages:
|
||||||
resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==}
|
resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==}
|
||||||
engines: {node: '>=16.14.0'}
|
engines: {node: '>=16.14.0'}
|
||||||
|
|
||||||
|
asynckit@0.4.0:
|
||||||
|
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
|
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
axios@1.11.0:
|
||||||
|
resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==}
|
||||||
|
|
||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
|
|
@ -1074,6 +1090,9 @@ packages:
|
||||||
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
|
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
|
class-transformer@0.5.1:
|
||||||
|
resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==}
|
||||||
|
|
||||||
clean-stack@2.2.0:
|
clean-stack@2.2.0:
|
||||||
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
|
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
@ -1093,6 +1112,10 @@ packages:
|
||||||
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
|
resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
concat-map@0.0.1:
|
concat-map@0.0.1:
|
||||||
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
||||||
|
|
||||||
|
|
@ -1175,6 +1198,10 @@ packages:
|
||||||
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0:
|
||||||
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
|
||||||
delegates@1.0.0:
|
delegates@1.0.0:
|
||||||
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
|
||||||
|
|
||||||
|
|
@ -1251,6 +1278,10 @@ packages:
|
||||||
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
es-set-tostringtag@2.1.0:
|
||||||
|
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
esbuild@0.25.5:
|
esbuild@0.25.5:
|
||||||
resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
|
resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
|
@ -1398,6 +1429,15 @@ packages:
|
||||||
flatted@3.3.3:
|
flatted@3.3.3:
|
||||||
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
|
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
|
||||||
|
|
||||||
|
follow-redirects@1.15.11:
|
||||||
|
resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
|
||||||
|
engines: {node: '>=4.0'}
|
||||||
|
peerDependencies:
|
||||||
|
debug: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
debug:
|
||||||
|
optional: true
|
||||||
|
|
||||||
for-each@0.3.5:
|
for-each@0.3.5:
|
||||||
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
@ -1406,6 +1446,10 @@ packages:
|
||||||
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
form-data@4.0.4:
|
||||||
|
resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
formdata-polyfill@4.0.10:
|
formdata-polyfill@4.0.10:
|
||||||
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
|
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
|
||||||
engines: {node: '>=12.20.0'}
|
engines: {node: '>=12.20.0'}
|
||||||
|
|
@ -1857,10 +1901,18 @@ packages:
|
||||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
|
|
||||||
|
mime-db@1.52.0:
|
||||||
|
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mime-db@1.54.0:
|
mime-db@1.54.0:
|
||||||
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mime-types@3.0.1:
|
mime-types@3.0.1:
|
||||||
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
|
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
@ -2142,6 +2194,9 @@ packages:
|
||||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
|
||||||
|
proxy-from-env@1.1.0:
|
||||||
|
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
|
||||||
|
|
||||||
pump@3.0.3:
|
pump@3.0.3:
|
||||||
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
|
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
|
||||||
|
|
||||||
|
|
@ -3508,10 +3563,20 @@ snapshots:
|
||||||
'@babel/parser': 7.27.5
|
'@babel/parser': 7.27.5
|
||||||
ast-kit: 1.4.3
|
ast-kit: 1.4.3
|
||||||
|
|
||||||
|
asynckit@0.4.0: {}
|
||||||
|
|
||||||
available-typed-arrays@1.0.7:
|
available-typed-arrays@1.0.7:
|
||||||
dependencies:
|
dependencies:
|
||||||
possible-typed-array-names: 1.1.0
|
possible-typed-array-names: 1.1.0
|
||||||
|
|
||||||
|
axios@1.11.0:
|
||||||
|
dependencies:
|
||||||
|
follow-redirects: 1.15.11
|
||||||
|
form-data: 4.0.4
|
||||||
|
proxy-from-env: 1.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
base64-js@1.5.1: {}
|
base64-js@1.5.1: {}
|
||||||
|
|
@ -3637,6 +3702,8 @@ snapshots:
|
||||||
|
|
||||||
chownr@3.0.0: {}
|
chownr@3.0.0: {}
|
||||||
|
|
||||||
|
class-transformer@0.5.1: {}
|
||||||
|
|
||||||
clean-stack@2.2.0:
|
clean-stack@2.2.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
|
@ -3655,6 +3722,10 @@ snapshots:
|
||||||
color-support@1.1.3:
|
color-support@1.1.3:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
dependencies:
|
||||||
|
delayed-stream: 1.0.0
|
||||||
|
|
||||||
concat-map@0.0.1: {}
|
concat-map@0.0.1: {}
|
||||||
|
|
||||||
confbox@0.1.8: {}
|
confbox@0.1.8: {}
|
||||||
|
|
@ -3710,6 +3781,8 @@ snapshots:
|
||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
gopd: 1.2.0
|
gopd: 1.2.0
|
||||||
|
|
||||||
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
delegates@1.0.0:
|
delegates@1.0.0:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
|
@ -3772,6 +3845,13 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
|
|
||||||
|
es-set-tostringtag@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
es-errors: 1.3.0
|
||||||
|
get-intrinsic: 1.3.0
|
||||||
|
has-tostringtag: 1.0.2
|
||||||
|
hasown: 2.0.2
|
||||||
|
|
||||||
esbuild@0.25.5:
|
esbuild@0.25.5:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@esbuild/aix-ppc64': 0.25.5
|
'@esbuild/aix-ppc64': 0.25.5
|
||||||
|
|
@ -3992,6 +4072,8 @@ snapshots:
|
||||||
|
|
||||||
flatted@3.3.3: {}
|
flatted@3.3.3: {}
|
||||||
|
|
||||||
|
follow-redirects@1.15.11: {}
|
||||||
|
|
||||||
for-each@0.3.5:
|
for-each@0.3.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-callable: 1.2.7
|
is-callable: 1.2.7
|
||||||
|
|
@ -4001,6 +4083,14 @@ snapshots:
|
||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
signal-exit: 4.1.0
|
signal-exit: 4.1.0
|
||||||
|
|
||||||
|
form-data@4.0.4:
|
||||||
|
dependencies:
|
||||||
|
asynckit: 0.4.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
es-set-tostringtag: 2.1.0
|
||||||
|
hasown: 2.0.2
|
||||||
|
mime-types: 2.1.35
|
||||||
|
|
||||||
formdata-polyfill@4.0.10:
|
formdata-polyfill@4.0.10:
|
||||||
dependencies:
|
dependencies:
|
||||||
fetch-blob: 3.2.0
|
fetch-blob: 3.2.0
|
||||||
|
|
@ -4497,8 +4587,14 @@ snapshots:
|
||||||
braces: 3.0.3
|
braces: 3.0.3
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
|
|
||||||
|
mime-db@1.52.0: {}
|
||||||
|
|
||||||
mime-db@1.54.0: {}
|
mime-db@1.54.0: {}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
dependencies:
|
||||||
|
mime-db: 1.52.0
|
||||||
|
|
||||||
mime-types@3.0.1:
|
mime-types@3.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-db: 1.54.0
|
mime-db: 1.54.0
|
||||||
|
|
@ -4781,6 +4877,8 @@ snapshots:
|
||||||
forwarded: 0.2.0
|
forwarded: 0.2.0
|
||||||
ipaddr.js: 1.9.1
|
ipaddr.js: 1.9.1
|
||||||
|
|
||||||
|
proxy-from-env@1.1.0: {}
|
||||||
|
|
||||||
pump@3.0.3:
|
pump@3.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
end-of-stream: 1.4.5
|
end-of-stream: 1.4.5
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue