Merge branch 'nuxt4-p' into 'main'

migrate to Nuxt 4

See merge request PronounsPage/PronounsPage!648
This commit is contained in:
Valentyne Stigloher 2025-08-18 21:33:23 +00:00
commit 43e7e4a274
519 changed files with 2832 additions and 2329 deletions

View File

@ -45,7 +45,7 @@ check:
- end_section
- start_section "Type checking"
- pnpm nuxi typecheck || record_failure
- pnpm nuxt typecheck || record_failure
- end_section
- start_section "Unit Tests"
@ -112,7 +112,6 @@ build:
artifacts:
access: developer
paths:
- '.nuxt/tsconfig.json'
- '.output'
- 'locale'
- 'migrations'
@ -121,7 +120,7 @@ build:
- 'public/logo/logo-primary.svg'
- 'public/bg.png'
- 'server'
- 'src'
- 'shared'
- '.npmrc'
- '.nvmrc'
- 'LICENSE.md'
@ -129,7 +128,6 @@ build:
- 'package.json'
- 'pnpm-lock.yaml'
- 'run-wrapper.sh'
- 'tsconfig.json'
exclude:
- 'locale/*/docs/*'
- 'locale/*/img/*'

View File

@ -2,10 +2,10 @@
import { useNuxtApp } from 'nuxt/app';
import { useHead, useSeoMeta } from '#imports';
import { formatFonts } from '#shared/fonts.ts';
import useConfig from '~/composables/useConfig.ts';
import { getDefaultSeo } from '~/composables/useSimpleHead.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { formatFonts } from '~/src/fonts.ts';
const { $translator: translator } = useNuxtApp();
const config = useConfig();

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { AcademicReference } from '~/locale/config.ts';
import type { AcademicReference } from '~~/locale/config.ts';
defineProps<{
entry: AcademicReference;

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useMainStore } from '../store/index.ts';
import { useMainStore } from '~/store/index.ts';
const store = useMainStore();

View File

@ -4,14 +4,14 @@ import { useCookie, useFetch } from 'nuxt/app';
import useConfig from '../composables/useConfig.ts';
import useDialogue from '../composables/useDialogue.ts';
import { longtimeCookieSetting } from '../src/cookieSettings.ts';
import { newDate, gravatar } from '../src/helpers.ts';
import { socialProviders } from '../src/socialProviders.ts';
import { usernameRegex } from '../src/username.ts';
import { useMainStore } from '../store/index.ts';
import { longtimeCookieSetting } from '#shared/cookieSettings.ts';
import { newDate, gravatar } from '#shared/helpers.ts';
import type { Profile } from '#shared/profile.ts';
import { socialProviders } from '#shared/socialProviders.ts';
import { usernameRegex } from '#shared/username.ts';
import { getUrlForLocale, getUrlsForAllLocales } from '~/src/domain.ts';
import type { Profile } from '~/src/profile.ts';
import { useMainStore } from '~/store/index.ts';
const { $translator: translator, $setToken: setToken, $removeToken: removeToken } = useNuxtApp();
const runtimeConfig = useRuntimeConfig();
@ -614,7 +614,7 @@ const addBrackets = (str: string): string => {
</template>
<style lang="scss" scoped>
@import "assets/variables";
@import "~/assets/variables";
.profile-current {
border-inline-start: 3px solid $primary;

View File

@ -41,11 +41,12 @@
import { mapState } from 'pinia';
import useConfig from '../composables/useConfig.ts';
import adPlaceholders from '../src/adPlaceholders.ts';
import getAdsInternal from '../src/adsInternal.ts';
import { random, randomItemWeighted } from '../src/helpers.ts';
import { useMainStore } from '../store/index.ts';
import adPlaceholders from '#shared/adPlaceholders.ts';
import getAdsInternal from '#shared/adsInternal.ts';
import { random, randomItemWeighted } from '#shared/helpers.ts';
const MOBILE_BREAKPOINT = 992;
export default {

View File

@ -43,9 +43,9 @@
import { useFetch } from 'nuxt/app';
import { defineComponent } from 'vue';
import type { ContactAuthor } from '../../locale/config.ts';
import useConfig from '../composables/useConfig.ts';
import useSpelling from '../composables/useSpelling.ts';
import type { ContactAuthor } from '../locale/config.ts';
export default defineComponent({
props: {

View File

@ -1,8 +1,8 @@
<script setup lang="ts">
import { computedAsync } from '@vueuse/core';
import { fallbackAvatar, gravatar } from '~/src/helpers.ts';
import type { User } from '~/src/user.ts';
import { fallbackAvatar, gravatar } from '#shared/helpers.ts';
import type { User } from '#shared/user.ts';
interface AvatarUser extends Pick<User, 'username' | 'emailHash'> {
email?: User['email'];

View File

@ -1,6 +1,7 @@
<script setup lang="ts">
import useConfig from '../composables/useConfig.ts';
import { SourceLibrary } from '../src/classes.ts';
import { SourceLibrary } from '#shared/classes.ts';
const config = useConfig();

View File

@ -262,9 +262,9 @@
<script>
import useDialogue from '../composables/useDialogue.ts';
import forbidden from '../src/forbidden.ts';
import { sleep } from '../src/helpers.ts';
import forbidden from '#shared/forbidden.ts';
import { sleep } from '#shared/helpers.ts';
import { getUrlForLocale } from '~/src/domain.ts';
export default {

View File

@ -46,8 +46,9 @@ import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import useConfig from '../composables/useConfig.ts';
import { Day, iterateMonth, EventLevel, Year } from '../src/calendar/helpers.ts';
import { useMainStore } from '../store/index.ts';
import { Day, iterateMonth, EventLevel, Year } from '#shared/calendar/helpers.ts';
import { useMainStore } from '~/store/index.ts';
interface Data {
iterateMonth: typeof iterateMonth;

View File

@ -1,7 +1,8 @@
<script setup lang="ts">
import useConfig from '../composables/useConfig.ts';
import { Day } from '../src/calendar/helpers.ts';
import { loadCalendar } from '../src/data.ts';
import { Day } from '#shared/calendar/helpers.ts';
import { loadCalendar } from '~/src/data.ts';
const props = withDefaults(defineProps<{
day?: Day;

View File

@ -1,8 +1,7 @@
<script setup lang="ts">
import { EventLevel } from '../src/calendar/helpers.ts';
import type { Event, Day } from '../src/calendar/helpers.ts';
import { newDate } from '../src/helpers.ts';
import { EventLevel } from '#shared/calendar/helpers.ts';
import type { Event, Day } from '#shared/calendar/helpers.ts';
import { newDate } from '#shared/helpers.ts';
import { getUrlForLocale } from '~/src/domain.ts';
const props = withDefaults(defineProps<{

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Year } from '~/src/calendar/helpers.ts';
import type { Year } from '#shared/calendar/helpers.ts';
defineProps<{
year: Year;

View File

@ -1,9 +1,9 @@
<script setup lang="ts">
import type { Day, Year } from '#shared/calendar/helpers.ts';
import { socialLinks } from '#shared/contact.ts';
import { clearUrl, newDate } from '#shared/helpers.ts';
import useConfig from '~/composables/useConfig.ts';
import type { Day, Year } from '~/src/calendar/helpers.ts';
import { socialLinks } from '~/src/contact.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { clearUrl, newDate } from '~/src/helpers.ts';
const props = defineProps<{
day?: Day;

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import { iterateMonth } from '../src/calendar/helpers.ts';
import type { Event, Year } from '../src/calendar/helpers.ts';
import { iterateMonth } from '#shared/calendar/helpers.ts';
import type { Event, Year } from '#shared/calendar/helpers.ts';
interface TranslatedEvent extends Event {
translatedName: string;

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Category } from '~/src/classes.ts';
import type { Category } from '#shared/classes.ts';
const modelValue = defineModel<string[]>({ required: true });

View File

@ -2,7 +2,8 @@
import { useAsyncData } from 'nuxt/app';
import useConfig from '../composables/useConfig.ts';
import { fetchJson } from '../src/fetchJson.ts';
import { fetchJson } from '#shared/fetchJson.ts';
const props = withDefaults(defineProps<{
type: string;

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useMainStore } from '../store/index.ts';
import { useMainStore } from '~/store/index.ts';
const config = useConfig();

View File

@ -106,7 +106,8 @@
import draggable from 'vuedraggable';
import useDialogue from '../composables/useDialogue.ts';
import { curry, isValidLink } from '../src/helpers.ts';
import { curry, isValidLink } from '#shared/helpers.ts';
export default {
components: {

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Day } from '~/src/calendar/helpers.ts';
import type { Day } from '#shared/calendar/helpers.ts';
defineProps<{
day: Day;

View File

@ -47,7 +47,7 @@
import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import type { Color, ModalSize } from '../src/bootstrap.ts';
import type { Color, ModalSize } from '#shared/bootstrap.ts';
export interface DialogueMessage {
icon?: string;

View File

@ -82,7 +82,7 @@ export default {
</script>
<style lang="scss" scoped>
@import "assets/variables";
@import "~/assets/variables";
ins {
background-color: $green-200;
padding: .2em;

View File

@ -43,9 +43,10 @@ import { mapState } from 'pinia';
import useConfig from '../composables/useConfig.ts';
import useDialogue from '../composables/useDialogue.ts';
import { longtimeCookieSetting } from '../src/cookieSettings.ts';
import { useMainStore } from '../store/index.ts';
import { longtimeCookieSetting } from '#shared/cookieSettings.ts';
const konami = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'];
const EGGS_BY_LOCALE = {

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import type { ExampleCategory, PronounExample, Pronoun } from '~/src/classes.ts';
import { randomItem } from '~/src/helpers.ts';
import type { ExampleCategory, PronounExample, Pronoun } from '#shared/classes.ts';
import { randomItem } from '#shared/helpers.ts';
const props = withDefaults(defineProps<{
exampleCategory: ExampleCategory;

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Example, ExampleValues } from '~/src/language/examples.ts';
import type { Example, ExampleValues } from '#shared/language/examples.ts';
const props = defineProps<{
example: Example;

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Category } from '~/src/classes.ts';
import type { Category } from '#shared/classes.ts';
const filter = defineModel<string>();
const filterCategory = defineModel<string>('category');

View File

@ -1,8 +1,8 @@
<script setup lang="ts">
import useConfig from '../composables/useConfig.ts';
import { randomNumber, sleep } from '../src/helpers.ts';
import type { TermsEntryRaw } from '~/src/classes.ts';
import type { TermsEntryRaw } from '#shared/classes.ts';
import { randomNumber, sleep } from '#shared/helpers.ts';
const props = defineProps<{
termkey?: string;

View File

@ -1,9 +1,9 @@
<script setup lang="ts">
import { buildPronoun } from '~/src/buildPronoun.ts';
import type { Pronoun } from '~/src/classes.ts';
import { buildPronoun } from '#shared/buildPronoun.ts';
import type { Pronoun } from '#shared/classes.ts';
import { buildFlags } from '#shared/flags.ts';
import type { Flag } from '#shared/flags.ts';
import { loadPronouns } from '~/src/data.ts';
import { buildFlags } from '~/src/flags.ts';
import type { Flag } from '~/src/flags.ts';
const props = defineProps<{
mainPronoun?: Pronoun | null;

View File

@ -1,11 +1,11 @@
<script setup lang="ts">
import { useFetch } from 'nuxt/app';
import { getContactLinks, getSocialLinks } from '#shared/contact.ts';
import { sessionCookieSetting } from '#shared/cookieSettings.ts';
import { groupBy } from '#shared/helpers.ts';
import useConfig from '~/composables/useConfig.ts';
import useDialogue from '~/composables/useDialogue.ts';
import { getContactLinks, getSocialLinks } from '~/src/contact.ts';
import { sessionCookieSetting } from '~/src/cookieSettings.ts';
import { groupBy } from '~/src/helpers.ts';
import { useMainStore } from '~/store/index.ts';
const translationModeVisibleCookie = useCookie('translationModeVisible', sessionCookieSetting);

View File

@ -1,9 +1,9 @@
<script setup lang="ts">
import type { Example, ExampleValues } from '#shared/language/examples.ts';
import { expandVariantsForSection } from '#shared/language/grammarTables.ts';
import type { GrammarTableDefinition, Variant, SectionDefinition } from '#shared/language/grammarTables.ts';
import { symbolsByNumeri } from '#shared/nouns.ts';
import { loadGrammarTableVariantsConverter } from '~/src/data.ts';
import type { Example, ExampleValues } from '~/src/language/examples.ts';
import { expandVariantsForSection } from '~/src/language/grammarTables.ts';
import type { GrammarTableDefinition, Variant, SectionDefinition } from '~/src/language/grammarTables.ts';
import { symbolsByNumeri } from '~/src/nouns.ts';
const props = defineProps<{
grammarTable: GrammarTableDefinition;

View File

@ -3,12 +3,12 @@ import { DateTime } from 'luxon';
import type { RouteLocationRaw } from 'vue-router';
import useConfig from '../composables/useConfig.ts';
import forbidden from '../src/forbidden.ts';
import type { User } from '../src/user.ts';
import { useMainStore } from '../store/index.ts';
import forbidden from '#shared/forbidden.ts';
import { newDate } from '#shared/helpers.ts';
import type { User } from '#shared/user.ts';
import type SearchDialogue from '~/components/search/SearchDialogue.vue';
import { newDate } from '~/src/helpers.ts';
import { useMainStore } from '~/store/index.ts';
type HeaderTo = { link: string; name?: never } | { name: string; link?: never };
@ -38,7 +38,7 @@ const today = newDate();
const { user } = storeToRefs(useMainStore());
const links = computed((): HeaderLink[] => {
// remember to modify ~/server/api/search.get.ts, page kind too
// remember to modify ~~/server/api/search.get.ts, page kind too
const links: HeaderLink[] = [];
links.push({
@ -537,7 +537,7 @@ const dismissCensus = (): void => {
</template>
<style lang="scss" scoped>
@import "assets/variables";
@import "~/assets/variables";
header {
padding: 0;

View File

@ -18,9 +18,9 @@
import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import BlueSky from '~/public/img/bluesky.svg';
import blueSkySvg from '~~/public/img/bluesky.svg?raw';
const svgDataToHtml = (svgDataString: string): string => decodeURI(svgDataString).replace(/^.*<svg /, '<svg class="icon" ');
const postprocessSvg = (svg: string): string => svg.replace('<svg ', '<svg class="icon" ');
const buildQueue = (v: string | (string | undefined)[] | null): { value: string; fallbacks: string[]; svgs: Record<string, any> } => {
const rawValues = Array.isArray(v) ? v : [v];
@ -34,7 +34,7 @@ const buildQueue = (v: string | (string | undefined)[] | null): { value: string;
value: values.shift()!,
fallbacks: values,
svgs: {
bluesky: svgDataToHtml(BlueSky),
bluesky: postprocessSvg(blueSkySvg),
},
};
};

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import iconsMetadata from '~/src/iconsMetadata.ts';
import type { IconMetadata } from '~/src/iconsMetadata.ts';
import iconsMetadata from '#shared/iconsMetadata.ts';
import type { IconMetadata } from '#shared/iconsMetadata.ts';
const props = withDefaults(defineProps<{
styles?: IconMetadata['styles'];

View File

@ -18,8 +18,8 @@
<script lang="ts">
import { defineComponent } from 'vue';
import { buildImageUrl } from '../src/helpers.ts';
import { useMainStore } from '../store/index.ts';
import { buildImageUrl } from '#shared/helpers.ts';
import { useMainStore } from '~/store/index.ts';
export default defineComponent({
props: {

View File

@ -60,7 +60,8 @@
import draggable from 'vuedraggable';
import useDialogue from '../composables/useDialogue.ts';
import { curry } from '../src/helpers.ts';
import { curry } from '#shared/helpers.ts';
export default {
components: {

View File

@ -1,10 +1,10 @@
<script setup lang="ts">
import type { ComponentExposed } from 'vue-component-type-helpers';
import { InclusiveEntry } from '#shared/classes.ts';
import { buildDict, clearUrl, clearLinkedText } from '#shared/helpers.ts';
import type InclusiveSubmitForm from '~/components/InclusiveSubmitForm.vue';
import type Table from '~/components/Table.vue';
import { InclusiveEntry } from '~/src/classes.ts';
import { buildDict, clearUrl, clearLinkedText } from '~/src/helpers.ts';
const props = defineProps<{
load?: boolean;
@ -361,7 +361,7 @@ const remove = async (entry: InclusiveEntry): Promise<void> => {
</template>
<style scoped lang="scss">
@import "assets/variables";
@import "~/assets/variables";
:deep(.row-header) {
grid-template-columns: 1fr 1fr;

View File

@ -96,7 +96,8 @@ import { defineComponent } from 'vue';
import useConfig from '../composables/useConfig.ts';
import useDialogue from '../composables/useDialogue.ts';
import type { InclusiveEntry } from '../src/classes.ts';
import type { InclusiveEntry } from '#shared/classes.ts';
interface Data {
form: {

View File

@ -29,11 +29,11 @@
<script>
import { defineComponent, reactive } from 'vue';
import locales from '../../locale/locales.ts';
import walsLanguages from '../assets/languages.tsv';
import locales from '../locale/locales.ts';
import { clearUrl } from '#shared/helpers.ts';
import useDark from '~/composables/useDark.ts';
import { clearUrl } from '~/src/helpers.ts';
const MOBILE_BREAKPOINT = 992;

View File

@ -26,8 +26,8 @@
<script lang="ts">
import { defineComponent } from 'vue';
import type { LocaleDescription } from '../../locale/locales.ts';
import useConfig from '../composables/useConfig.ts';
import type { LocaleDescription } from '../locale/locales.ts';
import { getUrlForLocale } from '~/src/domain.ts';

View File

@ -1,7 +1,7 @@
<script setup lang="ts">
import opinions from '../src/opinions.ts';
import type { Opinion } from '../src/opinions.ts';
import { colours, styles } from '../src/styling.ts';
import opinions from '#shared/opinions.ts';
import type { Opinion } from '#shared/opinions.ts';
import { colours, styles } from '#shared/styling.ts';
const props = defineProps<{
readonly?: boolean;
@ -96,7 +96,7 @@ const validation = (v: Opinion) => {
</template>
<style lang="scss" scoped>
@import "assets/variables";
@import "~/assets/variables";
// TODO
select > option.small {

View File

@ -13,7 +13,7 @@
import { storeToRefs } from 'pinia';
import { defineComponent } from 'vue';
import { useMainStore } from '../store/index.ts';
import { useMainStore } from '~/store/index.ts';
export default defineComponent({
setup() {

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { Link } from '~/locale/config.ts';
import type { Link } from '~~/locale/config.ts';
defineProps<{
link: Link;

View File

@ -4,11 +4,11 @@ import type { VNode } from 'vue';
import useConfig from '../composables/useConfig.ts';
import useSpelling from '../composables/useSpelling.ts';
import { escapeHtml } from '../src/helpers.ts';
import Icon from './Icon.vue';
import { NuxtLink } from '#components';
import { escapeHtml } from '#shared/helpers.ts';
export default defineComponent({
props: {

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useMainStore } from '../store/index.ts';
import { useMainStore } from '~/store/index.ts';
const config = useConfig();

View File

@ -71,7 +71,7 @@
<script>
import draggable from 'vuedraggable';
import { curry } from '../src/helpers.ts';
import { curry } from '#shared/helpers.ts';
export default {
components: {

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import { getPronoun } from '~/src/buildPronoun.ts';
import type { Pronoun, Source } from '~/src/classes.ts';
import { getPronoun } from '#shared/buildPronoun.ts';
import type { Pronoun, Source } from '#shared/classes.ts';
import { loadPronouns } from '~/src/data.ts';
const props = defineProps<{

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { LocaleDescription } from '~/locale/locales.js';
import type { LocaleDescription } from '~~/locale/locales.js';
defineProps<{
locale: LocaleDescription;

View File

@ -1,8 +1,8 @@
<script setup lang="ts">
import { fontHeadingsByLocale } from '~/locale/fonts.ts';
import type { LocaleDescription } from '~/locale/locales.ts';
import { formatFonts } from '#shared/fonts.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { formatFonts } from '~/src/fonts.ts';
import { fontHeadingsByLocale } from '~~/locale/fonts.ts';
import type { LocaleDescription } from '~~/locale/locales.ts';
withDefaults(defineProps<{
locales: Record<string, LocaleDescription>;

View File

@ -2,9 +2,9 @@
import { importSPKI, jwtVerify } from 'jose';
import type { FetchOptions } from 'ofetch';
import { socialProviders } from '#shared/socialProviders.ts';
import type { User } from '#shared/user.ts';
import { getUrlForLocale } from '~/src/domain.ts';
import { socialProviders } from '~/src/socialProviders.ts';
import type { User } from '~/src/user.ts';
const { $setToken: setToken } = useNuxtApp();
const runtimeConfig = useRuntimeConfig();

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