add gitea ci
This commit is contained in:
		
							parent
							
								
									7eed008f13
								
							
						
					
					
						commit
						0fd947c78f
					
				@ -1,5 +1,8 @@
 | 
			
		||||
Dockerfile
 | 
			
		||||
*.dockerfile
 | 
			
		||||
.dockerignore
 | 
			
		||||
.gitignore
 | 
			
		||||
*~
 | 
			
		||||
node_modules
 | 
			
		||||
npm-debug.log
 | 
			
		||||
README.md
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										32
									
								
								.gitea/workflows/builder.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								.gitea/workflows/builder.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
name: ci
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - 'main'
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
        name: Check out code
 | 
			
		||||
        # idk if I need this. is it automatically gathered from the act runner?
 | 
			
		||||
        # with:
 | 
			
		||||
        #   repository: https://gitea.futureporn.net/futureporn/fp
 | 
			
		||||
 | 
			
		||||
      - uses: mr-smithers-excellent/docker-build-push@v6
 | 
			
		||||
        name: Build & push fp/next Docker image
 | 
			
		||||
        with:
 | 
			
		||||
          image: gitea.futureporn.net/futureporn/next
 | 
			
		||||
          tags: latest
 | 
			
		||||
          # which 'registry:' version do I need?
 | 
			
		||||
          registry: https://gitea.futureporn.net
 | 
			
		||||
          # registry: https://gitea.futureporn.net/futureporn
 | 
			
		||||
          dockerfile: packages/next/Dockerfile
 | 
			
		||||
          username: ${{ secrets.DOCKER_USERNAME }}
 | 
			
		||||
          password: ${{ secrets.DOCKER_PASSWORD }}
 | 
			
		||||
 | 
			
		||||
# docker push gitea.futureporn.net/cj_clippy/link2cid:latest
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
							
								
								
									
										42
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
include .env
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
secrets:
 | 
			
		||||
	kubectl delete secret link2cid --ignore-not-found
 | 
			
		||||
	kubectl create secret generic link2cid \
 | 
			
		||||
	--from-literal=apiKey=${LINK2CID_API_KEY}
 | 
			
		||||
 | 
			
		||||
	kubectl delete secret vultr
 | 
			
		||||
	kubectl create secret generic vultr \
 | 
			
		||||
	--from-literal=vultr=${VULTR_CONTAINER_REGISTRY_USERNAME}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# --from-literal=sessionSecret=$(SESSION_SECRET) \
 | 
			
		||||
# --from-literal=twitchClientId=$(TWITCH_CLIENT_ID) \
 | 
			
		||||
# --from-literal=twitchClientSecret=$(TWITCH_CLIENT_SECRET) \
 | 
			
		||||
# --from-literal=gumroadClientId=$(GUMROAD_CLIENT_ID) \
 | 
			
		||||
# --from-literal=gumroadClientSecret=$(GUMROAD_CLIENT_SECRET)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
define _script
 | 
			
		||||
cat <<'EOF' | ctlptl apply -f -
 | 
			
		||||
apiVersion: ctlptl.dev/v1alpha1
 | 
			
		||||
kind: Cluster
 | 
			
		||||
product: minikube
 | 
			
		||||
registry: ctlptl-registry
 | 
			
		||||
kubernetesVersion: v1.28.3
 | 
			
		||||
EOF
 | 
			
		||||
endef
 | 
			
		||||
export script = $(value _script)
 | 
			
		||||
cluster:
 | 
			
		||||
	@ eval "$$script"
 | 
			
		||||
	minikube addons enable volumesnapshots
 | 
			
		||||
	minikube addons enable csi-hostpath-driver
 | 
			
		||||
	minikube addons enable metrics-server
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# A gitea act runner which runs locally
 | 
			
		||||
# https://docs.gitea.com/next/usage/actions/overview
 | 
			
		||||
runner:
 | 
			
		||||
	docker run -d --rm -e GITEA_INSTANCE_URL=https://gitea.futureporn.net -e GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN} -v /var/run/docker.sock:/var/run/docker.sock --name fp-gitea-act-runner gitea/act_runner:latest
 | 
			
		||||
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							@ -1,6 +1,25 @@
 | 
			
		||||
# futureporn-monorepo
 | 
			
		||||
 | 
			
		||||
## minikube setup
 | 
			
		||||
## development
 | 
			
		||||
 | 
			
		||||
minikube addons enable volumesnapshots
 | 
			
		||||
minikube addons enable csi-hostpath-driver
 | 
			
		||||
[Tilt](https://docs.tilt.dev/) Handles auto-reloading dev containers when making changes to code.
 | 
			
		||||
 | 
			
		||||
### dependencies
 | 
			
		||||
 | 
			
		||||
docker
 | 
			
		||||
minikube
 | 
			
		||||
ctlptl
 | 
			
		||||
tilt
 | 
			
		||||
 | 
			
		||||
### setup
 | 
			
		||||
 | 
			
		||||
I would love for this to be a single command, `tilt up`, but minikube needs to get started and needs some addons.
 | 
			
		||||
 | 
			
		||||
@todo figure out a way to incorporate the minikube setup with `tilt up`
 | 
			
		||||
 | 
			
		||||
When enabling `csi-hostpath-driver`, it appears like it's locked up, but be sure to be patient and WAIT. It's just slow.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
make cluster
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										7
									
								
								Tiltfile
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								Tiltfile
									
									
									
									
									
								
							@ -10,10 +10,9 @@ docker_build('fp/link2cid', './packages/link2cid')
 | 
			
		||||
docker_build(
 | 
			
		||||
    'fp/strapi',
 | 
			
		||||
    './packages/strapi',
 | 
			
		||||
    dockerfile="prod.dockerfile"
 | 
			
		||||
    # live_update=[
 | 
			
		||||
    #     sync('./packages/strapi', '/app')
 | 
			
		||||
    # ]
 | 
			
		||||
    live_update=[
 | 
			
		||||
        sync('./packages/strapi', '/app')
 | 
			
		||||
    ]
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								charts/fp/templates-old/helloworldy.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								charts/fp/templates-old/helloworldy.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: helloworldy
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: helloworldy
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: helloworldy
 | 
			
		||||
      image: {{ .Values.helloworldy.containerName }}
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 3000
 | 
			
		||||
      resources: {}
 | 
			
		||||
      livenessProbe:
 | 
			
		||||
        httpGet:
 | 
			
		||||
          path: /
 | 
			
		||||
          port: 3000
 | 
			
		||||
        initialDelaySeconds: 3
 | 
			
		||||
        periodSeconds: 3
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
							
								
								
									
										35
									
								
								charts/fp/templates-old/ipfs-deployment.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								charts/fp/templates-old/ipfs-deployment.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,35 @@
 | 
			
		||||
apiVersion: apps/v1
 | 
			
		||||
kind: Deployment
 | 
			
		||||
metadata:
 | 
			
		||||
  name: ipfs-deployment
 | 
			
		||||
  labels:
 | 
			
		||||
    app: ipfs
 | 
			
		||||
    app.kubernetes.io/name: ipfs
 | 
			
		||||
spec:
 | 
			
		||||
  replicas: 1
 | 
			
		||||
  selector:
 | 
			
		||||
    matchLabels:
 | 
			
		||||
      app: ipfs
 | 
			
		||||
  template:
 | 
			
		||||
    metadata:
 | 
			
		||||
      labels:
 | 
			
		||||
        app: ipfs
 | 
			
		||||
    spec:
 | 
			
		||||
      containers:
 | 
			
		||||
        - name: ipfs
 | 
			
		||||
          image: ipfs/kubo:release
 | 
			
		||||
          livenessProbe:
 | 
			
		||||
            httpGet:
 | 
			
		||||
              path: /version
 | 
			
		||||
              port: 5001
 | 
			
		||||
            initialDelaySeconds: 3
 | 
			
		||||
            periodSeconds: 3
 | 
			
		||||
          resources:
 | 
			
		||||
            limits:
 | 
			
		||||
              cpu: 500m
 | 
			
		||||
              memory: 512Mi
 | 
			
		||||
      imagePullSecrets:
 | 
			
		||||
        - name: regcred
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 5001
 | 
			
		||||
        - containerPort: 8080
 | 
			
		||||
@ -1,26 +0,0 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  annotations:
 | 
			
		||||
    kompose.cmd: kompose convert --file compose.yml -c --out ./charts
 | 
			
		||||
    kompose.version: 1.26.0 (40646f47)
 | 
			
		||||
  creationTimestamp: null
 | 
			
		||||
  labels:
 | 
			
		||||
    io.kompose.service: ipfs0
 | 
			
		||||
  name: ipfs0
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - image: ipfs/kubo:release
 | 
			
		||||
      name: fp-ipfs0
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 5001
 | 
			
		||||
      resources: {}
 | 
			
		||||
      volumeMounts:
 | 
			
		||||
        - mountPath: /data/ipfs
 | 
			
		||||
          name: ipfs0-claim0
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
  volumes:
 | 
			
		||||
    - name: ipfs0-claim0
 | 
			
		||||
      persistentVolumeClaim:
 | 
			
		||||
        claimName: ipfs0-claim0
 | 
			
		||||
status: {}
 | 
			
		||||
							
								
								
									
										13
									
								
								charts/fp/templates-old/loadbalancer.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								charts/fp/templates-old/loadbalancer.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: loadbalancer
 | 
			
		||||
spec:
 | 
			
		||||
  type: LoadBalancer
 | 
			
		||||
  selector:
 | 
			
		||||
    app: next-service
 | 
			
		||||
  ports:
 | 
			
		||||
  - protocol: TCP
 | 
			
		||||
    port: 3000
 | 
			
		||||
    targetPort: 3000
 | 
			
		||||
    name: next-service
 | 
			
		||||
@ -4,7 +4,6 @@ metadata:
 | 
			
		||||
  annotations:
 | 
			
		||||
    kompose.cmd: kompose convert --file compose.yml -c --out ./charts
 | 
			
		||||
    kompose.version: 1.26.0 (40646f47)
 | 
			
		||||
  creationTimestamp: null
 | 
			
		||||
  labels:
 | 
			
		||||
    io.kompose.service: strapi
 | 
			
		||||
  name: strapi
 | 
			
		||||
@ -52,7 +51,10 @@ spec:
 | 
			
		||||
      name: fp-strapi
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 1337
 | 
			
		||||
      resources: {}
 | 
			
		||||
      resources: 
 | 
			
		||||
        limits:
 | 
			
		||||
          cpu: 500m
 | 
			
		||||
          memory: 1Gi
 | 
			
		||||
      volumeMounts:
 | 
			
		||||
        - mountPath: /opt/app
 | 
			
		||||
          name: strapi-claim0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								charts/fp/templates-old/vultr-credentials-provider.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								charts/fp/templates-old/vultr-credentials-provider.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
apiVersion: kubelet.config.k8s.io/v1
 | 
			
		||||
kind: CredentialProviderConfig
 | 
			
		||||
providers:
 | 
			
		||||
  - name: vultr-credential-provider
 | 
			
		||||
    matchImages:
 | 
			
		||||
      - "sjc.vultrcr.com/*"
 | 
			
		||||
    defaultCacheDuration: "12h"
 | 
			
		||||
    apiVersion: credentialprovider.kubelet.k8s.io/v1
 | 
			
		||||
							
								
								
									
										16
									
								
								charts/fp/templates-staging/issuer-lets-encrypt-staging.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								charts/fp/templates-staging/issuer-lets-encrypt-staging.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
# issuer-lets-encrypt-staging.yaml
 | 
			
		||||
apiVersion: cert-manager.io/v1
 | 
			
		||||
kind: Issuer
 | 
			
		||||
metadata:
 | 
			
		||||
  name: letsencrypt-staging
 | 
			
		||||
spec:
 | 
			
		||||
  acme:
 | 
			
		||||
    server: https://acme-staging-v02.api.letsencrypt.org/directory
 | 
			
		||||
    preferredChain: "ISRG Root X1"
 | 
			
		||||
    email: cj@futureporn.net
 | 
			
		||||
    privateKeySecretRef:
 | 
			
		||||
      name: letsencrypt-staging
 | 
			
		||||
    solvers:
 | 
			
		||||
    - http01:
 | 
			
		||||
        ingress:
 | 
			
		||||
          name: web-ingress
 | 
			
		||||
							
								
								
									
										23
									
								
								charts/fp/templates-staging/next-ingress.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								charts/fp/templates-staging/next-ingress.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
 apiVersion: networking.k8s.io/v1
 | 
			
		||||
 kind: Ingress
 | 
			
		||||
 metadata:
 | 
			
		||||
   name: next-ingress
 | 
			
		||||
   annotations:
 | 
			
		||||
     kubernetes.io/ingress.class: nginx
 | 
			
		||||
     cert-manager.io/cluster-issuer: letsencrypt-staging
 | 
			
		||||
 spec:
 | 
			
		||||
   tls:
 | 
			
		||||
     - secretName: next-tls
 | 
			
		||||
       hosts:
 | 
			
		||||
         - fp.sbtp.xyz
 | 
			
		||||
   rules:
 | 
			
		||||
     - host: fp.sbtp.xyz
 | 
			
		||||
       http:
 | 
			
		||||
         paths:
 | 
			
		||||
           - path: /
 | 
			
		||||
             pathType: Prefix
 | 
			
		||||
             backend:
 | 
			
		||||
               service:
 | 
			
		||||
                 name: next-service
 | 
			
		||||
                 port:
 | 
			
		||||
                   number: 80
 | 
			
		||||
							
								
								
									
										37
									
								
								charts/fp/templates-staging/pgadmin-pod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								charts/fp/templates-staging/pgadmin-pod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: pgadmin-pod
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: pgadmin
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: pgadmin
 | 
			
		||||
      image: dpage/pgadmin4
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 5050
 | 
			
		||||
      resources:
 | 
			
		||||
        limits:
 | 
			
		||||
          cpu: 500m
 | 
			
		||||
          memory: 1Gi
 | 
			
		||||
      env:
 | 
			
		||||
        - name: PGADMIN_LISTEN_PORT
 | 
			
		||||
          value: '5050'
 | 
			
		||||
        - name: POSTGRES_PASSWORD
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: postgres
 | 
			
		||||
              key: password
 | 
			
		||||
        - name: PGADMIN_DEFAULT_PASSWORD
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: pgadmin
 | 
			
		||||
              key: defaultPassword
 | 
			
		||||
        - name: PGADMIN_DEFAULT_EMAIL
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: pgadmin
 | 
			
		||||
              key: defaultEmail           
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
							
								
								
									
										14
									
								
								charts/fp/templates-staging/pgadmin-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								charts/fp/templates-staging/pgadmin-service.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: pgadmin-service
 | 
			
		||||
spec:
 | 
			
		||||
  selector:
 | 
			
		||||
    app.kubernetes.io/name: pgadmin
 | 
			
		||||
  ports:
 | 
			
		||||
    - name: web
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 5050
 | 
			
		||||
      targetPort: 5050
 | 
			
		||||
status:
 | 
			
		||||
  loadBalancer: {}
 | 
			
		||||
							
								
								
									
										27
									
								
								charts/fp/templates-staging/postgres-pod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								charts/fp/templates-staging/postgres-pod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: postgres-pod
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: postgres
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: postgres
 | 
			
		||||
      image: postgres:16.0
 | 
			
		||||
      env:
 | 
			
		||||
        - name: POSTGRES_PASSWORD
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: postgres
 | 
			
		||||
              key: password
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 5432
 | 
			
		||||
      resources: {}
 | 
			
		||||
      volumeMounts:
 | 
			
		||||
        - name: postgres-pvc
 | 
			
		||||
          mountPath: /data/postgres
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
  volumes:
 | 
			
		||||
    - name: postgres-pvc
 | 
			
		||||
      persistentVolumeClaim:
 | 
			
		||||
        claimName: postgres-pvc
 | 
			
		||||
							
								
								
									
										13
									
								
								charts/fp/templates-staging/postgres-pvc.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								charts/fp/templates-staging/postgres-pvc.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: PersistentVolumeClaim
 | 
			
		||||
metadata:
 | 
			
		||||
  name: postgres-pvc
 | 
			
		||||
spec:
 | 
			
		||||
  accessModes:
 | 
			
		||||
    - ReadWriteOnce
 | 
			
		||||
  resources:
 | 
			
		||||
    requests:
 | 
			
		||||
      storage: 40Gi
 | 
			
		||||
  allowVolumeExpansion: true
 | 
			
		||||
  storageClassName: {{ .Values.storageClassName }}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								charts/fp/templates-staging/postgres-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								charts/fp/templates-staging/postgres-service.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: postgres-service
 | 
			
		||||
spec:
 | 
			
		||||
  selector:
 | 
			
		||||
    app.kubernetes.io/name: postgres
 | 
			
		||||
  ports:
 | 
			
		||||
    - name: db
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 5432
 | 
			
		||||
      targetPort: 5432
 | 
			
		||||
status:
 | 
			
		||||
  loadBalancer: {}
 | 
			
		||||
							
								
								
									
										108
									
								
								charts/fp/templates-staging/strapi-pod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								charts/fp/templates-staging/strapi-pod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,108 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: strapi-pod
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: strapi-pod
 | 
			
		||||
      image: {{ .Values.strapi.containerName }}
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 1337
 | 
			
		||||
      env:
 | 
			
		||||
        - name: ADMIN_JWT_SECRET
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: ADMIN_JWT_SECRET
 | 
			
		||||
        - name: API_TOKEN_SALT
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: API_TOKEN_SALT
 | 
			
		||||
        - name: APP_KEYS
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: APP_KEYS
 | 
			
		||||
        - name: DATABASE_URL
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: DATABASE_URL
 | 
			
		||||
        - name: CDN_BUCKET_USC_URL
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: CDN_BUCKET_USC_URL
 | 
			
		||||
        - name: DATABASE_CLIENT
 | 
			
		||||
          value: postgres
 | 
			
		||||
        - name: DATABASE_HOST
 | 
			
		||||
          value: postgres-service
 | 
			
		||||
        - name: DATABASE_NAME
 | 
			
		||||
          value: futureporn-strapi
 | 
			
		||||
        - name: JWT_SECRET
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: JWT_SECRET
 | 
			
		||||
        - name: MUX_PLAYBACK_RESTRICTION_ID
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: MUX_PLAYBACK_RESTRICTION_ID
 | 
			
		||||
        - name: MUX_SIGNING_KEY_ID
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: MUX_SIGNING_KEY_ID
 | 
			
		||||
        - name: MUX_SIGNING_KEY_PRIVATE_KEY
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: MUX_SIGNING_KEY_PRIVATE_KEY
 | 
			
		||||
        - name: NODE_ENV
 | 
			
		||||
          value: production
 | 
			
		||||
        - name: S3_USC_BUCKET_APPLICATION_KEY
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: S3_USC_BUCKET_APPLICATION_KEY
 | 
			
		||||
        - name: S3_USC_BUCKET_ENDPOINT
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: S3_USC_BUCKET_ENDPOINT
 | 
			
		||||
        - name: S3_USC_BUCKET_KEY_ID
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: S3_USC_BUCKET_KEY_ID
 | 
			
		||||
        - name: S3_USC_BUCKET_NAME
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: S3_USC_BUCKET_NAME
 | 
			
		||||
        - name: S3_USC_BUCKET_REGION
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: S3_USC_BUCKET_REGION
 | 
			
		||||
        - name: SENDGRID_API_KEY
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: SENDGRID_API_KEY
 | 
			
		||||
        - name: STRAPI_URL
 | 
			
		||||
          value: {{ .Values.strapi.url }}
 | 
			
		||||
        - name: TRANSFER_TOKEN_SALT
 | 
			
		||||
          valueFrom:
 | 
			
		||||
            secretKeyRef:
 | 
			
		||||
              name: strapi
 | 
			
		||||
              key: TRANSFER_TOKEN_SALT
 | 
			
		||||
        - name: PORT
 | 
			
		||||
          value: "{{ .Values.strapi.port }}"
 | 
			
		||||
      resources:
 | 
			
		||||
        limits:
 | 
			
		||||
          cpu: 500m
 | 
			
		||||
          memory: 1Gi   
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
							
								
								
									
										14
									
								
								charts/fp/templates-staging/strapi-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								charts/fp/templates-staging/strapi-service.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: strapi-service
 | 
			
		||||
spec:
 | 
			
		||||
  selector:
 | 
			
		||||
    app.kubernetes.io/name: strapi
 | 
			
		||||
  ports:
 | 
			
		||||
    - name: web
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 1337
 | 
			
		||||
      targetPort: 1337
 | 
			
		||||
status:
 | 
			
		||||
  loadBalancer: {}
 | 
			
		||||
							
								
								
									
										23
									
								
								charts/fp/templates-staging/vultr-cert-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								charts/fp/templates-staging/vultr-cert-issuer.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
apiVersion: cert-manager.io/v1
 | 
			
		||||
kind: ClusterIssuer
 | 
			
		||||
metadata:
 | 
			
		||||
  name: letsencrypt-staging
 | 
			
		||||
spec:
 | 
			
		||||
  acme:
 | 
			
		||||
    # You must replace this email address with your own.
 | 
			
		||||
    # Let's Encrypt will use this to contact you about expiring
 | 
			
		||||
    # certificates, and issues related to your account.
 | 
			
		||||
    email: cj@futureporn.net
 | 
			
		||||
    server: https://acme-staging-v02.api.letsencrypt.org/directory
 | 
			
		||||
    privateKeySecretRef:
 | 
			
		||||
      # Secret resource that will be used to store the account's private key.
 | 
			
		||||
      name: letsencrypt-staging
 | 
			
		||||
    solvers:
 | 
			
		||||
    - dns01:
 | 
			
		||||
        webhook:
 | 
			
		||||
          groupName: acme.vultr.com
 | 
			
		||||
          solverName: vultr
 | 
			
		||||
          config:
 | 
			
		||||
            apiKeySecretRef:
 | 
			
		||||
              key: apiKey
 | 
			
		||||
              name: vultr-credentials
 | 
			
		||||
							
								
								
									
										18
									
								
								charts/fp/templates-staging/vultr-load-balancer.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								charts/fp/templates-staging/vultr-load-balancer.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  annotations:
 | 
			
		||||
    service.beta.kubernetes.io/vultr-loadbalancer-protocol: "http"
 | 
			
		||||
    service.beta.kubernetes.io/vultr-loadbalancer-https-ports: "443"
 | 
			
		||||
    # You will need to have created a TLS Secret and pass in the name as the value
 | 
			
		||||
    service.beta.kubernetes.io/vultr-loadbalancer-ssl: "ssl-secret"
 | 
			
		||||
  name: vultr-lb-https
 | 
			
		||||
spec:
 | 
			
		||||
  type: LoadBalancer
 | 
			
		||||
  selector:
 | 
			
		||||
    app: next-service
 | 
			
		||||
  ports:
 | 
			
		||||
    - port: 80
 | 
			
		||||
      name: "http"
 | 
			
		||||
    - port: 443
 | 
			
		||||
      name: "https"
 | 
			
		||||
							
								
								
									
										22
									
								
								charts/fp/templates/ipfs-pod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								charts/fp/templates/ipfs-pod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: ipfs-pod
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: ipfs
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: ipfs
 | 
			
		||||
      image: ipfs/kubo
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 5001
 | 
			
		||||
        - containerPort: 8080
 | 
			
		||||
      resources: {}
 | 
			
		||||
      volumeMounts:
 | 
			
		||||
        - name: ipfs-pvc
 | 
			
		||||
          mountPath: /data/ipfs
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
  volumes:
 | 
			
		||||
    - name: ipfs-pvc
 | 
			
		||||
      persistentVolumeClaim:
 | 
			
		||||
        claimName: ipfs-pvc
 | 
			
		||||
							
								
								
									
										13
									
								
								charts/fp/templates/ipfs-pvc.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								charts/fp/templates/ipfs-pvc.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: PersistentVolumeClaim
 | 
			
		||||
metadata:
 | 
			
		||||
  name: ipfs-pvc
 | 
			
		||||
spec:
 | 
			
		||||
  accessModes:
 | 
			
		||||
    - ReadWriteOnce
 | 
			
		||||
  resources:
 | 
			
		||||
    requests:
 | 
			
		||||
      storage: 40Gi
 | 
			
		||||
  allowVolumeExpansion: true
 | 
			
		||||
  storageClassName: {{ .Values.storageClassName }}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								charts/fp/templates/ipfs-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								charts/fp/templates/ipfs-service.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: ipfs-service
 | 
			
		||||
spec:
 | 
			
		||||
  selector:
 | 
			
		||||
    app.kubernetes.io/name: ipfs
 | 
			
		||||
  ports:
 | 
			
		||||
    - name: gateway
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 8080
 | 
			
		||||
      targetPort: 8080
 | 
			
		||||
    - name: api
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 5001
 | 
			
		||||
      targetPort: 5001
 | 
			
		||||
status:
 | 
			
		||||
  loadBalancer: {}
 | 
			
		||||
@ -5,10 +5,12 @@ metadata:
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: link2cid-pod
 | 
			
		||||
      image: fp/link2cid
 | 
			
		||||
      image: {{ .Values.link2cid.containerName }}
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 3939
 | 
			
		||||
      env:
 | 
			
		||||
        - name: IPFS_URL
 | 
			
		||||
          value: http://ipfs-service:5001
 | 
			
		||||
        - name: PORT
 | 
			
		||||
          value: '3939'
 | 
			
		||||
        - name: API_KEY
 | 
			
		||||
@ -19,5 +21,7 @@ spec:
 | 
			
		||||
      resources:
 | 
			
		||||
        limits:
 | 
			
		||||
          cpu: 500m
 | 
			
		||||
          memory: 1024Mi          
 | 
			
		||||
          memory: 1024Mi   
 | 
			
		||||
      imagePullSecrets:
 | 
			
		||||
        - name: regcred       
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,4 @@ spec:
 | 
			
		||||
    requests:
 | 
			
		||||
      storage: 40Gi
 | 
			
		||||
  allowVolumeExpansion: true
 | 
			
		||||
  storageClassName: {{ .Values.storageClassName }}
 | 
			
		||||
status: {}
 | 
			
		||||
 | 
			
		||||
  storageClassName: {{ .Values.storageClassName }}
 | 
			
		||||
							
								
								
									
										17
									
								
								charts/fp/templates/next-pod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								charts/fp/templates/next-pod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Pod
 | 
			
		||||
metadata:
 | 
			
		||||
  name: next-pod
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: next
 | 
			
		||||
spec:
 | 
			
		||||
  containers:
 | 
			
		||||
    - name: next
 | 
			
		||||
      image: {{ .Values.next.containerName }}
 | 
			
		||||
      env:
 | 
			
		||||
        - name: HOSTNAME
 | 
			
		||||
          value: 0.0.0.0
 | 
			
		||||
      ports:
 | 
			
		||||
        - containerPort: 3000
 | 
			
		||||
      resources: {}
 | 
			
		||||
  restartPolicy: OnFailure
 | 
			
		||||
							
								
								
									
										16
									
								
								charts/fp/templates/next-service.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								charts/fp/templates/next-service.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
apiVersion: v1
 | 
			
		||||
kind: Service
 | 
			
		||||
metadata:
 | 
			
		||||
  name: next-service
 | 
			
		||||
  annotations:
 | 
			
		||||
    service.beta.kubernetes.io/vultr-loadbalancer-protocol: "http"
 | 
			
		||||
    service.beta.kubernetes.io/vultr-loadbalancer-algorithm: "least_connections"
 | 
			
		||||
spec:
 | 
			
		||||
  type: LoadBalancer
 | 
			
		||||
  selector:
 | 
			
		||||
    name: next
 | 
			
		||||
  ports:
 | 
			
		||||
    - name: http
 | 
			
		||||
      protocol: TCP
 | 
			
		||||
      port: 3000
 | 
			
		||||
      targetPort: 3000
 | 
			
		||||
@ -1 +1,9 @@
 | 
			
		||||
storageClassName: csi-hostpath-sc
 | 
			
		||||
storageClassName: csi-hostpath-sc
 | 
			
		||||
link2cid:
 | 
			
		||||
  containerName: fp/link2cid
 | 
			
		||||
next:
 | 
			
		||||
  containerName: fp/next
 | 
			
		||||
strapi:
 | 
			
		||||
  containerName: fp/strapi
 | 
			
		||||
  port: 1337
 | 
			
		||||
  url: http://localhost:1337
 | 
			
		||||
							
								
								
									
										10
									
								
								charts/fp/values-prod.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								charts/fp/values-prod.yaml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
storageClassName: vultr-block-storage-hdd
 | 
			
		||||
#storageClassName: civo-volume
 | 
			
		||||
link2cid:
 | 
			
		||||
  containerName: gitea.futureporn.net/cj_clippy/link2cid:latest
 | 
			
		||||
next:
 | 
			
		||||
  containerName: sjc.vultrcr.com/fpcontainers/next
 | 
			
		||||
strapi:
 | 
			
		||||
  containerName: sjc.vultrcr.com/fpcontainers/strapi
 | 
			
		||||
  port: 1337
 | 
			
		||||
  url: https://portal.futureporn.net
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
storageClassName: vultr-block-storage-hdd
 | 
			
		||||
@ -1,14 +1,20 @@
 | 
			
		||||
# repositories:
 | 
			
		||||
  # - name: windmill
 | 
			
		||||
  #   url: https://windmill-labs.github.io/windmill-helm-charts
 | 
			
		||||
repositories:
 | 
			
		||||
  - name: jetstack
 | 
			
		||||
    url: https://charts.jetstack.io
 | 
			
		||||
 | 
			
		||||
  - name: vultr
 | 
			
		||||
    url: https://vultr.github.io/helm-charts
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
releases:
 | 
			
		||||
  # - name: windmill
 | 
			
		||||
  #   namespace: windmill
 | 
			
		||||
  #   chart: windmill/windmill
 | 
			
		||||
  #   values:
 | 
			
		||||
  #     - ./charts/windmill/values.yaml
 | 
			
		||||
  
 | 
			
		||||
  - name: cert-manager
 | 
			
		||||
    namespace: cert-manager
 | 
			
		||||
    chart: jetstack/cert-manager
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  - name: fp
 | 
			
		||||
    namespace: default
 | 
			
		||||
    chart: charts/fp
 | 
			
		||||
    values:
 | 
			
		||||
      - charts/fp/values-prod.yaml
 | 
			
		||||
							
								
								
									
										11
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								package.json
									
									
									
									
									
								
							@ -5,16 +5,9 @@
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "test": "echo \"Error: no test specified\" && exit 1",
 | 
			
		||||
    "kompose": "kompose convert --file compose.yml -c --out ./charts",
 | 
			
		||||
    "build:next": "docker build --build-arg=\"NEXT_PUBLIC_SITE_URL=https://futureporn.net\" --build-arg=\"NEXT_PUBLIC_STRAPI_URL=https://portal.futureporn.net\" --build-arg=\"NEXT_PUBLIC_UPPY_COMPANION_URL=https://uppy.futureporn.net\" -t fp-next:latest -f ./next.Dockerfile .",
 | 
			
		||||
    "deploy:bot": "echo @todo",
 | 
			
		||||
    "deploy:next": "git push origin:next main",
 | 
			
		||||
    "deploy:link2cid": "echo @todo",
 | 
			
		||||
    "deploy:strapi": "echo @todo",
 | 
			
		||||
    "deploy:uppy": "echo @todo",
 | 
			
		||||
    "deploy": "echo @todo"
 | 
			
		||||
    "dev": "make cluster && tilt up"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [],
 | 
			
		||||
  "author": "@cj_clippy",
 | 
			
		||||
  "author": "",
 | 
			
		||||
  "license": "CC0-1.0"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										970
									
								
								packages/bot/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										970
									
								
								packages/bot/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,970 @@
 | 
			
		||||
lockfileVersion: '6.0'
 | 
			
		||||
 | 
			
		||||
settings:
 | 
			
		||||
  autoInstallPeers: true
 | 
			
		||||
  excludeLinksFromLockfile: false
 | 
			
		||||
 | 
			
		||||
dependencies:
 | 
			
		||||
  '@types/express':
 | 
			
		||||
    specifier: ^4.17.21
 | 
			
		||||
    version: 4.17.21
 | 
			
		||||
  '@types/node':
 | 
			
		||||
    specifier: ^20.11.0
 | 
			
		||||
    version: 20.11.29
 | 
			
		||||
  discordeno:
 | 
			
		||||
    specifier: ^18.0.1
 | 
			
		||||
    version: 18.0.1
 | 
			
		||||
  express:
 | 
			
		||||
    specifier: ^4.18.2
 | 
			
		||||
    version: 4.18.3
 | 
			
		||||
  oceanic.js:
 | 
			
		||||
    specifier: ^1.9.0
 | 
			
		||||
    version: 1.9.0
 | 
			
		||||
 | 
			
		||||
devDependencies:
 | 
			
		||||
  tsx:
 | 
			
		||||
    specifier: ^4.7.0
 | 
			
		||||
    version: 4.7.1
 | 
			
		||||
 | 
			
		||||
packages:
 | 
			
		||||
 | 
			
		||||
  /@deno/shim-deno-test@0.3.3:
 | 
			
		||||
    resolution: {integrity: sha512-Ge0Tnl7zZY0VvEfgsyLhjid8DzI1d0La0dgm+3m0/A8gZXgp5xwlyIyue5e4SCUuVB/3AH/0lun9LcJhhTwmbg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@deno/shim-deno@0.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-iP+qdI4Oy/Mw9yv40TqdjNKL+stpKDo8drki2cKisTXgZf+GoIdMhIuODxSypRyv6wxIuHNx7ZiKE3Sl3kAHuw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@deno/shim-deno-test': 0.3.3
 | 
			
		||||
      which: 2.0.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@deno/shim-timers@0.1.0:
 | 
			
		||||
    resolution: {integrity: sha512-XFRnB5Rtbkd5RiYHwhugNK9gvDgYXmFTUOT5dmhWCKG7WnOWZggbJMnH1NcyYS3QgHvmaTOaHCyNFNSv57j3Dg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@discordjs/voice@0.16.1:
 | 
			
		||||
    resolution: {integrity: sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==}
 | 
			
		||||
    engines: {node: '>=16.11.0'}
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/ws': 8.5.10
 | 
			
		||||
      discord-api-types: 0.37.61
 | 
			
		||||
      prism-media: 1.3.5
 | 
			
		||||
      tslib: 2.6.2
 | 
			
		||||
      ws: 8.16.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - '@discordjs/opus'
 | 
			
		||||
      - bufferutil
 | 
			
		||||
      - ffmpeg-static
 | 
			
		||||
      - node-opus
 | 
			
		||||
      - opusscript
 | 
			
		||||
      - utf-8-validate
 | 
			
		||||
    dev: false
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/aix-ppc64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ppc64]
 | 
			
		||||
    os: [aix]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-arm64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-arm@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/android-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [android]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/darwin-arm64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/darwin-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/freebsd-arm64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [freebsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/freebsd-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [freebsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-arm64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-arm@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-ia32@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ia32]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-loong64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [loong64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-mips64el@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [mips64el]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-ppc64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ppc64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-riscv64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [riscv64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-s390x@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [s390x]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/linux-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [linux]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/netbsd-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [netbsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/openbsd-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [openbsd]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/sunos-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [sunos]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-arm64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [arm64]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-ia32@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [ia32]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@esbuild/win32-x64@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    cpu: [x64]
 | 
			
		||||
    os: [win32]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /@fastify/busboy@2.1.1:
 | 
			
		||||
    resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
 | 
			
		||||
    engines: {node: '>=14'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/body-parser@1.19.5:
 | 
			
		||||
    resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/connect': 3.4.38
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/connect@3.4.38:
 | 
			
		||||
    resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/express-serve-static-core@4.17.43:
 | 
			
		||||
    resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
      '@types/qs': 6.9.13
 | 
			
		||||
      '@types/range-parser': 1.2.7
 | 
			
		||||
      '@types/send': 0.17.4
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/express@4.17.21:
 | 
			
		||||
    resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/body-parser': 1.19.5
 | 
			
		||||
      '@types/express-serve-static-core': 4.17.43
 | 
			
		||||
      '@types/qs': 6.9.13
 | 
			
		||||
      '@types/serve-static': 1.15.5
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/http-errors@2.0.4:
 | 
			
		||||
    resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/mime@1.3.5:
 | 
			
		||||
    resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/mime@3.0.4:
 | 
			
		||||
    resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/node@20.11.29:
 | 
			
		||||
    resolution: {integrity: sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      undici-types: 5.26.5
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/qs@6.9.13:
 | 
			
		||||
    resolution: {integrity: sha512-iLR+1vTTJ3p0QaOUq6ACbY1mzKTODFDT/XedZI8BksOotFmL4ForwDfRQ/DZeuTHR7/2i4lI1D203gdfxuqTlA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/range-parser@1.2.7:
 | 
			
		||||
    resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/send@0.17.4:
 | 
			
		||||
    resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/mime': 1.3.5
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/serve-static@1.15.5:
 | 
			
		||||
    resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/http-errors': 2.0.4
 | 
			
		||||
      '@types/mime': 3.0.4
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@types/ws@8.5.10:
 | 
			
		||||
    resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==}
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/node': 20.11.29
 | 
			
		||||
    dev: false
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /accepts@1.3.8:
 | 
			
		||||
    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      mime-types: 2.1.35
 | 
			
		||||
      negotiator: 0.6.3
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /array-flatten@1.1.1:
 | 
			
		||||
    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /body-parser@1.20.2:
 | 
			
		||||
    resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
 | 
			
		||||
    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      bytes: 3.1.2
 | 
			
		||||
      content-type: 1.0.5
 | 
			
		||||
      debug: 2.6.9
 | 
			
		||||
      depd: 2.0.0
 | 
			
		||||
      destroy: 1.2.0
 | 
			
		||||
      http-errors: 2.0.0
 | 
			
		||||
      iconv-lite: 0.4.24
 | 
			
		||||
      on-finished: 2.4.1
 | 
			
		||||
      qs: 6.11.0
 | 
			
		||||
      raw-body: 2.5.2
 | 
			
		||||
      type-is: 1.6.18
 | 
			
		||||
      unpipe: 1.0.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /bytes@3.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /call-bind@1.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      es-define-property: 1.0.0
 | 
			
		||||
      es-errors: 1.3.0
 | 
			
		||||
      function-bind: 1.1.2
 | 
			
		||||
      get-intrinsic: 1.2.4
 | 
			
		||||
      set-function-length: 1.2.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /content-disposition@0.5.4:
 | 
			
		||||
    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      safe-buffer: 5.2.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /content-type@1.0.5:
 | 
			
		||||
    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /cookie-signature@1.0.6:
 | 
			
		||||
    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /cookie@0.5.0:
 | 
			
		||||
    resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /debug@2.6.9:
 | 
			
		||||
    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      supports-color: '*'
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      supports-color:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      ms: 2.0.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /define-data-property@1.1.4:
 | 
			
		||||
    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      es-define-property: 1.0.0
 | 
			
		||||
      es-errors: 1.3.0
 | 
			
		||||
      gopd: 1.0.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /depd@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /destroy@1.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
 | 
			
		||||
    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /discord-api-types@0.37.61:
 | 
			
		||||
    resolution: {integrity: sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==}
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: false
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /discordeno@18.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-d3D/HpC39YGInmxy2HK90kPpMMu2gYYsWuwtEEFPWpq2hlR9dvad4ihvLursPz5bj4Ob1NWOgPv3kz/bwMSIpw==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@deno/shim-deno': 0.9.0
 | 
			
		||||
      '@deno/shim-timers': 0.1.0
 | 
			
		||||
      undici: 5.28.3
 | 
			
		||||
      ws: 8.16.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - bufferutil
 | 
			
		||||
      - utf-8-validate
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ee-first@1.1.1:
 | 
			
		||||
    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /encodeurl@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /es-define-property@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      get-intrinsic: 1.2.4
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /es-errors@1.3.0:
 | 
			
		||||
    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /esbuild@0.19.12:
 | 
			
		||||
    resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
 | 
			
		||||
    engines: {node: '>=12'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    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
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /escape-html@1.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /etag@1.8.1:
 | 
			
		||||
    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /express@4.18.3:
 | 
			
		||||
    resolution: {integrity: sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==}
 | 
			
		||||
    engines: {node: '>= 0.10.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      accepts: 1.3.8
 | 
			
		||||
      array-flatten: 1.1.1
 | 
			
		||||
      body-parser: 1.20.2
 | 
			
		||||
      content-disposition: 0.5.4
 | 
			
		||||
      content-type: 1.0.5
 | 
			
		||||
      cookie: 0.5.0
 | 
			
		||||
      cookie-signature: 1.0.6
 | 
			
		||||
      debug: 2.6.9
 | 
			
		||||
      depd: 2.0.0
 | 
			
		||||
      encodeurl: 1.0.2
 | 
			
		||||
      escape-html: 1.0.3
 | 
			
		||||
      etag: 1.8.1
 | 
			
		||||
      finalhandler: 1.2.0
 | 
			
		||||
      fresh: 0.5.2
 | 
			
		||||
      http-errors: 2.0.0
 | 
			
		||||
      merge-descriptors: 1.0.1
 | 
			
		||||
      methods: 1.1.2
 | 
			
		||||
      on-finished: 2.4.1
 | 
			
		||||
      parseurl: 1.3.3
 | 
			
		||||
      path-to-regexp: 0.1.7
 | 
			
		||||
      proxy-addr: 2.0.7
 | 
			
		||||
      qs: 6.11.0
 | 
			
		||||
      range-parser: 1.2.1
 | 
			
		||||
      safe-buffer: 5.2.1
 | 
			
		||||
      send: 0.18.0
 | 
			
		||||
      serve-static: 1.15.0
 | 
			
		||||
      setprototypeof: 1.2.0
 | 
			
		||||
      statuses: 2.0.1
 | 
			
		||||
      type-is: 1.6.18
 | 
			
		||||
      utils-merge: 1.0.1
 | 
			
		||||
      vary: 1.1.2
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /finalhandler@1.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      debug: 2.6.9
 | 
			
		||||
      encodeurl: 1.0.2
 | 
			
		||||
      escape-html: 1.0.3
 | 
			
		||||
      on-finished: 2.4.1
 | 
			
		||||
      parseurl: 1.3.3
 | 
			
		||||
      statuses: 2.0.1
 | 
			
		||||
      unpipe: 1.0.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /forwarded@0.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /fresh@0.5.2:
 | 
			
		||||
    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /fsevents@2.3.3:
 | 
			
		||||
    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
 | 
			
		||||
    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
 | 
			
		||||
    os: [darwin]
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: true
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /function-bind@1.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /get-intrinsic@1.2.4:
 | 
			
		||||
    resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      es-errors: 1.3.0
 | 
			
		||||
      function-bind: 1.1.2
 | 
			
		||||
      has-proto: 1.0.3
 | 
			
		||||
      has-symbols: 1.0.3
 | 
			
		||||
      hasown: 2.0.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /get-tsconfig@4.7.3:
 | 
			
		||||
    resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      resolve-pkg-maps: 1.0.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /gopd@1.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      get-intrinsic: 1.2.4
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /has-property-descriptors@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      es-define-property: 1.0.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /has-proto@1.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /has-symbols@1.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /hasown@2.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      function-bind: 1.1.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /http-errors@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      depd: 2.0.0
 | 
			
		||||
      inherits: 2.0.4
 | 
			
		||||
      setprototypeof: 1.2.0
 | 
			
		||||
      statuses: 2.0.1
 | 
			
		||||
      toidentifier: 1.0.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /iconv-lite@0.4.24:
 | 
			
		||||
    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
 | 
			
		||||
    engines: {node: '>=0.10.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      safer-buffer: 2.1.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /inherits@2.0.4:
 | 
			
		||||
    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ipaddr.js@1.9.1:
 | 
			
		||||
    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
 | 
			
		||||
    engines: {node: '>= 0.10'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /isexe@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /media-typer@0.3.0:
 | 
			
		||||
    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /merge-descriptors@1.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /methods@1.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /mime-db@1.52.0:
 | 
			
		||||
    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /mime-types@2.1.35:
 | 
			
		||||
    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      mime-db: 1.52.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /mime@1.6.0:
 | 
			
		||||
    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
 | 
			
		||||
    engines: {node: '>=4'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ms@2.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ms@2.1.3:
 | 
			
		||||
    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /negotiator@0.6.3:
 | 
			
		||||
    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /object-inspect@1.13.1:
 | 
			
		||||
    resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /oceanic.js@1.9.0:
 | 
			
		||||
    resolution: {integrity: sha512-zBHxBnJDkhYiHvQnTWcLsdRa/0v7+S2BYHWS3TLZpmMDXJU/+KOB9oL17YqSK8xvfpA0ykIsZTPKTgwxQUfLxA==}
 | 
			
		||||
    engines: {node: '>=18.13.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      tslib: 2.6.2
 | 
			
		||||
      ws: 8.16.0
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      '@discordjs/voice': 0.16.1
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - '@discordjs/opus'
 | 
			
		||||
      - bufferutil
 | 
			
		||||
      - ffmpeg-static
 | 
			
		||||
      - node-opus
 | 
			
		||||
      - opusscript
 | 
			
		||||
      - utf-8-validate
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /on-finished@2.4.1:
 | 
			
		||||
    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      ee-first: 1.1.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /parseurl@1.3.3:
 | 
			
		||||
    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /path-to-regexp@0.1.7:
 | 
			
		||||
    resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /prism-media@1.3.5:
 | 
			
		||||
    resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==}
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@discordjs/opus': '>=0.8.0 <1.0.0'
 | 
			
		||||
      ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0
 | 
			
		||||
      node-opus: ^0.3.3
 | 
			
		||||
      opusscript: ^0.0.8
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      '@discordjs/opus':
 | 
			
		||||
        optional: true
 | 
			
		||||
      ffmpeg-static:
 | 
			
		||||
        optional: true
 | 
			
		||||
      node-opus:
 | 
			
		||||
        optional: true
 | 
			
		||||
      opusscript:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dev: false
 | 
			
		||||
    optional: true
 | 
			
		||||
 | 
			
		||||
  /proxy-addr@2.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
 | 
			
		||||
    engines: {node: '>= 0.10'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      forwarded: 0.2.0
 | 
			
		||||
      ipaddr.js: 1.9.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /qs@6.11.0:
 | 
			
		||||
    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
 | 
			
		||||
    engines: {node: '>=0.6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      side-channel: 1.0.6
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /range-parser@1.2.1:
 | 
			
		||||
    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /raw-body@2.5.2:
 | 
			
		||||
    resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      bytes: 3.1.2
 | 
			
		||||
      http-errors: 2.0.0
 | 
			
		||||
      iconv-lite: 0.4.24
 | 
			
		||||
      unpipe: 1.0.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /resolve-pkg-maps@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /safe-buffer@5.2.1:
 | 
			
		||||
    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /safer-buffer@2.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /send@0.18.0:
 | 
			
		||||
    resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
 | 
			
		||||
    engines: {node: '>= 0.8.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      debug: 2.6.9
 | 
			
		||||
      depd: 2.0.0
 | 
			
		||||
      destroy: 1.2.0
 | 
			
		||||
      encodeurl: 1.0.2
 | 
			
		||||
      escape-html: 1.0.3
 | 
			
		||||
      etag: 1.8.1
 | 
			
		||||
      fresh: 0.5.2
 | 
			
		||||
      http-errors: 2.0.0
 | 
			
		||||
      mime: 1.6.0
 | 
			
		||||
      ms: 2.1.3
 | 
			
		||||
      on-finished: 2.4.1
 | 
			
		||||
      range-parser: 1.2.1
 | 
			
		||||
      statuses: 2.0.1
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /serve-static@1.15.0:
 | 
			
		||||
    resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
 | 
			
		||||
    engines: {node: '>= 0.8.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      encodeurl: 1.0.2
 | 
			
		||||
      escape-html: 1.0.3
 | 
			
		||||
      parseurl: 1.3.3
 | 
			
		||||
      send: 0.18.0
 | 
			
		||||
    transitivePeerDependencies:
 | 
			
		||||
      - supports-color
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /set-function-length@1.2.2:
 | 
			
		||||
    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      define-data-property: 1.1.4
 | 
			
		||||
      es-errors: 1.3.0
 | 
			
		||||
      function-bind: 1.1.2
 | 
			
		||||
      get-intrinsic: 1.2.4
 | 
			
		||||
      gopd: 1.0.1
 | 
			
		||||
      has-property-descriptors: 1.0.2
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /setprototypeof@1.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /side-channel@1.0.6:
 | 
			
		||||
    resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      call-bind: 1.0.7
 | 
			
		||||
      es-errors: 1.3.0
 | 
			
		||||
      get-intrinsic: 1.2.4
 | 
			
		||||
      object-inspect: 1.13.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /statuses@2.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /toidentifier@1.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
 | 
			
		||||
    engines: {node: '>=0.6'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /tslib@2.6.2:
 | 
			
		||||
    resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /tsx@4.7.1:
 | 
			
		||||
    resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==}
 | 
			
		||||
    engines: {node: '>=18.0.0'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      esbuild: 0.19.12
 | 
			
		||||
      get-tsconfig: 4.7.3
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
      fsevents: 2.3.3
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /type-is@1.6.18:
 | 
			
		||||
    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
 | 
			
		||||
    engines: {node: '>= 0.6'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      media-typer: 0.3.0
 | 
			
		||||
      mime-types: 2.1.35
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /undici-types@5.26.5:
 | 
			
		||||
    resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /undici@5.28.3:
 | 
			
		||||
    resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==}
 | 
			
		||||
    engines: {node: '>=14.0'}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@fastify/busboy': 2.1.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /unpipe@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /utils-merge@1.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
 | 
			
		||||
    engines: {node: '>= 0.4.0'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /vary@1.1.2:
 | 
			
		||||
    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
 | 
			
		||||
    engines: {node: '>= 0.8'}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /which@2.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
 | 
			
		||||
    engines: {node: '>= 8'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      isexe: 2.0.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /ws@8.16.0:
 | 
			
		||||
    resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==}
 | 
			
		||||
    engines: {node: '>=10.0.0'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      bufferutil: ^4.0.1
 | 
			
		||||
      utf-8-validate: '>=5.0.2'
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      bufferutil:
 | 
			
		||||
        optional: true
 | 
			
		||||
      utf-8-validate:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dev: false
 | 
			
		||||
							
								
								
									
										20
									
								
								packages/helloworld/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								packages/helloworld/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
# Base Image
 | 
			
		||||
FROM golang:latest
 | 
			
		||||
 | 
			
		||||
# Set the Current Working Directory inside the container
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
 | 
			
		||||
# Copy everything from the current directory to the PWD(Present Working Directory) inside the container
 | 
			
		||||
COPY . .
 | 
			
		||||
 | 
			
		||||
# Download all the dependencies
 | 
			
		||||
RUN go mod download
 | 
			
		||||
 | 
			
		||||
# Build the Go app
 | 
			
		||||
RUN go build -o main .
 | 
			
		||||
 | 
			
		||||
# Expose port 8080 to the outside world
 | 
			
		||||
EXPOSE 8080
 | 
			
		||||
 | 
			
		||||
# Command to run the executable
 | 
			
		||||
CMD ["./main"]
 | 
			
		||||
							
								
								
									
										0
									
								
								packages/helloworld/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/helloworld/go.mod
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										13
									
								
								packages/helloworld/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								packages/helloworld/main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import "net/http"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
    http.HandleFunc("/", hellowordhandler)
 | 
			
		||||
 | 
			
		||||
    http.ListenAndServe(":9000", nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func hellowordhandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
    w.Write([]byte("Hello World"))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										2
									
								
								packages/helloworldy/.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								packages/helloworldy/.dockerignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
node_modules
 | 
			
		||||
README.md
 | 
			
		||||
							
								
								
									
										36
									
								
								packages/helloworldy/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								packages/helloworldy/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
			
		||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
 | 
			
		||||
 | 
			
		||||
# dependencies
 | 
			
		||||
/node_modules
 | 
			
		||||
/.pnp
 | 
			
		||||
.pnp.js
 | 
			
		||||
.yarn/install-state.gz
 | 
			
		||||
 | 
			
		||||
# testing
 | 
			
		||||
/coverage
 | 
			
		||||
 | 
			
		||||
# next.js
 | 
			
		||||
/.next/
 | 
			
		||||
/out/
 | 
			
		||||
 | 
			
		||||
# production
 | 
			
		||||
/build
 | 
			
		||||
 | 
			
		||||
# misc
 | 
			
		||||
.DS_Store
 | 
			
		||||
*.pem
 | 
			
		||||
 | 
			
		||||
# debug
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
 | 
			
		||||
# local env files
 | 
			
		||||
.env*.local
 | 
			
		||||
 | 
			
		||||
# vercel
 | 
			
		||||
.vercel
 | 
			
		||||
 | 
			
		||||
# typescript
 | 
			
		||||
*.tsbuildinfo
 | 
			
		||||
next-env.d.ts
 | 
			
		||||
							
								
								
									
										12
									
								
								packages/helloworldy/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								packages/helloworldy/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
FROM node:20
 | 
			
		||||
 | 
			
		||||
RUN corepack enable
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
 | 
			
		||||
ADD package.json .
 | 
			
		||||
ADD package-lock.json .
 | 
			
		||||
RUN pnpm install
 | 
			
		||||
 | 
			
		||||
ADD . .
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT [ "pnpm", "next", "dev" ]
 | 
			
		||||
							
								
								
									
										36
									
								
								packages/helloworldy/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								packages/helloworldy/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
			
		||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
 | 
			
		||||
 | 
			
		||||
## Getting Started
 | 
			
		||||
 | 
			
		||||
First, run the development server:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm run dev
 | 
			
		||||
# or
 | 
			
		||||
yarn dev
 | 
			
		||||
# or
 | 
			
		||||
pnpm dev
 | 
			
		||||
# or
 | 
			
		||||
bun dev
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
 | 
			
		||||
 | 
			
		||||
You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
 | 
			
		||||
 | 
			
		||||
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
 | 
			
		||||
 | 
			
		||||
## Learn More
 | 
			
		||||
 | 
			
		||||
To learn more about Next.js, take a look at the following resources:
 | 
			
		||||
 | 
			
		||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
 | 
			
		||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
 | 
			
		||||
 | 
			
		||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
 | 
			
		||||
 | 
			
		||||
## Deploy on Vercel
 | 
			
		||||
 | 
			
		||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
 | 
			
		||||
 | 
			
		||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								packages/helloworldy/app/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								packages/helloworldy/app/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 25 KiB  | 
							
								
								
									
										107
									
								
								packages/helloworldy/app/globals.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								packages/helloworldy/app/globals.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,107 @@
 | 
			
		||||
:root {
 | 
			
		||||
  --max-width: 1100px;
 | 
			
		||||
  --border-radius: 12px;
 | 
			
		||||
  --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono",
 | 
			
		||||
    "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro",
 | 
			
		||||
    "Fira Mono", "Droid Sans Mono", "Courier New", monospace;
 | 
			
		||||
 | 
			
		||||
  --foreground-rgb: 0, 0, 0;
 | 
			
		||||
  --background-start-rgb: 214, 219, 220;
 | 
			
		||||
  --background-end-rgb: 255, 255, 255;
 | 
			
		||||
 | 
			
		||||
  --primary-glow: conic-gradient(
 | 
			
		||||
    from 180deg at 50% 50%,
 | 
			
		||||
    #16abff33 0deg,
 | 
			
		||||
    #0885ff33 55deg,
 | 
			
		||||
    #54d6ff33 120deg,
 | 
			
		||||
    #0071ff33 160deg,
 | 
			
		||||
    transparent 360deg
 | 
			
		||||
  );
 | 
			
		||||
  --secondary-glow: radial-gradient(
 | 
			
		||||
    rgba(255, 255, 255, 1),
 | 
			
		||||
    rgba(255, 255, 255, 0)
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  --tile-start-rgb: 239, 245, 249;
 | 
			
		||||
  --tile-end-rgb: 228, 232, 233;
 | 
			
		||||
  --tile-border: conic-gradient(
 | 
			
		||||
    #00000080,
 | 
			
		||||
    #00000040,
 | 
			
		||||
    #00000030,
 | 
			
		||||
    #00000020,
 | 
			
		||||
    #00000010,
 | 
			
		||||
    #00000010,
 | 
			
		||||
    #00000080
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  --callout-rgb: 238, 240, 241;
 | 
			
		||||
  --callout-border-rgb: 172, 175, 176;
 | 
			
		||||
  --card-rgb: 180, 185, 188;
 | 
			
		||||
  --card-border-rgb: 131, 134, 135;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (prefers-color-scheme: dark) {
 | 
			
		||||
  :root {
 | 
			
		||||
    --foreground-rgb: 255, 255, 255;
 | 
			
		||||
    --background-start-rgb: 0, 0, 0;
 | 
			
		||||
    --background-end-rgb: 0, 0, 0;
 | 
			
		||||
 | 
			
		||||
    --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
 | 
			
		||||
    --secondary-glow: linear-gradient(
 | 
			
		||||
      to bottom right,
 | 
			
		||||
      rgba(1, 65, 255, 0),
 | 
			
		||||
      rgba(1, 65, 255, 0),
 | 
			
		||||
      rgba(1, 65, 255, 0.3)
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    --tile-start-rgb: 2, 13, 46;
 | 
			
		||||
    --tile-end-rgb: 2, 5, 19;
 | 
			
		||||
    --tile-border: conic-gradient(
 | 
			
		||||
      #ffffff80,
 | 
			
		||||
      #ffffff40,
 | 
			
		||||
      #ffffff30,
 | 
			
		||||
      #ffffff20,
 | 
			
		||||
      #ffffff10,
 | 
			
		||||
      #ffffff10,
 | 
			
		||||
      #ffffff80
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    --callout-rgb: 20, 20, 20;
 | 
			
		||||
    --callout-border-rgb: 108, 108, 108;
 | 
			
		||||
    --card-rgb: 100, 100, 100;
 | 
			
		||||
    --card-border-rgb: 200, 200, 200;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
* {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html,
 | 
			
		||||
body {
 | 
			
		||||
  max-width: 100vw;
 | 
			
		||||
  overflow-x: hidden;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
  color: rgb(var(--foreground-rgb));
 | 
			
		||||
  background: linear-gradient(
 | 
			
		||||
      to bottom,
 | 
			
		||||
      transparent,
 | 
			
		||||
      rgb(var(--background-end-rgb))
 | 
			
		||||
    )
 | 
			
		||||
    rgb(var(--background-start-rgb));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a {
 | 
			
		||||
  color: inherit;
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (prefers-color-scheme: dark) {
 | 
			
		||||
  html {
 | 
			
		||||
    color-scheme: dark;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								packages/helloworldy/app/layout.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								packages/helloworldy/app/layout.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
import { Inter } from "next/font/google";
 | 
			
		||||
import "./globals.css";
 | 
			
		||||
 | 
			
		||||
const inter = Inter({ subsets: ["latin"] });
 | 
			
		||||
 | 
			
		||||
export const metadata = {
 | 
			
		||||
  title: "Create Next App",
 | 
			
		||||
  description: "Generated by create next app",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default function RootLayout({ children }) {
 | 
			
		||||
  return (
 | 
			
		||||
    <html lang="en">
 | 
			
		||||
      <body className={inter.className}>{children}</body>
 | 
			
		||||
    </html>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								packages/helloworldy/app/page.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								packages/helloworldy/app/page.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
			
		||||
import Image from "next/image";
 | 
			
		||||
import styles from "./page.module.css";
 | 
			
		||||
 | 
			
		||||
export default function Home() {
 | 
			
		||||
  return (
 | 
			
		||||
    <main className={styles.main}>
 | 
			
		||||
      <div className={styles.description}>
 | 
			
		||||
        <p>
 | 
			
		||||
          Get started by editing 
 | 
			
		||||
          <code className={styles.code}>app/page.js</code>
 | 
			
		||||
        </p>
 | 
			
		||||
        <div>
 | 
			
		||||
          <a
 | 
			
		||||
            href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
 | 
			
		||||
            target="_blank"
 | 
			
		||||
            rel="noopener noreferrer"
 | 
			
		||||
          >
 | 
			
		||||
            By{" "}
 | 
			
		||||
            <Image
 | 
			
		||||
              src="/vercel.svg"
 | 
			
		||||
              alt="Vercel Logo"
 | 
			
		||||
              className={styles.vercelLogo}
 | 
			
		||||
              width={100}
 | 
			
		||||
              height={24}
 | 
			
		||||
              priority
 | 
			
		||||
            />
 | 
			
		||||
          </a>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div className={styles.center}>
 | 
			
		||||
        <Image
 | 
			
		||||
          className={styles.logo}
 | 
			
		||||
          src="/next.svg"
 | 
			
		||||
          alt="Next.js Logo"
 | 
			
		||||
          width={180}
 | 
			
		||||
          height={37}
 | 
			
		||||
          priority
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div className={styles.grid}>
 | 
			
		||||
        <a
 | 
			
		||||
          href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
 | 
			
		||||
          className={styles.card}
 | 
			
		||||
          target="_blank"
 | 
			
		||||
          rel="noopener noreferrer"
 | 
			
		||||
        >
 | 
			
		||||
          <h2>
 | 
			
		||||
            Docs <span>-></span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p>Find in-depth information about Next.js features and API.</p>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a
 | 
			
		||||
          href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
 | 
			
		||||
          className={styles.card}
 | 
			
		||||
          target="_blank"
 | 
			
		||||
          rel="noopener noreferrer"
 | 
			
		||||
        >
 | 
			
		||||
          <h2>
 | 
			
		||||
            Learn <span>-></span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p>Learn about Next.js in an interactive course with quizzes!</p>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a
 | 
			
		||||
          href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
 | 
			
		||||
          className={styles.card}
 | 
			
		||||
          target="_blank"
 | 
			
		||||
          rel="noopener noreferrer"
 | 
			
		||||
        >
 | 
			
		||||
          <h2>
 | 
			
		||||
            Templates <span>-></span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p>Explore starter templates for Next.js.</p>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a
 | 
			
		||||
          href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
 | 
			
		||||
          className={styles.card}
 | 
			
		||||
          target="_blank"
 | 
			
		||||
          rel="noopener noreferrer"
 | 
			
		||||
        >
 | 
			
		||||
          <h2>
 | 
			
		||||
            Deploy <span>-></span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <p>
 | 
			
		||||
            Instantly deploy your Next.js site to a shareable URL with Vercel.
 | 
			
		||||
          </p>
 | 
			
		||||
        </a>
 | 
			
		||||
      </div>
 | 
			
		||||
    </main>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										230
									
								
								packages/helloworldy/app/page.module.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								packages/helloworldy/app/page.module.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,230 @@
 | 
			
		||||
.main {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  flex-direction: column;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  padding: 6rem;
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.description {
 | 
			
		||||
  display: inherit;
 | 
			
		||||
  justify-content: inherit;
 | 
			
		||||
  align-items: inherit;
 | 
			
		||||
  font-size: 0.85rem;
 | 
			
		||||
  max-width: var(--max-width);
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  z-index: 2;
 | 
			
		||||
  font-family: var(--font-mono);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.description a {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  gap: 0.5rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.description p {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  padding: 1rem;
 | 
			
		||||
  background-color: rgba(var(--callout-rgb), 0.5);
 | 
			
		||||
  border: 1px solid rgba(var(--callout-border-rgb), 0.3);
 | 
			
		||||
  border-radius: var(--border-radius);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.code {
 | 
			
		||||
  font-weight: 700;
 | 
			
		||||
  font-family: var(--font-mono);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.grid {
 | 
			
		||||
  display: grid;
 | 
			
		||||
  grid-template-columns: repeat(4, minmax(25%, auto));
 | 
			
		||||
  max-width: 100%;
 | 
			
		||||
  width: var(--max-width);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card {
 | 
			
		||||
  padding: 1rem 1.2rem;
 | 
			
		||||
  border-radius: var(--border-radius);
 | 
			
		||||
  background: rgba(var(--card-rgb), 0);
 | 
			
		||||
  border: 1px solid rgba(var(--card-border-rgb), 0);
 | 
			
		||||
  transition: background 200ms, border 200ms;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card span {
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  transition: transform 200ms;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card h2 {
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
  margin-bottom: 0.7rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card p {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  opacity: 0.6;
 | 
			
		||||
  font-size: 0.9rem;
 | 
			
		||||
  line-height: 1.5;
 | 
			
		||||
  max-width: 30ch;
 | 
			
		||||
  text-wrap: balance;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  padding: 4rem 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center::before {
 | 
			
		||||
  background: var(--secondary-glow);
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  width: 480px;
 | 
			
		||||
  height: 360px;
 | 
			
		||||
  margin-left: -400px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center::after {
 | 
			
		||||
  background: var(--primary-glow);
 | 
			
		||||
  width: 240px;
 | 
			
		||||
  height: 180px;
 | 
			
		||||
  z-index: -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center::before,
 | 
			
		||||
.center::after {
 | 
			
		||||
  content: "";
 | 
			
		||||
  left: 50%;
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  filter: blur(45px);
 | 
			
		||||
  transform: translateZ(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.logo {
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
/* Enable hover only on non-touch devices */
 | 
			
		||||
@media (hover: hover) and (pointer: fine) {
 | 
			
		||||
  .card:hover {
 | 
			
		||||
    background: rgba(var(--card-rgb), 0.1);
 | 
			
		||||
    border: 1px solid rgba(var(--card-border-rgb), 0.15);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .card:hover span {
 | 
			
		||||
    transform: translateX(4px);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (prefers-reduced-motion) {
 | 
			
		||||
  .card:hover span {
 | 
			
		||||
    transform: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Mobile */
 | 
			
		||||
@media (max-width: 700px) {
 | 
			
		||||
  .content {
 | 
			
		||||
    padding: 4rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .grid {
 | 
			
		||||
    grid-template-columns: 1fr;
 | 
			
		||||
    margin-bottom: 120px;
 | 
			
		||||
    max-width: 320px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .card {
 | 
			
		||||
    padding: 1rem 2.5rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .card h2 {
 | 
			
		||||
    margin-bottom: 0.5rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .center {
 | 
			
		||||
    padding: 8rem 0 6rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .center::before {
 | 
			
		||||
    transform: none;
 | 
			
		||||
    height: 300px;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .description {
 | 
			
		||||
    font-size: 0.8rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .description a {
 | 
			
		||||
    padding: 1rem;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .description p,
 | 
			
		||||
  .description div {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    position: fixed;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .description p {
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    inset: 0 0 auto;
 | 
			
		||||
    padding: 2rem 1rem 1.4rem;
 | 
			
		||||
    border-radius: 0;
 | 
			
		||||
    border: none;
 | 
			
		||||
    border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
 | 
			
		||||
    background: linear-gradient(
 | 
			
		||||
      to bottom,
 | 
			
		||||
      rgba(var(--background-start-rgb), 1),
 | 
			
		||||
      rgba(var(--callout-rgb), 0.5)
 | 
			
		||||
    );
 | 
			
		||||
    background-clip: padding-box;
 | 
			
		||||
    backdrop-filter: blur(24px);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .description div {
 | 
			
		||||
    align-items: flex-end;
 | 
			
		||||
    pointer-events: none;
 | 
			
		||||
    inset: auto 0 0;
 | 
			
		||||
    padding: 2rem;
 | 
			
		||||
    height: 200px;
 | 
			
		||||
    background: linear-gradient(
 | 
			
		||||
      to bottom,
 | 
			
		||||
      transparent 0%,
 | 
			
		||||
      rgb(var(--background-end-rgb)) 40%
 | 
			
		||||
    );
 | 
			
		||||
    z-index: 1;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Tablet and Smaller Desktop */
 | 
			
		||||
@media (min-width: 701px) and (max-width: 1120px) {
 | 
			
		||||
  .grid {
 | 
			
		||||
    grid-template-columns: repeat(2, 50%);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (prefers-color-scheme: dark) {
 | 
			
		||||
  .vercelLogo {
 | 
			
		||||
    filter: invert(1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .logo {
 | 
			
		||||
    filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@keyframes rotate {
 | 
			
		||||
  from {
 | 
			
		||||
    transform: rotate(360deg);
 | 
			
		||||
  }
 | 
			
		||||
  to {
 | 
			
		||||
    transform: rotate(0deg);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								packages/helloworldy/jsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								packages/helloworldy/jsconfig.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": ["./*"]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								packages/helloworldy/next.config.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								packages/helloworldy/next.config.mjs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
/** @type {import('next').NextConfig} */
 | 
			
		||||
const nextConfig = {};
 | 
			
		||||
 | 
			
		||||
export default nextConfig;
 | 
			
		||||
							
								
								
									
										389
									
								
								packages/helloworldy/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										389
									
								
								packages/helloworldy/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							@ -0,0 +1,389 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "helloworldy",
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "helloworldy",
 | 
			
		||||
      "version": "0.1.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "next": "14.1.3",
 | 
			
		||||
        "react": "^18",
 | 
			
		||||
        "react-dom": "^18"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/env": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-VhgXTvrgeBRxNPjyfBsDIMvgsKDxjlpw4IAUsHCX8Gjl1vtHUYRT3+xfQ/wwvLPDd/6kqfLqk9Pt4+7gysuCKQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-darwin-arm64": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-LALu0yIBPRiG9ANrD5ncB3pjpO0Gli9ZLhxdOu6ZUNf3x1r3ea1rd9Q+4xxUkGrUXLqKVK9/lDkpYIJaCJ6AHQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-darwin-x64": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-E/9WQeXxkqw2dfcn5UcjApFgUq73jqNKaE5bysDm58hEUdUGedVrnRhblhJM7HbCZNhtVl0j+6TXsK0PuzXTCg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-arm64-gnu": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-USArX9B+3rZSXYLFvgy0NVWQgqh6LHWDmMt38O4lmiJNQcwazeI6xRvSsliDLKt+78KChVacNiwvOMbl6g6BBw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-arm64-musl": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-esk1RkRBLSIEp1qaQXv1+s6ZdYzuVCnDAZySpa62iFTMGTisCyNQmqyCTL9P+cLJ4N9FKCI3ojtSfsyPHJDQNw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-x64-gnu": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-8uOgRlYEYiKo0L8YGeS+3TudHVDWDjPVDUcST+z+dUzgBbTEwSSIaSgF/vkcC1T/iwl4QX9iuUyUdQEl0Kxalg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-x64-musl": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-DX2zqz05ziElLoxskgHasaJBREC5Y9TJcbR2LYqu4r7naff25B4iXkfXWfcp69uD75/0URmmoSgT8JclJtrBoQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-win32-arm64-msvc": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-HjssFsCdsD4GHstXSQxsi2l70F/5FsRTRQp8xNgmQs15SxUfUJRvSI9qKny/jLkY3gLgiCR3+6A7wzzK0DBlfA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-win32-ia32-msvc": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-DRuxD5axfDM1/Ue4VahwSxl1O5rn61hX8/sF0HY8y0iCbpqdxw3rB3QasdHn/LJ6Wb2y5DoWzXcz3L1Cr+Thrw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ia32"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-win32-x64-msvc": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-uC2DaDoWH7h1P/aJ4Fok3Xiw6P0Lo4ez7NbowW2VGNXw/Xv6tOuLUcxhBYZxsSUJtpeknCi8/fvnSpyCFp4Rcg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@swc/helpers": {
 | 
			
		||||
      "version": "0.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/busboy": {
 | 
			
		||||
      "version": "1.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "streamsearch": "^1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=10.16.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/caniuse-lite": {
 | 
			
		||||
      "version": "1.0.30001599",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz",
 | 
			
		||||
      "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "opencollective",
 | 
			
		||||
          "url": "https://opencollective.com/browserslist"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "tidelift",
 | 
			
		||||
          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/ai"
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/client-only": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/graceful-fs": {
 | 
			
		||||
      "version": "4.2.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
 | 
			
		||||
      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/js-tokens": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/loose-envify": {
 | 
			
		||||
      "version": "1.4.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
 | 
			
		||||
      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "js-tokens": "^3.0.0 || ^4.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "loose-envify": "cli.js"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/nanoid": {
 | 
			
		||||
      "version": "3.3.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
 | 
			
		||||
      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/ai"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "nanoid": "bin/nanoid.cjs"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next": {
 | 
			
		||||
      "version": "14.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/next/-/next-14.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-oexgMV2MapI0UIWiXKkixF8J8ORxpy64OuJ/J9oVUmIthXOUCcuVEZX+dtpgq7wIfIqtBwQsKEDXejcjTsan9g==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@next/env": "14.1.3",
 | 
			
		||||
        "@swc/helpers": "0.5.2",
 | 
			
		||||
        "busboy": "1.6.0",
 | 
			
		||||
        "caniuse-lite": "^1.0.30001579",
 | 
			
		||||
        "graceful-fs": "^4.2.11",
 | 
			
		||||
        "postcss": "8.4.31",
 | 
			
		||||
        "styled-jsx": "5.1.1"
 | 
			
		||||
      },
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "next": "dist/bin/next"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=18.17.0"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@next/swc-darwin-arm64": "14.1.3",
 | 
			
		||||
        "@next/swc-darwin-x64": "14.1.3",
 | 
			
		||||
        "@next/swc-linux-arm64-gnu": "14.1.3",
 | 
			
		||||
        "@next/swc-linux-arm64-musl": "14.1.3",
 | 
			
		||||
        "@next/swc-linux-x64-gnu": "14.1.3",
 | 
			
		||||
        "@next/swc-linux-x64-musl": "14.1.3",
 | 
			
		||||
        "@next/swc-win32-arm64-msvc": "14.1.3",
 | 
			
		||||
        "@next/swc-win32-ia32-msvc": "14.1.3",
 | 
			
		||||
        "@next/swc-win32-x64-msvc": "14.1.3"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@opentelemetry/api": "^1.1.0",
 | 
			
		||||
        "react": "^18.2.0",
 | 
			
		||||
        "react-dom": "^18.2.0",
 | 
			
		||||
        "sass": "^1.3.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@opentelemetry/api": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "sass": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/picocolors": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/postcss": {
 | 
			
		||||
      "version": "8.4.31",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
 | 
			
		||||
      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
 | 
			
		||||
      "funding": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "opencollective",
 | 
			
		||||
          "url": "https://opencollective.com/postcss/"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "tidelift",
 | 
			
		||||
          "url": "https://tidelift.com/funding/github/npm/postcss"
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "type": "github",
 | 
			
		||||
          "url": "https://github.com/sponsors/ai"
 | 
			
		||||
        }
 | 
			
		||||
      ],
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "nanoid": "^3.3.6",
 | 
			
		||||
        "picocolors": "^1.0.0",
 | 
			
		||||
        "source-map-js": "^1.0.2"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^10 || ^12 || >=14"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react": {
 | 
			
		||||
      "version": "18.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "loose-envify": "^1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/react-dom": {
 | 
			
		||||
      "version": "18.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "loose-envify": "^1.1.0",
 | 
			
		||||
        "scheduler": "^0.23.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react": "^18.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/scheduler": {
 | 
			
		||||
      "version": "0.23.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
 | 
			
		||||
      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "loose-envify": "^1.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/source-map-js": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.10.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/streamsearch": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=10.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/styled-jsx": {
 | 
			
		||||
      "version": "5.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "client-only": "0.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 12.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "@babel/core": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "babel-plugin-macros": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tslib": {
 | 
			
		||||
      "version": "2.6.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
 | 
			
		||||
      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								packages/helloworldy/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								packages/helloworldy/package.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "helloworldy",
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "next dev",
 | 
			
		||||
    "build": "next build",
 | 
			
		||||
    "start": "next start",
 | 
			
		||||
    "lint": "next lint"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "react": "^18",
 | 
			
		||||
    "react-dom": "^18",
 | 
			
		||||
    "next": "14.1.3"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								packages/helloworldy/public/next.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								packages/helloworldy/public/next.svg
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										1
									
								
								packages/helloworldy/public/vercel.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								packages/helloworldy/public/vercel.svg
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 629 B  | 
							
								
								
									
										3
									
								
								packages/link2cid/.env.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								packages/link2cid/.env.example
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
PORT=3030
 | 
			
		||||
IPFS_URL=http://localhost:5001
 | 
			
		||||
API_KEY=changeme
 | 
			
		||||
@ -27,6 +27,21 @@ const ipfsUrl = process.env.IPFS_URL || 'http://localhost:5001';
 | 
			
		||||
if (!process.env.API_KEY) throw new Error('API_KEY was missing in env');
 | 
			
		||||
if (!process.env.PORT) throw new Error('PORT is missing in env');
 | 
			
		||||
 | 
			
		||||
async function ipfsHealthCheck() {
 | 
			
		||||
    const url = ipfsUrl+'/version'
 | 
			
		||||
    // console.log(`ipfsHealthCheck at url=${url}`)
 | 
			
		||||
    try {
 | 
			
		||||
        const res = await fetch(url, {
 | 
			
		||||
            method: 'GET'
 | 
			
		||||
        })
 | 
			
		||||
        const body = await res.text()
 | 
			
		||||
        if (!body.includes('Version')) throw new Error('response from ipfs did not contain Version')
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
        console.error('failure while checking IPFS connection.')
 | 
			
		||||
        console.error(e)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// greetz https://stackoverflow.com/a/51302466/1004931
 | 
			
		||||
async function downloadFile(url, filePath, sse) {
 | 
			
		||||
    console.log(`downloading url=${url} to filePath=${filePath}`);
 | 
			
		||||
@ -69,7 +84,6 @@ async function downloadFile(url, filePath, sse) {
 | 
			
		||||
    // If we don't, we get text error messages sent to kubo which gets added and it's a bad time.
 | 
			
		||||
    console.log(`fileSize=${fileSize}. downloadedBytes=${downloadedBytes}`);
 | 
			
		||||
    if (fileSize != downloadedBytes) throw new Error('downloadedBytes did not match fileSize');
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -279,6 +293,9 @@ app.get('/health', healthRes);
 | 
			
		||||
app.get('/add', authenticate, addHandler);
 | 
			
		||||
 | 
			
		||||
app.listen(port, async () => {
 | 
			
		||||
    setInterval(async () => {
 | 
			
		||||
        await ipfsHealthCheck()
 | 
			
		||||
    }, 10000)
 | 
			
		||||
    const version = await getPackageVersion();
 | 
			
		||||
    console.log(`link2cid ${version} listening on port ${port}`);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -9,56 +9,57 @@ export default async function Page() {
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
        <div className="content">
 | 
			
		||||
            <div className="box">
 | 
			
		||||
 | 
			
		||||
                <div className="block">
 | 
			
		||||
 | 
			
		||||
                    <h1>About</h1>
 | 
			
		||||
                    <div className="section hero is-primary">
 | 
			
		||||
                <section className="hero">
 | 
			
		||||
                    <div className="hero-body">
 | 
			
		||||
                        <p className="title">About</p>
 | 
			
		||||
                        <p>Futureporn is a fanmade public archive of NSFW R18 vtuber livestreams.</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </section>
 | 
			
		||||
 | 
			
		||||
                <div className="section">
 | 
			
		||||
 | 
			
		||||
                    <h1>Mission</h1>
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
 | 
			
		||||
                        <p>It's a lofty goal, but Futureporn aims to become <b>the Galaxy's best VTuber hentai site.</b></p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div className="section">
 | 
			
		||||
 | 
			
		||||
                        <h2>How do we get there?</h2>
 | 
			
		||||
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <h3>1. Solve the viewer's common problems</h3>
 | 
			
		||||
 | 
			
		||||
                        <p>Viewers want to watch livestream VODs on their own time. Futureporn collects vods from public streams, and caches them for later viewing.</p>
 | 
			
		||||
 | 
			
		||||
                        <p>Viewers want to find content that interests them. Futureporn enables vod tagging for easy browsing.</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                <div className="section">
 | 
			
		||||
                        <h3>2. Solve the streamer's common problems</h3>
 | 
			
		||||
 | 
			
		||||
                        <p>Platforms like PH are not rising to the needs of VTubers. Instead of offering support and resources, they restrict and ban top talent.</p>
 | 
			
		||||
 | 
			
		||||
                        <p>Futureporn is different, embracing the medium and leveraging emerging technologies to amplify VTuber success.</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <h3>3. Scale beyond Earth</h3>
 | 
			
		||||
 | 
			
		||||
                        <p>Piggybacking on <Link href="/faq#ipfs">IPFS</Link>' content-addressable capabilities and potential to end 404s, VODs preserved here can withstand the test of time, and eventually persist <Link href="/goals">off-world</Link>.</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <article className="mt-5 message is-success">
 | 
			
		||||
                            <div className="message-body">
 | 
			
		||||
                                <p>Futureporn needs financial support to continue improving. If you enjoy this website, please consider <Link target="_blank" href="https://patreon.com/CJ_Clippy">becoming a patron<FontAwesomeIcon icon={faExternalLinkAlt} className="fas fa-external-link-alt" /></Link>.</p>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </article>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div className="section">
 | 
			
		||||
                    <h3>3. Scale beyond Earth</h3>
 | 
			
		||||
 | 
			
		||||
                    <p>Piggybacking on <Link href="/faq#ipfs">IPFS</Link>' content-addressable capabilities and potential to end 404s, VODs preserved here can withstand the test of time, and eventually persist <Link href="/goals">off-world</Link>.</p>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
                <div className="section">
 | 
			
		||||
 | 
			
		||||
                    <article className="mt-5 message is-success">
 | 
			
		||||
                        <div className="message-body">
 | 
			
		||||
                            <p>Futureporn needs financial support to continue improving. If you enjoy this website, please consider <Link target="_blank" href="https://patreon.com/CJ_Clippy">becoming a patron<FontAwesomeIcon icon={faExternalLinkAlt} className="fas fa-external-link-alt ml-1" /></Link>.</p>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </article>
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </>
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,80 +0,0 @@
 | 
			
		||||
import React, { useEffect, useRef, useState, forwardRef, MutableRefObject } from "react";
 | 
			
		||||
import { APITypes, PlyrProps, usePlyr } from "plyr-react";
 | 
			
		||||
import "plyr-react/plyr.css";
 | 
			
		||||
import { Options } from "plyr";
 | 
			
		||||
import Hls from "hls.js";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export function UnsupportedHlsMessage(): React.JSX.Element {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="unsupported-hls">
 | 
			
		||||
      HLS is not supported in your browser. Please try a different browser.
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const useHls = (src: string, options: Options | null) => {
 | 
			
		||||
  const hls = useRef<Hls>(new Hls());
 | 
			
		||||
  const hasQuality = useRef<boolean>(false);
 | 
			
		||||
  const [plyrOptions, setPlyrOptions] = useState<Options | null>(options);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    hasQuality.current = false; 
 | 
			
		||||
  }, [options]);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    hls.current.loadSource(src);
 | 
			
		||||
    hls.current.attachMedia(document.querySelector(".plyr-react")!);
 | 
			
		||||
 | 
			
		||||
    hls.current.on(Hls.Events.MANIFEST_PARSED, () => {
 | 
			
		||||
      if (hasQuality.current) return; // early quit if already set
 | 
			
		||||
 | 
			
		||||
      const levels = hls.current.levels;
 | 
			
		||||
      const quality: Options["quality"] = {
 | 
			
		||||
        default: levels[levels.length - 1].height,
 | 
			
		||||
        options: levels.map((level) => level.height),
 | 
			
		||||
        forced: true,
 | 
			
		||||
        onChange: (newQuality: number) => {
 | 
			
		||||
          levels.forEach((level, levelIndex) => {
 | 
			
		||||
            if (level.height === newQuality) {
 | 
			
		||||
              hls.current.currentLevel = levelIndex;
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
        },
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      setPlyrOptions({ ...plyrOptions, quality });
 | 
			
		||||
      hasQuality.current = true;
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  return { options: plyrOptions };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const CustomPlyrInstance = forwardRef<
 | 
			
		||||
  APITypes,
 | 
			
		||||
  PlyrProps & { hlsSource: string; mainColor: string; plyrOptions: Options }
 | 
			
		||||
>((props, ref) => {
 | 
			
		||||
  const { source, plyrOptions, hlsSource, mainColor } = props;
 | 
			
		||||
  const plyrRef = usePlyr(ref, {
 | 
			
		||||
    ...useHls(hlsSource, plyrOptions),
 | 
			
		||||
    source,
 | 
			
		||||
  }) as MutableRefObject<HTMLVideoElement>;
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
      <video
 | 
			
		||||
        ref={plyrRef}
 | 
			
		||||
        className="plyr-react plyr"
 | 
			
		||||
        style={{ "--plyr-color-main": mainColor } as React.CSSProperties}
 | 
			
		||||
      ></video>
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CustomPlyrInstance.displayName = 'CustomPlyrInstance'
 | 
			
		||||
 | 
			
		||||
export { CustomPlyrInstance }
 | 
			
		||||
@ -30,8 +30,10 @@ export default async function FundingGoal(): Promise<React.JSX.Element> {
 | 
			
		||||
                    {JSON.stringify(goals, null, 2)}
 | 
			
		||||
                </code>
 | 
			
		||||
            </pre> */}
 | 
			
		||||
            <div className="section">
 | 
			
		||||
 | 
			
		||||
            <article className="message is-info">
 | 
			
		||||
 | 
			
		||||
            <article className="message">
 | 
			
		||||
                <div className="message-header">
 | 
			
		||||
                    Funding Goal
 | 
			
		||||
                    <figure className="image is-32x32 is-rounded">
 | 
			
		||||
@ -50,7 +52,7 @@ export default async function FundingGoal(): Promise<React.JSX.Element> {
 | 
			
		||||
 | 
			
		||||
                            <p className="subtitle">${(goals.featuredFunded.amountCents * (goals.featuredFunded.completedPercentage * 0.01) / 100)} of {goals.featuredFunded.amountCents / 100} ({goals.featuredFunded.completedPercentage}%)
 | 
			
		||||
                            </p>
 | 
			
		||||
                            <div className="mb-5 tag is-success is-rounded" style={{ width: '100%' }}>
 | 
			
		||||
                            <div className="mb-5 tag is-success has-text-white is-rounded" style={{ width: '100%' }}>
 | 
			
		||||
                                FUNDED
 | 
			
		||||
                            </div>
 | 
			
		||||
                            <p>{goals.featuredFunded.description}</p>
 | 
			
		||||
@ -75,6 +77,7 @@ export default async function FundingGoal(): Promise<React.JSX.Element> {
 | 
			
		||||
                    </p>
 | 
			
		||||
                </div>
 | 
			
		||||
            </article>
 | 
			
		||||
            </div>
 | 
			
		||||
        </>
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@ export default function Pager({ baseUrl, page, pageCount }: IPagerProps): React.
 | 
			
		||||
 | 
			
		||||
    const getPagePath = (page: any): string => {
 | 
			
		||||
        const pageNumber = parseInt(page);
 | 
			
		||||
        console.log(`pageNumber=${pageNumber}`);
 | 
			
		||||
        return `${baseUrl}/${pageNumber}`;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,6 @@ import { faCalendar } from "@fortawesome/free-solid-svg-icons";
 | 
			
		||||
 | 
			
		||||
export function StreamButton({ stream }: { stream: IStream }) {
 | 
			
		||||
    if (!stream) return <></>
 | 
			
		||||
    // return <p>{JSON.stringify(stream, null, 2)}</p>
 | 
			
		||||
    // return <span className="button is-small">{new Date(stream.attributes.date).toLocaleDateString()}</span>
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <Link 
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
'use client';
 | 
			
		||||
 | 
			
		||||
import { IStream } from "@/lib/streams";
 | 
			
		||||
import NotFound from "app/streams/[cuid]/not-found";
 | 
			
		||||
// import NotFound from "app/streams/[cuid]/not-found";
 | 
			
		||||
import { IVod } from "@/lib/vods";
 | 
			
		||||
import Link from "next/link";
 | 
			
		||||
import Image from "next/image";
 | 
			
		||||
@ -77,7 +77,8 @@ export default function StreamPage({ stream }: IStreamProps) {
 | 
			
		||||
        setHemisphere(randomHemisphere);
 | 
			
		||||
    }, []);
 | 
			
		||||
 | 
			
		||||
    if (!stream) return <NotFound></NotFound>
 | 
			
		||||
    if (!stream) return <p>NotFound</p>
 | 
			
		||||
    // <NotFound></NotFound>
 | 
			
		||||
 | 
			
		||||
    // return <p>
 | 
			
		||||
    //     <pre>
 | 
			
		||||
 | 
			
		||||
@ -1,83 +0,0 @@
 | 
			
		||||
'use client';
 | 
			
		||||
 | 
			
		||||
import FullCalendar from "@fullcalendar/react";
 | 
			
		||||
import interactionPlugin, { DateClickArg } from '@fullcalendar/interaction';
 | 
			
		||||
import dayGridPlugin from '@fullcalendar/daygrid';
 | 
			
		||||
import multiMonthPlugin from '@fullcalendar/multimonth'
 | 
			
		||||
 | 
			
		||||
import { IStream } from "@/lib/streams";
 | 
			
		||||
import { useRouter } from 'next/navigation';
 | 
			
		||||
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
interface IStreamsCalendarProps {
 | 
			
		||||
    missingStreams: IStream[];
 | 
			
		||||
    issueStreams: IStream[];
 | 
			
		||||
    goodStreams: IStream[];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface IEvent {
 | 
			
		||||
    cuid: string;
 | 
			
		||||
    start: Date;
 | 
			
		||||
    end?: Date;
 | 
			
		||||
    title: string;
 | 
			
		||||
    vtuber: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// function buildStreamPageUrlFromDate(date: Date) {
 | 
			
		||||
//     // const cuid = 
 | 
			
		||||
//     return `/s/${safeDate}`;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
function handleEventClick(info: any, router: AppRouterInstance) {
 | 
			
		||||
    var eventObj = info.event;
 | 
			
		||||
    const { cuid } = eventObj._def.extendedProps;
 | 
			
		||||
    router.push(`/streams/${cuid}`);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function convertStreamToEvent(stream: IStream): IEvent {
 | 
			
		||||
    console.log(stream)
 | 
			
		||||
    const displayName = stream.attributes.vtuber.data.attributes.displayName;
 | 
			
		||||
    return {
 | 
			
		||||
        cuid: stream.attributes.cuid,
 | 
			
		||||
        start: new Date(stream.attributes.date),
 | 
			
		||||
        title: `${displayName}`,
 | 
			
		||||
        vtuber: displayName
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default function StreamsCalendar({ missingStreams, issueStreams, goodStreams }: IStreamsCalendarProps) {
 | 
			
		||||
    const router = useRouter();
 | 
			
		||||
    const eventSources = [
 | 
			
		||||
        {
 | 
			
		||||
            events: missingStreams.map(convertStreamToEvent),
 | 
			
		||||
            color: 'red'
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            events: issueStreams.map(convertStreamToEvent),
 | 
			
		||||
            color: 'yellow',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
            events: goodStreams.map(convertStreamToEvent),
 | 
			
		||||
            color: 'green'
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
            <FullCalendar
 | 
			
		||||
                plugins={[
 | 
			
		||||
                    dayGridPlugin,
 | 
			
		||||
                    interactionPlugin
 | 
			
		||||
                ]}
 | 
			
		||||
                editable={false}
 | 
			
		||||
                eventSources={eventSources}
 | 
			
		||||
                eventClick={(args) => {
 | 
			
		||||
                    handleEventClick(args, router);
 | 
			
		||||
                }}
 | 
			
		||||
            />
 | 
			
		||||
        </>
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								packages/next/app/components/thumbnail.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								packages/next/app/components/thumbnail.tsx
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
'use client'
 | 
			
		||||
import LinkableHeading from "./linkable-heading"
 | 
			
		||||
import Image from "next/image"
 | 
			
		||||
import { useState } from "react"
 | 
			
		||||
import styles from '@/assets/styles/fp.module.css'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export default function Thumbnail({url}: { url: string }) {
 | 
			
		||||
    const [isBig, setIsBig] = useState(false)
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div>
 | 
			
		||||
            <Image
 | 
			
		||||
                className={(isBig) ? styles.zoomout : styles.zoomin}
 | 
			
		||||
                onClick={() => setIsBig(!isBig)}
 | 
			
		||||
                src={url} 
 | 
			
		||||
                alt="A composite image showing several frames from the source video"
 | 
			
		||||
                width={(isBig) ? 1920 : 192}
 | 
			
		||||
                height={(isBig) ? 1080 : 108}
 | 
			
		||||
                quality={(isBig) ? 100 : 75}
 | 
			
		||||
            ></Image>
 | 
			
		||||
        </div>
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
@ -163,219 +163,231 @@ export default function UploadForm({ vtubers }: IUploadFormProps) {
 | 
			
		||||
        setValue('files', files);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <>
 | 
			
		||||
        
 | 
			
		||||
     return (<div className="notification is-secondary">
 | 
			
		||||
            <h1 className="title">VOD uploads</h1>
 | 
			
		||||
            <p>
 | 
			
		||||
                <i>coming soon!!</i>
 | 
			
		||||
            </p>
 | 
			
		||||
            <hr ></hr>
 | 
			
		||||
            <p>Track progress on the <a href="/goals">Goals Page</a></p>
 | 
			
		||||
    </div>)
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
            <div className='section'>
 | 
			
		||||
                <h2 className='title is-2'>Upload VOD</h2>
 | 
			
		||||
    // return (
 | 
			
		||||
    //     <>
 | 
			
		||||
 | 
			
		||||
                <p className="mb-5"><i>Together we can archive all lewdtuber livestreams!</i></p>
 | 
			
		||||
    //         <div className='section'>
 | 
			
		||||
    //             <h2 className='title is-2'>Upload VOD</h2>
 | 
			
		||||
 | 
			
		||||
                {(!authData?.accessToken)
 | 
			
		||||
                    ?
 | 
			
		||||
                    <>
 | 
			
		||||
                        <aside className='notification is-danger'><p>Please log in to upload VODs</p></aside>
 | 
			
		||||
                        <LoginButton />
 | 
			
		||||
                    </>
 | 
			
		||||
                    : (
 | 
			
		||||
    //             <p className="mb-5"><i>Together we can archive all lewdtuber livestreams!</i></p>
 | 
			
		||||
 | 
			
		||||
    //             {(!authData?.accessToken)
 | 
			
		||||
    //                 ?
 | 
			
		||||
    //                 <>
 | 
			
		||||
    //                     <aside className='notification is-danger'><p>Please log in to upload VODs</p></aside>
 | 
			
		||||
    //                     <LoginButton />
 | 
			
		||||
    //                 </>
 | 
			
		||||
    //                 : (
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        <div className='columns is-multiline'>
 | 
			
		||||
                            <form id="vod-details" onSubmit={handleSubmit(createUSC)}>
 | 
			
		||||
    //                     <div className='columns is-multiline'>
 | 
			
		||||
    //                         <form id="vod-details" onSubmit={handleSubmit(createUSC)}>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                {(!isSubmitSuccessful) && <div className='column is-full'>
 | 
			
		||||
                                    <section className="hero is-info mb-3">
 | 
			
		||||
                                        <div className="hero-body">
 | 
			
		||||
                                            <p className="title">
 | 
			
		||||
                                                Step 1
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                            <p className="subtitle">
 | 
			
		||||
                                                Upload the file
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </section>
 | 
			
		||||
                                    <section className="section mb-5">
 | 
			
		||||
                                        <Dashboard
 | 
			
		||||
                                            uppy={uppy}
 | 
			
		||||
                                            theme='dark'
 | 
			
		||||
                                            proudlyDisplayPoweredByUppy={false}
 | 
			
		||||
                                        />
 | 
			
		||||
    //                             {(!isSubmitSuccessful) && <div className='column is-full'>
 | 
			
		||||
    //                                 <section className="hero is-info mb-3">
 | 
			
		||||
    //                                     <div className="hero-body">
 | 
			
		||||
    //                                         <p className="title">
 | 
			
		||||
    //                                             Step 1
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                         <p className="subtitle">
 | 
			
		||||
    //                                             Upload the file
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
    //                                 <section className="section mb-5">
 | 
			
		||||
    //                                     <Dashboard
 | 
			
		||||
    //                                         uppy={uppy}
 | 
			
		||||
    //                                         theme='dark'
 | 
			
		||||
    //                                         proudlyDisplayPoweredByUppy={false}
 | 
			
		||||
    //                                     />
 | 
			
		||||
 | 
			
		||||
                                        <input
 | 
			
		||||
                                            required
 | 
			
		||||
                                            hidden={true}
 | 
			
		||||
                                            style={{ display: 'none' }}
 | 
			
		||||
                                            className="input" type="text"
 | 
			
		||||
                                            {...register('files')}
 | 
			
		||||
                                        ></input>
 | 
			
		||||
    //                                     <input
 | 
			
		||||
    //                                         required
 | 
			
		||||
    //                                         hidden={true}
 | 
			
		||||
    //                                         style={{ display: 'none' }}
 | 
			
		||||
    //                                         className="input" type="text"
 | 
			
		||||
    //                                         {...register('files')}
 | 
			
		||||
    //                                     ></input>
 | 
			
		||||
 | 
			
		||||
                                        {errors.files && <p className="help is-danger">{errors.files.message?.toString()}</p>}
 | 
			
		||||
               
 | 
			
		||||
    //                                     {errors.files && <p className="help is-danger">{errors.files.message?.toString()}</p>}
 | 
			
		||||
 | 
			
		||||
                                    </section>
 | 
			
		||||
                                </div>}
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
    //                             </div>}
 | 
			
		||||
 | 
			
		||||
                                {(!isSubmitSuccessful) && <div className='column is-full '>
 | 
			
		||||
                                    {/* {(!cuid) && <aside className='notification is-info'>Hint: Some of these fields are filled out automatically when uploading from a <Link href="/streams">stream</Link> page.</aside>} */}
 | 
			
		||||
    //                             {(!isSubmitSuccessful) && <div className='column is-full '>
 | 
			
		||||
    //                                 {/* {(!cuid) && <aside className='notification is-info'>Hint: Some of these fields are filled out automatically when uploading from a <Link href="/streams">stream</Link> page.</aside>} */}
 | 
			
		||||
 | 
			
		||||
                                    <section className="hero is-info mb-3">
 | 
			
		||||
                                        <div className="hero-body">
 | 
			
		||||
                                            <p className="title">
 | 
			
		||||
                                                Step 2
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                            <p className="subtitle">
 | 
			
		||||
                                                Tell us about the VOD
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </section>
 | 
			
		||||
    //                                 <section className="hero is-info mb-3">
 | 
			
		||||
    //                                     <div className="hero-body">
 | 
			
		||||
    //                                         <p className="title">
 | 
			
		||||
    //                                             Step 2
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                         <p className="subtitle">
 | 
			
		||||
    //                                             Tell us about the VOD
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
 | 
			
		||||
                                    <section className="section">
 | 
			
		||||
    //                                 <section className="section">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                        {/* <input
 | 
			
		||||
                                            required
 | 
			
		||||
                                            // hidden={false}
 | 
			
		||||
                                            // style={{ display: 'none' }}
 | 
			
		||||
                                            className="input" type="text"
 | 
			
		||||
                                            {...register('streamCuid')}
 | 
			
		||||
                                        ></input> */}
 | 
			
		||||
    //                                     {/* <input
 | 
			
		||||
    //                                         required
 | 
			
		||||
    //                                         // hidden={false}
 | 
			
		||||
    //                                         // style={{ display: 'none' }}
 | 
			
		||||
    //                                         className="input" type="text"
 | 
			
		||||
    //                                         {...register('streamCuid')}
 | 
			
		||||
    //                                     ></input> */}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                        <div className="field">
 | 
			
		||||
                                            <label className="label">VTuber</label>
 | 
			
		||||
                                            <div className="select">
 | 
			
		||||
                                                <select
 | 
			
		||||
                                                    required
 | 
			
		||||
                                                    // value={vtuber}
 | 
			
		||||
                                                    // onChange={(evt) => setVtuber(parseInt(evt.target.value))}
 | 
			
		||||
                                                    {...register('vtuber')}
 | 
			
		||||
                                                >
 | 
			
		||||
                                                    {vtubers.map((vtuber: IVtuber) => (
 | 
			
		||||
                                                        <option key={vtuber.id} value={vtuber.id}>{vtuber.attributes.displayName}</option>
 | 
			
		||||
                                                    ))}
 | 
			
		||||
                                                </select>
 | 
			
		||||
                                            </div>
 | 
			
		||||
                                            <p className="help is-info">Choose the VTuber this VOD belongs to. (More VTubers will be added when storage/bandwidth funding is secured.)</p>
 | 
			
		||||
                                            {errors.vtuber && <p className="help is-danger">vtuber error</p>}
 | 
			
		||||
    //                                     <div className="field">
 | 
			
		||||
    //                                         <label className="label">VTuber</label>
 | 
			
		||||
    //                                         <div className="select">
 | 
			
		||||
    //                                             <select
 | 
			
		||||
    //                                                 required
 | 
			
		||||
    //                                                 // value={vtuber}
 | 
			
		||||
    //                                                 // onChange={(evt) => setVtuber(parseInt(evt.target.value))}
 | 
			
		||||
    //                                                 {...register('vtuber')}
 | 
			
		||||
    //                                             >
 | 
			
		||||
    //                                                 {vtubers.map((vtuber: IVtuber) => (
 | 
			
		||||
    //                                                     <option key={vtuber.id} value={vtuber.id}>{vtuber.attributes.displayName}</option>
 | 
			
		||||
    //                                                 ))}
 | 
			
		||||
    //                                             </select>
 | 
			
		||||
    //                                         </div>
 | 
			
		||||
    //                                         <p className="help is-info">Choose the VTuber this VOD belongs to. (More VTubers will be added when storage/bandwidth funding is secured.)</p>
 | 
			
		||||
    //                                         {errors.vtuber && <p className="help is-danger">vtuber error</p>}
 | 
			
		||||
 | 
			
		||||
                                        </div>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
 | 
			
		||||
                                        <div className="field">
 | 
			
		||||
                                            <label className="label">Stream Date</label>
 | 
			
		||||
                                            <input
 | 
			
		||||
                                                required
 | 
			
		||||
                                                className="input" type="date"
 | 
			
		||||
                                                {...register('date')}
 | 
			
		||||
                                            // onChange={(evt) => setDate(evt.target.value)}
 | 
			
		||||
                                            ></input>
 | 
			
		||||
                                            <p className="help is-info">The date when the VOD was originally streamed.</p>
 | 
			
		||||
                                            {errors.date && <p className="help is-danger">{errors.date.message?.toString()}</p>}
 | 
			
		||||
    //                                     <div className="field">
 | 
			
		||||
    //                                         <label className="label">Stream Date</label>
 | 
			
		||||
    //                                         <input
 | 
			
		||||
    //                                             required
 | 
			
		||||
    //                                             className="input" type="date"
 | 
			
		||||
    //                                             {...register('date')}
 | 
			
		||||
    //                                         // onChange={(evt) => setDate(evt.target.value)}
 | 
			
		||||
    //                                         ></input>
 | 
			
		||||
    //                                         <p className="help is-info">The date when the VOD was originally streamed.</p>
 | 
			
		||||
    //                                         {errors.date && <p className="help is-danger">{errors.date.message?.toString()}</p>}
 | 
			
		||||
 | 
			
		||||
                                        </div>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
 | 
			
		||||
                                        <div className="field">
 | 
			
		||||
                                            <label className="label">Notes</label>
 | 
			
		||||
                                            <textarea
 | 
			
		||||
                                                className="textarea"
 | 
			
		||||
                                                placeholder="e.g. Missing first 10 minutes of stream"
 | 
			
		||||
                                                // onChange={(evt) => setNote(evt.target.value)}
 | 
			
		||||
                                                {...register('notes')}
 | 
			
		||||
                                            ></textarea>
 | 
			
		||||
                                            <p className="help is-info">If there are any issues with the VOD, put a note here. If there are no VOD issues, leave this field blank.</p>
 | 
			
		||||
                                        </div>
 | 
			
		||||
    //                                     <div className="field">
 | 
			
		||||
    //                                         <label className="label">Notes</label>
 | 
			
		||||
    //                                         <textarea
 | 
			
		||||
    //                                             className="textarea"
 | 
			
		||||
    //                                             placeholder="e.g. Missing first 10 minutes of stream"
 | 
			
		||||
    //                                             // onChange={(evt) => setNote(evt.target.value)}
 | 
			
		||||
    //                                             {...register('notes')}
 | 
			
		||||
    //                                         ></textarea>
 | 
			
		||||
    //                                         <p className="help is-info">If there are any issues with the VOD, put a note here. If there are no VOD issues, leave this field blank.</p>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
 | 
			
		||||
                                        <div className="field">
 | 
			
		||||
                                            <label className="label">Attribution</label>
 | 
			
		||||
                                            <label className="checkbox">
 | 
			
		||||
                                                <input
 | 
			
		||||
                                                    type="checkbox"
 | 
			
		||||
                                                    // onChange={(evt) => setAttribution(evt.target.checked)}
 | 
			
		||||
                                                    {...register('attribution')}
 | 
			
		||||
                                                />
 | 
			
		||||
                                                <span className={`ml-2 ${styles.noselect}`}>Credit {authData.user?.username} for the upload.</span>
 | 
			
		||||
                                                <p className="help is-info">Check this box if you want your username displayed on the website. Thank you for uploading!</p>
 | 
			
		||||
                                            </label>
 | 
			
		||||
                                        </div>
 | 
			
		||||
    //                                     <div className="field">
 | 
			
		||||
    //                                         <label className="label">Attribution</label>
 | 
			
		||||
    //                                         <label className="checkbox">
 | 
			
		||||
    //                                             <input
 | 
			
		||||
    //                                                 type="checkbox"
 | 
			
		||||
    //                                                 // onChange={(evt) => setAttribution(evt.target.checked)}
 | 
			
		||||
    //                                                 {...register('attribution')}
 | 
			
		||||
    //                                             />
 | 
			
		||||
    //                                             <span className={`ml-2 ${styles.noselect}`}>Credit {authData.user?.username} for the upload.</span>
 | 
			
		||||
    //                                             <p className="help is-info">Check this box if you want your username displayed on the website. Thank you for uploading!</p>
 | 
			
		||||
    //                                         </label>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
 | 
			
		||||
                                    </section>
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
 | 
			
		||||
                                </div>}
 | 
			
		||||
    //                             </div>}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                <div className="column is-full">
 | 
			
		||||
                                    <section className="hero is-info">
 | 
			
		||||
                                        <div className="hero-body">
 | 
			
		||||
                                            <p className="title">
 | 
			
		||||
                                                Step 3
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                            <p className="subtitle">
 | 
			
		||||
                                                Send the form
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </section>
 | 
			
		||||
                                    <section className="section">
 | 
			
		||||
    //                             <div className="column is-full">
 | 
			
		||||
    //                                 <section className="hero is-info">
 | 
			
		||||
    //                                     <div className="hero-body">
 | 
			
		||||
    //                                         <p className="title">
 | 
			
		||||
    //                                             Step 3
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                         <p className="subtitle">
 | 
			
		||||
    //                                             Send the form
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                     </div>
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
    //                                 <section className="section">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                        {errors.root?.serverError && (
 | 
			
		||||
                                            <div className="notification">
 | 
			
		||||
                                                <button className="delete" onClick={() => clearErrors()}></button>
 | 
			
		||||
                                                <ErrorMessage name="root" errors={errors} ></ErrorMessage>
 | 
			
		||||
                                          </div>
 | 
			
		||||
                                        )}
 | 
			
		||||
    //                                     {errors.root?.serverError && (
 | 
			
		||||
    //                                         <div className="notification">
 | 
			
		||||
    //                                             <button className="delete" onClick={() => clearErrors()}></button>
 | 
			
		||||
    //                                             <ErrorMessage name="root" errors={errors} ></ErrorMessage>
 | 
			
		||||
    //                                       </div>
 | 
			
		||||
    //                                     )}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                        {!isSubmitSuccessful && (
 | 
			
		||||
                                            <button className="button is-primary is-large mt-5">
 | 
			
		||||
                                                <span className="icon is-small">
 | 
			
		||||
                                                    <FontAwesomeIcon icon={faPaperPlane}></FontAwesomeIcon>
 | 
			
		||||
                                                </span>
 | 
			
		||||
                                                <span>Send</span>
 | 
			
		||||
                                            </button>
 | 
			
		||||
                                        )}
 | 
			
		||||
    //                                     {!isSubmitSuccessful && (
 | 
			
		||||
    //                                         <button className="button is-primary is-large mt-5">
 | 
			
		||||
    //                                             <span className="icon is-small">
 | 
			
		||||
    //                                                 <FontAwesomeIcon icon={faPaperPlane}></FontAwesomeIcon>
 | 
			
		||||
    //                                             </span>
 | 
			
		||||
    //                                             <span>Send</span>
 | 
			
		||||
    //                                         </button>
 | 
			
		||||
    //                                     )}
 | 
			
		||||
 | 
			
		||||
                                        {isSubmitting && (
 | 
			
		||||
                                            <p>
 | 
			
		||||
                                                <FontAwesomeIcon className="mt-5 fa-spin-pulse" icon={faSpinner} ></FontAwesomeIcon>
 | 
			
		||||
                                            </p>
 | 
			
		||||
                                        )}
 | 
			
		||||
                                        {isSubmitSuccessful && (
 | 
			
		||||
                                            <>
 | 
			
		||||
                                                <aside className="notification mt-5 is-success">Thank you for uploading! </aside>
 | 
			
		||||
                                                <button onClick={() => {
 | 
			
		||||
                                                    reset(); // reset form
 | 
			
		||||
                                                    const files = uppy.getFiles() 
 | 
			
		||||
                                                    for (const file of files) { 
 | 
			
		||||
                                                        uppy.removeFile(file.id); // reset uppy
 | 
			
		||||
                                                    }
 | 
			
		||||
                                                }} className="button is-primary">
 | 
			
		||||
                                                    <span className="icon is-small">
 | 
			
		||||
                                                        <FontAwesomeIcon icon={faEraser}></FontAwesomeIcon>
 | 
			
		||||
                                                    </span>
 | 
			
		||||
                                                    <span>Reset form</span>
 | 
			
		||||
                                                </button>
 | 
			
		||||
                                            </>
 | 
			
		||||
                                        )}
 | 
			
		||||
    //                                     {isSubmitting && (
 | 
			
		||||
    //                                         <p>
 | 
			
		||||
    //                                             <FontAwesomeIcon className="mt-5 fa-spin-pulse" icon={faSpinner} ></FontAwesomeIcon>
 | 
			
		||||
    //                                         </p>
 | 
			
		||||
    //                                     )}
 | 
			
		||||
    //                                     {isSubmitSuccessful && (
 | 
			
		||||
    //                                         <>
 | 
			
		||||
    //                                             <aside className="notification mt-5 is-success">Thank you for uploading! </aside>
 | 
			
		||||
    //                                             <button onClick={() => {
 | 
			
		||||
    //                                                 reset(); // reset form
 | 
			
		||||
    //                                                 const files = uppy.getFiles() 
 | 
			
		||||
    //                                                 for (const file of files) { 
 | 
			
		||||
    //                                                     uppy.removeFile(file.id); // reset uppy
 | 
			
		||||
    //                                                 }
 | 
			
		||||
    //                                             }} className="button is-primary">
 | 
			
		||||
    //                                                 <span className="icon is-small">
 | 
			
		||||
    //                                                     <FontAwesomeIcon icon={faEraser}></FontAwesomeIcon>
 | 
			
		||||
    //                                                 </span>
 | 
			
		||||
    //                                                 <span>Reset form</span>
 | 
			
		||||
    //                                             </button>
 | 
			
		||||
    //                                         </>
 | 
			
		||||
    //                                     )}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                    </section>
 | 
			
		||||
                                </div>
 | 
			
		||||
    //                                 </section>
 | 
			
		||||
    //                             </div>
 | 
			
		||||
 | 
			
		||||
                            </form>
 | 
			
		||||
                        </div>
 | 
			
		||||
    //                         </form>
 | 
			
		||||
    //                     </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
    //                 )
 | 
			
		||||
    //             }
 | 
			
		||||
 | 
			
		||||
            </div>
 | 
			
		||||
    //         </div>
 | 
			
		||||
 | 
			
		||||
        </>
 | 
			
		||||
    )
 | 
			
		||||
    //     </>
 | 
			
		||||
    // )
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,6 @@
 | 
			
		||||
 | 
			
		||||
import { useEffect, useState, forwardRef, useContext, Ref } from 'react';
 | 
			
		||||
import { IVod } from '@/lib/vods';
 | 
			
		||||
import "plyr-react/plyr.css";
 | 
			
		||||
import { useAuth } from '@/components/auth';
 | 
			
		||||
import { getVodTitle } from './vod-page';
 | 
			
		||||
import { VideoSourceSelector } from '@/components/video-source-selector'
 | 
			
		||||
@ -123,7 +122,6 @@ export const VideoPlayer = forwardRef(function VideoPlayer( props: IPlayerProps,
 | 
			
		||||
                src={src}
 | 
			
		||||
                tokens={tokens}
 | 
			
		||||
                primaryColor="#FFFFFF"
 | 
			
		||||
                secondaryColor={hexToRgba(vod.attributes.vtuber.data.attributes.themeColor, 0.85)}
 | 
			
		||||
                metadata={{
 | 
			
		||||
                    video_title: getVodTitle(vod)
 | 
			
		||||
                }}
 | 
			
		||||
 | 
			
		||||
@ -8,6 +8,7 @@ import Image from 'next/image'
 | 
			
		||||
import { LocalizedDate } from '@/components/localized-date'
 | 
			
		||||
import { IMuxAsset, IMuxAssetResponse } from "@/lib/types";
 | 
			
		||||
import { IB2File } from "@/lib/b2File";
 | 
			
		||||
import VtuberButton from "./vtuber-button";
 | 
			
		||||
 | 
			
		||||
interface IVodCardProps {
 | 
			
		||||
    id: number;
 | 
			
		||||
@ -42,22 +43,9 @@ export default function VodCard({id, title, date, muxAsset, thumbnail = 'https:/
 | 
			
		||||
                        </figure>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="card-content">
 | 
			
		||||
                        <h1>{title}</h1>
 | 
			
		||||
                        <p className="subtitle">{vtuber.attributes.displayName}</p>
 | 
			
		||||
                        <LocalizedDate date={new Date(date)} />
 | 
			
		||||
 | 
			
		||||
                        <footer className="mt-3 card-footer">
 | 
			
		||||
                            <div className="card-footer-item">
 | 
			
		||||
                                <FontAwesomeIcon
 | 
			
		||||
                                    icon={faVideo} 
 | 
			
		||||
                                    className="fas fa-video" 
 | 
			
		||||
                                ></FontAwesomeIcon>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            {muxAsset && (
 | 
			
		||||
                                <div className="card-footer-item">
 | 
			
		||||
                                    <FontAwesomeIcon icon={faPatreon} className="fab fa-patreon" />
 | 
			
		||||
                                </div>
 | 
			
		||||
                            )}
 | 
			
		||||
                        </footer>
 | 
			
		||||
                        <p className="">{title}</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </Link>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
@ -3,16 +3,18 @@ import { IVod } from '@/lib/vods';
 | 
			
		||||
import Link from 'next/link';
 | 
			
		||||
import { VideoInteractive } from './video-interactive';
 | 
			
		||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
 | 
			
		||||
import { faChevronLeft, faChevronRight, faGlobe, faLink } from "@fortawesome/free-solid-svg-icons";
 | 
			
		||||
import { faChevronLeft, faChevronRight, faGlobe, faImage, faLink } from "@fortawesome/free-solid-svg-icons";
 | 
			
		||||
import { notFound } from 'next/navigation';
 | 
			
		||||
import { IpfsCid } from './ipfs-cid';
 | 
			
		||||
import LinkableHeading from './linkable-heading';
 | 
			
		||||
 | 
			
		||||
import Image from 'next/image';
 | 
			
		||||
import Thumbnail from './thumbnail';
 | 
			
		||||
 | 
			
		||||
export function getVodTitle(vod: IVod): string {
 | 
			
		||||
    // console.log('lets getVodTitle, ey?')
 | 
			
		||||
    // console.log(JSON.stringify(vod, null, 2))
 | 
			
		||||
    return vod.attributes.title || vod.attributes.announceTitle || (vod.attributes?.date2 && vod.attributes?.vtuber?.data?.attributes?.displayName) ? `${vod.attributes.vtuber.data.attributes.displayName} ${vod.attributes.date2}` : `VOD ${vod.id}`;
 | 
			
		||||
    return vod.attributes?.title || vod.attributes?.announceTitle || `VOD ${vod.id}`
 | 
			
		||||
    // return vod.attributes.title || vod.attributes.announceTitle || (vod.attributes?.date2 && vod.attributes?.vtuber?.data?.attributes?.displayName) ? `${vod.attributes.vtuber.data.attributes.displayName} ${vod.attributes.date2}` : `VOD ${vod.id}`;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function buildMuxUrl(playbackId: string, token: string) {
 | 
			
		||||
@ -41,10 +43,14 @@ export default async function VodPage({vod}: { vod: IVod }) {
 | 
			
		||||
    return (
 | 
			
		||||
 | 
			
		||||
        <div className="container">
 | 
			
		||||
            <div className="block">
 | 
			
		||||
                <div className="box">
 | 
			
		||||
            <div className="block mb-5">
 | 
			
		||||
                    <VideoInteractive vod={vod}></VideoInteractive>
 | 
			
		||||
 | 
			
		||||
                    {(vod.attributes.thumbnail) && (<div className='mb-5'>
 | 
			
		||||
                        <LinkableHeading text="Thumbnail Image" slug="thumb" icon={faImage}></LinkableHeading>
 | 
			
		||||
                        <Thumbnail url={vod.attributes.thumbnail.data.attributes.cdnUrl}></Thumbnail>
 | 
			
		||||
                    </div>)}
 | 
			
		||||
 | 
			
		||||
                    {(vod.attributes.videoSrcHash || vod.attributes.video240Hash) && (
 | 
			
		||||
                        <>
 | 
			
		||||
                            <LinkableHeading text="IPFS Content IDs" slug="ipfs" icon={faGlobe}></LinkableHeading>
 | 
			
		||||
@ -94,7 +100,6 @@ export default async function VodPage({vod}: { vod: IVod }) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9,10 +9,10 @@ import LinkableHeading from '@/components/linkable-heading';
 | 
			
		||||
export default async function Page() {
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="content">
 | 
			
		||||
      <div className="block">
 | 
			
		||||
        <div className="box">
 | 
			
		||||
          <p id="faq" className="title">Frequently Asked Questions (FAQ)</p>
 | 
			
		||||
 | 
			
		||||
        <div className="section">
 | 
			
		||||
            <p id="faq" className="title">Frequently Asked Questions (FAQ)</p>
 | 
			
		||||
        </div>
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          <div className="section">
 | 
			
		||||
@ -97,8 +97,6 @@ export default async function Page() {
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
@ -34,10 +34,13 @@ export default async function Page() {
 | 
			
		||||
        <>
 | 
			
		||||
            <div className="content">
 | 
			
		||||
                <div className="block">
 | 
			
		||||
                    <div className="box">
 | 
			
		||||
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <h1 className="title">Goals</h1>
 | 
			
		||||
                        <p className="subtitle mt-5">
 | 
			
		||||
                        <p className="subtitle">Shooting for the stars</p>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <p className="title is-size-4">
 | 
			
		||||
                            <span>In Progress</span>
 | 
			
		||||
                        </p>
 | 
			
		||||
                        <ul className="">
 | 
			
		||||
@ -47,8 +50,10 @@ export default async function Page() {
 | 
			
		||||
                                </li>
 | 
			
		||||
                            ))}
 | 
			
		||||
                        </ul>
 | 
			
		||||
                        <p className="subtitle mt-5">
 | 
			
		||||
                            <span>Planned</span>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <p className="title is-size-4">
 | 
			
		||||
                            Planned
 | 
			
		||||
                        </p>
 | 
			
		||||
                        <ul className="">
 | 
			
		||||
                            {planned.map((goal) => (
 | 
			
		||||
@ -57,7 +62,9 @@ export default async function Page() {
 | 
			
		||||
                                </li>
 | 
			
		||||
                            ))}
 | 
			
		||||
                        </ul>
 | 
			
		||||
                        <p className="subtitle mt-5">
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <div className="section">
 | 
			
		||||
                        <p className="title is-size-4">
 | 
			
		||||
                            <span>Completed</span>
 | 
			
		||||
                        </p>
 | 
			
		||||
                        <ul className="">
 | 
			
		||||
@ -68,7 +75,7 @@ export default async function Page() {
 | 
			
		||||
                            ))}
 | 
			
		||||
                        </ul>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </>
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ export default async function Page() {
 | 
			
		||||
    return (
 | 
			
		||||
        <div className="content">
 | 
			
		||||
            <div className="box">
 | 
			
		||||
                <h2>Healthy!</h2>
 | 
			
		||||
                <h2>Healthy! </h2>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
import { ReactNode } from 'react'
 | 
			
		||||
import Footer from "./components/footer"
 | 
			
		||||
import Navbar from "./components/navbar"
 | 
			
		||||
import "../assets/styles/global.sass";
 | 
			
		||||
import "bulma"
 | 
			
		||||
import "../assets/styles/global.css";
 | 
			
		||||
import "@fortawesome/fontawesome-svg-core/styles.css";
 | 
			
		||||
import { AuthProvider } from './components/auth';
 | 
			
		||||
import type { Metadata } from 'next';
 | 
			
		||||
 | 
			
		||||
@ -78,13 +78,10 @@ export async function getVodFromSafeDateOrCuid(safeDateOrCuid: string): Promise<
 | 
			
		||||
        vod = await getVodByCuid(safeDateOrCuid);
 | 
			
		||||
        if (!vod) return null;
 | 
			
		||||
    } else {
 | 
			
		||||
        console.log('This is a safeDate!');
 | 
			
		||||
        date = await getDateFromSafeDate(safeDateOrCuid);
 | 
			
		||||
        if (!date) {
 | 
			
		||||
            console.log('there is no date')
 | 
			
		||||
            return null;
 | 
			
		||||
        } else {
 | 
			
		||||
            console.log(`date=${date}`)
 | 
			
		||||
        }
 | 
			
		||||
        vod = await getVodForDate(date);
 | 
			
		||||
    }
 | 
			
		||||
@ -92,7 +89,7 @@ export async function getVodFromSafeDateOrCuid(safeDateOrCuid: string): Promise<
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getUrl(vod: IVod, slug: string, date: string): string {
 | 
			
		||||
    return `${siteUrl}/vt/${slug}/vod/${getSafeDate(date)}`
 | 
			
		||||
    return `/vt/${slug}/vod/${getSafeDate(date)}`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,11 +33,9 @@ export default async function Page() {
 | 
			
		||||
          </div>
 | 
			
		||||
        </section>
 | 
			
		||||
 | 
			
		||||
        <section className="section">
 | 
			
		||||
          <FundingGoal />
 | 
			
		||||
        </section>
 | 
			
		||||
        <FundingGoal />
 | 
			
		||||
 | 
			
		||||
        <section className="section">
 | 
			
		||||
        <div className="section">
 | 
			
		||||
 | 
			
		||||
            <h2 className="is-2 title">Latest VODs</h2>
 | 
			
		||||
            <div className="columns is-multiline is-mobile">
 | 
			
		||||
@ -56,16 +54,16 @@ export default async function Page() {
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <Link className='button' href={`/latest-vods/1`}>See all Latest Vods</Link>
 | 
			
		||||
          </section>
 | 
			
		||||
          <section className="section">
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className="section">
 | 
			
		||||
            
 | 
			
		||||
            <h2 className="is-2 title">VTubers</h2>
 | 
			
		||||
            {/* <nav className="columns is-multiline">
 | 
			
		||||
            <nav className="columns is-multiline">
 | 
			
		||||
              {vtubers.data.map((vtuber: IVtuber) =>
 | 
			
		||||
                <VTuberCard key={vtuber.id} {...vtuber} />
 | 
			
		||||
              )}
 | 
			
		||||
            </nav> */}
 | 
			
		||||
        </section>
 | 
			
		||||
            </nav>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
@ -13,28 +13,32 @@ export default async function Page() {
 | 
			
		||||
    <>
 | 
			
		||||
      <div className="content">
 | 
			
		||||
        <div className="block">
 | 
			
		||||
          <div className="box">
 | 
			
		||||
          <div className='section'>
 | 
			
		||||
            <h1 className="title">Patron List</h1>
 | 
			
		||||
            <p className="subtitle">
 | 
			
		||||
              <span>Futureporn.net continues to improve thanks to </span>
 | 
			
		||||
              <strong>{patreonCampaign.patronCount} generous supporters.</strong>
 | 
			
		||||
            </p>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div className='section'>
 | 
			
		||||
 | 
			
		||||
            <PatronsList displayStyle="box" />
 | 
			
		||||
 | 
			
		||||
            <p>Want to get your name on this list, and get perks like FAST video streaming?</p>
 | 
			
		||||
            <Link target="_blank" rel="noopener noreferrer" href="https://patreon.com/CJ_Clippy" className='button is-primary mb-3'>
 | 
			
		||||
              <span className="mr-1">Become a patron today!</span>
 | 
			
		||||
                <FontAwesomeIcon
 | 
			
		||||
                    icon={faExternalLinkAlt}
 | 
			
		||||
                    className="fab fa-external-link-alt"
 | 
			
		||||
                ></FontAwesomeIcon>
 | 
			
		||||
            </Link>
 | 
			
		||||
            <p className='subtitle'>
 | 
			
		||||
              Patron names are private by default--{' '}
 | 
			
		||||
              <Link href="/profile">Opt-in</Link> to have your name displayed.
 | 
			
		||||
            </p>
 | 
			
		||||
          </div>
 | 
			
		||||
            <div className='box'>
 | 
			
		||||
              <p>Want to get your name on this list, and get perks like FAST video streaming?</p>
 | 
			
		||||
              <Link target="_blank" rel="noopener noreferrer" href="https://patreon.com/CJ_Clippy" className='button is-primary mb-3'>
 | 
			
		||||
                <span className="mr-1">Become a patron today!</span>
 | 
			
		||||
                  <FontAwesomeIcon
 | 
			
		||||
                      icon={faExternalLinkAlt}
 | 
			
		||||
                      className="fab fa-external-link-alt"
 | 
			
		||||
                  ></FontAwesomeIcon>
 | 
			
		||||
              </Link>
 | 
			
		||||
              <p className='subtitle'>
 | 
			
		||||
                Patron names are private by default--{' '}
 | 
			
		||||
                <Link href="/profile">Opt-in</Link> to have your name displayed.
 | 
			
		||||
              </p>
 | 
			
		||||
            </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </>
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ export default async function Page() {
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div className="content">
 | 
			
		||||
            <div className="box">
 | 
			
		||||
            <div className="section">
 | 
			
		||||
                <h2>Tags</h2>
 | 
			
		||||
                <SortableTags tags={tags}/>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
 | 
			
		||||
import { getAllVtubers } from '@/lib/vtubers';
 | 
			
		||||
import UploadForm from '@/components/upload-form';
 | 
			
		||||
import { Suspense } from 'react';
 | 
			
		||||
 | 
			
		||||
import '@uppy/core/dist/style.min.css';
 | 
			
		||||
import '@uppy/dashboard/dist/style.min.css';
 | 
			
		||||
@ -11,14 +12,15 @@ export default async function Page() {
 | 
			
		||||
 | 
			
		||||
  const vtubers = await getAllVtubers();
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  if (!vtubers) return (
 | 
			
		||||
    <aside className='notification is-danger'>Failed to fetch vtubers list. Please try again later.</aside>
 | 
			
		||||
  )
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
 | 
			
		||||
      {!vtubers 
 | 
			
		||||
        ? <aside className='notification is-danger'>Failed to fetch vtubers list. Please try again later.</aside>
 | 
			
		||||
        : <UploadForm vtubers={vtubers}></UploadForm>
 | 
			
		||||
      }
 | 
			
		||||
      <Suspense>
 | 
			
		||||
        <UploadForm vtubers={vtubers}></UploadForm>
 | 
			
		||||
      </Suspense>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </>
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,6 @@ import styles from '@/assets/styles/icon.module.css';
 | 
			
		||||
import { getVodsForVtuber } from '@/lib/vods';
 | 
			
		||||
import { notFound } from 'next/navigation';
 | 
			
		||||
import ArchiveProgress from '@/components/archive-progress';
 | 
			
		||||
import StreamsCalendar from '@/components/streams-calendar';
 | 
			
		||||
import { getAllStreamsForVtuber, getStreamsForVtuber } from '@/lib/streams';
 | 
			
		||||
import LinkableHeading from '@/components/linkable-heading';
 | 
			
		||||
 | 
			
		||||
@ -52,7 +51,7 @@ export default async function Page({ params }: { params: { slug: string } }) {
 | 
			
		||||
    <>
 | 
			
		||||
      {vtuber && (
 | 
			
		||||
        <>
 | 
			
		||||
          <div className="box">
 | 
			
		||||
          <div className="section">
 | 
			
		||||
 | 
			
		||||
            <div className="columns is-multiline">
 | 
			
		||||
              <div className="column is-full">
 | 
			
		||||
@ -223,21 +222,11 @@ export default async function Page({ params }: { params: { slug: string } }) {
 | 
			
		||||
 | 
			
		||||
            <VodsList vtuber={vtuber} vods={vods.data} page={1} pageSize={9} />
 | 
			
		||||
            {
 | 
			
		||||
              (vtuber.attributes.vods) ? (
 | 
			
		||||
              (vods.data) ? (
 | 
			
		||||
                <Link className='button mb-5' href={`/vt/${vtuber.attributes.slug}/vods/1`}>See all {vtuber.attributes.displayName} vods</Link>
 | 
			
		||||
              ) : (<p className='section'><i>No VODs have been added, yet.</i></p>)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            {/* <h2 id="streams" className='title is-3'>
 | 
			
		||||
              <Link href="#streams">Streams</Link>
 | 
			
		||||
            </h2> */}
 | 
			
		||||
            {/* <StreamsCalendar missingStreams={missingStreams} issueStreams={issueStreams} goodStreams={goodStreams} /> */}
 | 
			
		||||
{/* 
 | 
			
		||||
            <h2 id="progress" className='title is-3'>
 | 
			
		||||
              <Link href="#progress">Archive Progress</Link>
 | 
			
		||||
            </h2>
 | 
			
		||||
            <ArchiveProgress vtuber={vtuber} /> */}
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
          </div>
 | 
			
		||||
        </>
 | 
			
		||||
 | 
			
		||||
@ -1,89 +0,0 @@
 | 
			
		||||
$cell-height : 10px;
 | 
			
		||||
$cell-width : 10px;
 | 
			
		||||
$cell-margin:2px;
 | 
			
		||||
$cell-weekdays-width: 30px;
 | 
			
		||||
 | 
			
		||||
html {
 | 
			
		||||
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
html, body {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#container {
 | 
			
		||||
  height: 514px;
 | 
			
		||||
  width: 930px;
 | 
			
		||||
  margin: 50px auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.timeline {
 | 
			
		||||
  margin: 20px;
 | 
			
		||||
  margin-bottom: 60px;
 | 
			
		||||
  
 | 
			
		||||
  .timeline-months {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    padding-left: $cell-weekdays-width;
 | 
			
		||||
 | 
			
		||||
    &-month {
 | 
			
		||||
      width: $cell-width;
 | 
			
		||||
      margin: $cell-margin;
 | 
			
		||||
      border: 1px solid transparent;
 | 
			
		||||
      font-size: 10px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .Jan~.Jan,
 | 
			
		||||
    .Feb~.Feb,
 | 
			
		||||
    .Mar~.Mar,
 | 
			
		||||
    .Apr~.Apr,
 | 
			
		||||
    .May~.May,
 | 
			
		||||
    .Jun~.Jun,
 | 
			
		||||
    .Jul~.Jul,
 | 
			
		||||
    .Aug~.Aug,
 | 
			
		||||
    .Sep~.Sep,
 | 
			
		||||
    .Oct~.Oct,
 | 
			
		||||
    .Nov~.Nov,
 | 
			
		||||
    .Dec~.Dec {
 | 
			
		||||
      visibility: hidden;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &-body {
 | 
			
		||||
    display: flex;
 | 
			
		||||
 | 
			
		||||
    .timeline-weekdays {
 | 
			
		||||
      display: inline-flex;
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      width: $cell-weekdays-width;
 | 
			
		||||
 | 
			
		||||
      &-weekday {
 | 
			
		||||
        font-size: 10px;
 | 
			
		||||
        height: $cell-height;
 | 
			
		||||
        border: 1px solid transparent;
 | 
			
		||||
        margin: $cell-margin;
 | 
			
		||||
        vertical-align: middle;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .timeline-cells {
 | 
			
		||||
      display: inline-flex;
 | 
			
		||||
      flex-direction: column;
 | 
			
		||||
      flex-wrap: wrap;
 | 
			
		||||
      height: #{(10 + 4) * 8}px;
 | 
			
		||||
 | 
			
		||||
      &-cell {
 | 
			
		||||
        height: $cell-height;
 | 
			
		||||
        width: $cell-width;
 | 
			
		||||
        border: 1px solid rgba(0, 0, 0, 0.1);
 | 
			
		||||
        margin: $cell-margin;
 | 
			
		||||
        border-radius: 2px;
 | 
			
		||||
        background-color: rgba(0, 0, 0, 0.05);
 | 
			
		||||
 | 
			
		||||
        &:hover {
 | 
			
		||||
          border: 1px solid rgba(0, 0, 0, 0.3);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -17,4 +17,12 @@
 | 
			
		||||
    font-family: Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 8rem;
 | 
			
		||||
    font-weight: bolder;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.zoomin {
 | 
			
		||||
    cursor: zoom-in;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.zoomout {
 | 
			
		||||
    cursor: zoom-out;
 | 
			
		||||
}
 | 
			
		||||
@ -7,16 +7,25 @@
 | 
			
		||||
  src: url('/fonts/nunito-v26-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
  palleton color scheme 
 | 
			
		||||
  https://paletton.com/#uid=54W0u0kv5npmjustvtxAGj4KwdK
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
:root {
 | 
			
		||||
 | 
			
		||||
  /* mux player styling */
 | 
			
		||||
  --media-accent-color: #fb00ff;
 | 
			
		||||
 | 
			
		||||
  /* this brightens message headers (funding goal) which by default were too close to the bg color */
 | 
			
		||||
  --bulma-dark-l: 22%;
 | 
			
		||||
 | 
			
		||||
  /* Colors and Lightness values */
 | 
			
		||||
  --bulma-scheme-h: 221;
 | 
			
		||||
  --bulma-scheme-s: 14%;
 | 
			
		||||
  --bulma-light-l: 90%;
 | 
			
		||||
  --bulma-light-invert-l: 20%;
 | 
			
		||||
  --bulma-dark-l: 10%;
 | 
			
		||||
  --bulma-dark-invert-l: 0%;
 | 
			
		||||
  --bulma-dark-invert-l: 90%;
 | 
			
		||||
  --bulma-soft-l: 90%;
 | 
			
		||||
  --bulma-bold-l: 20%;
 | 
			
		||||
  --bulma-soft-invert-l: 20%;
 | 
			
		||||
@ -27,15 +36,15 @@
 | 
			
		||||
  --bulma-primary: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);
 | 
			
		||||
  --bulma-primary-base: hsla(var(--bulma-primary-h), var(--bulma-primary-s), var(--bulma-primary-l), 1);
 | 
			
		||||
  --bulma-primary-rgb: 0, 209, 178;
 | 
			
		||||
  --bulma-primary-h: 171deg;
 | 
			
		||||
  --bulma-primary-s: 100%;
 | 
			
		||||
  --bulma-primary-l: 41%;
 | 
			
		||||
  --bulma-primary-h: 299deg;
 | 
			
		||||
  --bulma-primary-s: 50%;
 | 
			
		||||
  --bulma-primary-l: 50%;
 | 
			
		||||
  --bulma-primary-00-l: 1%;
 | 
			
		||||
  --bulma-primary-05-l: 6%;
 | 
			
		||||
  --bulma-primary-10-l: 11%;
 | 
			
		||||
  --bulma-primary-15-l: 16%;
 | 
			
		||||
  --bulma-primary-20-l: 21%;
 | 
			
		||||
  /* etc. */
 | 
			
		||||
  --bulma-info-l: 50%;
 | 
			
		||||
 | 
			
		||||
  /* Typography */
 | 
			
		||||
  --bulma-family-primary: Nunito, Inter, SF Pro, Segoe UI, Roboto, Oxygen, Ubuntu, Helvetica Neue, Helvetica, Arial, sans-serif;
 | 
			
		||||
 | 
			
		||||
@ -15,63 +15,54 @@
 | 
			
		||||
    "@fortawesome/free-brands-svg-icons": "^6.5.1",
 | 
			
		||||
    "@fortawesome/free-solid-svg-icons": "^6.5.1",
 | 
			
		||||
    "@fortawesome/react-fontawesome": "^0.2.0",
 | 
			
		||||
    "@fullcalendar/core": "^6.1.10",
 | 
			
		||||
    "@fullcalendar/daygrid": "^6.1.10",
 | 
			
		||||
    "@fullcalendar/interaction": "^6.1.10",
 | 
			
		||||
    "@fullcalendar/multimonth": "^6.1.10",
 | 
			
		||||
    "@fullcalendar/react": "^6.1.10",
 | 
			
		||||
    "@hookform/error-message": "^2.0.1",
 | 
			
		||||
    "@hookform/resolvers": "^3.3.4",
 | 
			
		||||
    "@mux/blurhash": "^0.1.2",
 | 
			
		||||
    "@mux/mux-player": "^2.3.1",
 | 
			
		||||
    "@mux/mux-player-react": "^2.3.1",
 | 
			
		||||
    "@mux/mux-player": "^2.4.0",
 | 
			
		||||
    "@mux/mux-player-react": "^2.4.0",
 | 
			
		||||
    "@paralleldrive/cuid2": "^2.2.2",
 | 
			
		||||
    "@react-hookz/web": "^24.0.2",
 | 
			
		||||
    "@tanstack/react-table": "^8.11.7",
 | 
			
		||||
    "@types/lodash": "^4.14.202",
 | 
			
		||||
    "@types/qs": "^6.9.11",
 | 
			
		||||
    "@types/react": "^18.2.47",
 | 
			
		||||
    "@types/react-dom": "^18.2.18",
 | 
			
		||||
    "@uppy/aws-s3": "^3.6.0",
 | 
			
		||||
    "@uppy/aws-s3-multipart": "^3.3.0",
 | 
			
		||||
    "@uppy/core": "^3.8.0",
 | 
			
		||||
    "@uppy/dashboard": "^3.7.1",
 | 
			
		||||
    "@uppy/drag-drop": "^3.0.3",
 | 
			
		||||
    "@uppy/file-input": "^3.0.4",
 | 
			
		||||
    "@uppy/progress-bar": "^3.0.4",
 | 
			
		||||
    "@uppy/react": "^3.2.1",
 | 
			
		||||
    "@uppy/remote-sources": "^1.1.0",
 | 
			
		||||
    "bulma": "^0.9.4",
 | 
			
		||||
    "bulma-prefers-dark": "0.1.0-beta.1",
 | 
			
		||||
    "date-fns": "^2.0.0",
 | 
			
		||||
    "date-fns-tz": "^2.0.0",
 | 
			
		||||
    "@react-hookz/web": "^24.0.4",
 | 
			
		||||
    "@tanstack/react-table": "^8.15.0",
 | 
			
		||||
    "@types/lodash": "^4.17.0",
 | 
			
		||||
    "@types/qs": "^6.9.14",
 | 
			
		||||
    "@types/react": "^18.2.73",
 | 
			
		||||
    "@types/react-dom": "^18.2.22",
 | 
			
		||||
    "@uppy/aws-s3": "^3.6.2",
 | 
			
		||||
    "@uppy/aws-s3-multipart": "^3.11.0",
 | 
			
		||||
    "@uppy/core": "^3.10.0",
 | 
			
		||||
    "@uppy/dashboard": "^3.8.0",
 | 
			
		||||
    "@uppy/drag-drop": "^3.1.0",
 | 
			
		||||
    "@uppy/file-input": "^3.1.0",
 | 
			
		||||
    "@uppy/progress-bar": "^3.1.1",
 | 
			
		||||
    "@uppy/react": "^3.3.0",
 | 
			
		||||
    "@uppy/remote-sources": "^1.2.0",
 | 
			
		||||
    "bulma": "^1.0.0",
 | 
			
		||||
    "date-fns": "^2.30.0",
 | 
			
		||||
    "date-fns-tz": "^2.0.1",
 | 
			
		||||
    "dayjs": "^1.11.10",
 | 
			
		||||
    "feed": "^4.2.2",
 | 
			
		||||
    "gray-matter": "^4.0.3",
 | 
			
		||||
    "hls.js": "^1.5.1",
 | 
			
		||||
    "hls.js": "^1.5.7",
 | 
			
		||||
    "lodash": "^4.17.21",
 | 
			
		||||
    "lunarphase-js": "^2.0.1",
 | 
			
		||||
    "multiformats": "^13.0.1",
 | 
			
		||||
    "next": "^14.0.4",
 | 
			
		||||
    "lunarphase-js": "^2.0.3",
 | 
			
		||||
    "multiformats": "^13.1.0",
 | 
			
		||||
    "next": "14.0.4",
 | 
			
		||||
    "next-goatcounter": "^1.0.5",
 | 
			
		||||
    "nextjs-toploader": "^1.6.4",
 | 
			
		||||
    "plyr": "^3.7.8",
 | 
			
		||||
    "plyr-react": "^5.3.0",
 | 
			
		||||
    "nextjs-toploader": "^1.6.11",
 | 
			
		||||
    "prism-react-renderer": "^2.3.1",
 | 
			
		||||
    "qs": "^6.11.2",
 | 
			
		||||
    "qs": "^6.12.0",
 | 
			
		||||
    "react": "^18.2.0",
 | 
			
		||||
    "react-dom": "^18.2.0",
 | 
			
		||||
    "react-hook-form": "^7.49.3",
 | 
			
		||||
    "react-loading-skeleton": "^3.3.1",
 | 
			
		||||
    "react-hook-form": "^7.51.2",
 | 
			
		||||
    "react-loading-skeleton": "^3.4.0",
 | 
			
		||||
    "react-toastify": "^9.1.3",
 | 
			
		||||
    "sass": "^1.69.7",
 | 
			
		||||
    "sharp": "^0.33.2",
 | 
			
		||||
    "sharp": "^0.33.3",
 | 
			
		||||
    "slugify": "^1.6.6",
 | 
			
		||||
    "yup": "^1.3.3"
 | 
			
		||||
    "yup": "^1.4.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/node": "^20.11.0",
 | 
			
		||||
    "eslint": "^8.56.0",
 | 
			
		||||
    "@types/node": "^20.11.30",
 | 
			
		||||
    "eslint": "^8.57.0",
 | 
			
		||||
    "eslint-config-next": "14.0.4",
 | 
			
		||||
    "tsc": "^2.0.4",
 | 
			
		||||
    "typescript": "5.3.3"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										138
									
								
								packages/next/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										138
									
								
								packages/next/pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							@ -20,21 +20,6 @@ dependencies:
 | 
			
		||||
  '@fortawesome/react-fontawesome':
 | 
			
		||||
    specifier: ^0.2.0
 | 
			
		||||
    version: 0.2.0(@fortawesome/fontawesome-svg-core@6.5.1)(react@18.2.0)
 | 
			
		||||
  '@fullcalendar/core':
 | 
			
		||||
    specifier: ^6.1.11
 | 
			
		||||
    version: 6.1.11
 | 
			
		||||
  '@fullcalendar/daygrid':
 | 
			
		||||
    specifier: ^6.1.11
 | 
			
		||||
    version: 6.1.11(@fullcalendar/core@6.1.11)
 | 
			
		||||
  '@fullcalendar/interaction':
 | 
			
		||||
    specifier: ^6.1.11
 | 
			
		||||
    version: 6.1.11(@fullcalendar/core@6.1.11)
 | 
			
		||||
  '@fullcalendar/multimonth':
 | 
			
		||||
    specifier: ^6.1.11
 | 
			
		||||
    version: 6.1.11(@fullcalendar/core@6.1.11)
 | 
			
		||||
  '@fullcalendar/react':
 | 
			
		||||
    specifier: ^6.1.11
 | 
			
		||||
    version: 6.1.11(@fullcalendar/core@6.1.11)(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
  '@hookform/error-message':
 | 
			
		||||
    specifier: ^2.0.1
 | 
			
		||||
    version: 2.0.1(react-dom@18.2.0)(react-hook-form@7.51.2)(react@18.2.0)
 | 
			
		||||
@ -130,19 +115,13 @@ dependencies:
 | 
			
		||||
    version: 13.1.0
 | 
			
		||||
  next:
 | 
			
		||||
    specifier: 14.0.4
 | 
			
		||||
    version: 14.0.4(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0)
 | 
			
		||||
    version: 14.0.4(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
  next-goatcounter:
 | 
			
		||||
    specifier: ^1.0.5
 | 
			
		||||
    version: 1.0.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
  nextjs-toploader:
 | 
			
		||||
    specifier: ^1.6.11
 | 
			
		||||
    version: 1.6.11(next@14.0.4)(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
  plyr:
 | 
			
		||||
    specifier: ^3.7.8
 | 
			
		||||
    version: 3.7.8
 | 
			
		||||
  plyr-react:
 | 
			
		||||
    specifier: ^5.3.0
 | 
			
		||||
    version: 5.3.0(plyr@3.7.8)(react@18.2.0)
 | 
			
		||||
  prism-react-renderer:
 | 
			
		||||
    specifier: ^2.3.1
 | 
			
		||||
    version: 2.3.1(react@18.2.0)
 | 
			
		||||
@ -164,9 +143,6 @@ dependencies:
 | 
			
		||||
  react-toastify:
 | 
			
		||||
    specifier: ^9.1.3
 | 
			
		||||
    version: 9.1.3(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
  sass:
 | 
			
		||||
    specifier: ^1.72.0
 | 
			
		||||
    version: 1.72.0
 | 
			
		||||
  sharp:
 | 
			
		||||
    specifier: ^0.33.3
 | 
			
		||||
    version: 0.33.3
 | 
			
		||||
@ -299,49 +275,6 @@ packages:
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@fullcalendar/core@6.1.11:
 | 
			
		||||
    resolution: {integrity: sha512-TjG7c8sUz+Vkui2FyCNJ+xqyu0nq653Ibe99A66LoW95oBo6tVhhKIaG1Wh0GVKymYiqAQN/OEdYTuj4ay27kA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      preact: 10.12.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@fullcalendar/daygrid@6.1.11(@fullcalendar/core@6.1.11):
 | 
			
		||||
    resolution: {integrity: sha512-hF5jJB7cgUIxWD5MVjj8IU407HISyLu7BWXcEIuTytkfr8oolOXeCazqnnjmRbnFOncoJQVstTtq6SIhaT32Xg==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@fullcalendar/core': ~6.1.11
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@fullcalendar/core': 6.1.11
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@fullcalendar/interaction@6.1.11(@fullcalendar/core@6.1.11):
 | 
			
		||||
    resolution: {integrity: sha512-ynOKjzuPwEAMgTQ6R/Z2zvzIIqG4p8/Qmnhi1q0vzPZZxSIYx3rlZuvpEK2WGBZZ1XEafDOP/LGfbWoNZe+qdg==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@fullcalendar/core': ~6.1.11
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@fullcalendar/core': 6.1.11
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@fullcalendar/multimonth@6.1.11(@fullcalendar/core@6.1.11):
 | 
			
		||||
    resolution: {integrity: sha512-7DbPC+AAlaKnquGVdw1Z85Q3nSZ4GZ1NcVIk4k7bLnqDlntwHPPsrDlSIzUWKcN0q5/u7jQHm4PU1m3LAl70Sg==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@fullcalendar/core': ~6.1.11
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@fullcalendar/core': 6.1.11
 | 
			
		||||
      '@fullcalendar/daygrid': 6.1.11(@fullcalendar/core@6.1.11)
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@fullcalendar/react@6.1.11(@fullcalendar/core@6.1.11)(react-dom@18.2.0)(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-Og0Tv0OiglTFp+b++yRyEhAeWnAmKkMLQ3iS0eJE1KDEov6QqGkoO+dUG4x8zp2w55IJqzik/a9iHi0s3oQDbA==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      '@fullcalendar/core': ~6.1.11
 | 
			
		||||
      react: ^16.7.0 || ^17 || ^18
 | 
			
		||||
      react-dom: ^16.7.0 || ^17 || ^18
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@fullcalendar/core': 6.1.11
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
      react-dom: 18.2.0(react@18.2.0)
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /@hookform/error-message@2.0.1(react-dom@18.2.0)(react-hook-form@7.51.2)(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
@ -1579,11 +1512,6 @@ packages:
 | 
			
		||||
    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /core-js@3.36.1:
 | 
			
		||||
    resolution: {integrity: sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==}
 | 
			
		||||
    requiresBuild: true
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /cross-spawn@7.0.3:
 | 
			
		||||
    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
 | 
			
		||||
    engines: {node: '>= 8'}
 | 
			
		||||
@ -1597,10 +1525,6 @@ packages:
 | 
			
		||||
    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /custom-event-polyfill@1.0.7:
 | 
			
		||||
    resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /custom-media-element@1.2.3:
 | 
			
		||||
    resolution: {integrity: sha512-xr9Hbrslkjm1fapJP5hL98pySeZmNepBSefQS/XTxynamqPTfRBK5MnhReMOiAj8xvJApVPrVnlYxIrknay8jg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
@ -2781,10 +2705,6 @@ packages:
 | 
			
		||||
      type-check: 0.4.0
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /loadjs@4.2.0:
 | 
			
		||||
    resolution: {integrity: sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /locate-path@6.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
 | 
			
		||||
    engines: {node: '>=10'}
 | 
			
		||||
@ -2919,12 +2839,12 @@ packages:
 | 
			
		||||
      react: '>18.0.0'
 | 
			
		||||
      react-dom: '>18.0.0'
 | 
			
		||||
    dependencies:
 | 
			
		||||
      next: 14.0.4(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0)
 | 
			
		||||
      next: 14.0.4(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
      react-dom: 18.2.0(react@18.2.0)
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /next@14.0.4(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0):
 | 
			
		||||
  /next@14.0.4(react-dom@18.2.0)(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==}
 | 
			
		||||
    engines: {node: '>=18.17.0'}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
@ -2947,7 +2867,6 @@ packages:
 | 
			
		||||
      postcss: 8.4.31
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
      react-dom: 18.2.0(react@18.2.0)
 | 
			
		||||
      sass: 1.72.0
 | 
			
		||||
      styled-jsx: 5.1.1(react@18.2.0)
 | 
			
		||||
      watchpack: 2.4.0
 | 
			
		||||
    optionalDependencies:
 | 
			
		||||
@ -2973,7 +2892,7 @@ packages:
 | 
			
		||||
      react-dom: '>= 16.0.0'
 | 
			
		||||
    dependencies:
 | 
			
		||||
      '@types/nprogress': 0.2.3
 | 
			
		||||
      next: 14.0.4(react-dom@18.2.0)(react@18.2.0)(sass@1.72.0)
 | 
			
		||||
      next: 14.0.4(react-dom@18.2.0)(react@18.2.0)
 | 
			
		||||
      nprogress: 0.2.0
 | 
			
		||||
      prop-types: 15.8.1
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
@ -3160,31 +3079,6 @@ packages:
 | 
			
		||||
    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
 | 
			
		||||
    engines: {node: '>=8.6'}
 | 
			
		||||
 | 
			
		||||
  /plyr-react@5.3.0(plyr@3.7.8)(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-m36/HrpHwg1N2rq3E31E8/kpAH55vk6qHUg17MG4uu9jbWYxnkN39lLmZQwxW7/qpDPfW5aGUJ6R3u23V0R3zA==}
 | 
			
		||||
    engines: {node: '>=16'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      plyr: ^3.7.7
 | 
			
		||||
      react: '>=16.8'
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      react:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      plyr: 3.7.8
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
      react-aptor: 2.0.0(react@18.2.0)
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /plyr@3.7.8:
 | 
			
		||||
    resolution: {integrity: sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA==}
 | 
			
		||||
    dependencies:
 | 
			
		||||
      core-js: 3.36.1
 | 
			
		||||
      custom-event-polyfill: 1.0.7
 | 
			
		||||
      loadjs: 4.2.0
 | 
			
		||||
      rangetouch: 2.0.1
 | 
			
		||||
      url-polyfill: 1.1.12
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /possible-typed-array-names@1.0.0:
 | 
			
		||||
    resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
 | 
			
		||||
    engines: {node: '>= 0.4'}
 | 
			
		||||
@ -3199,10 +3093,6 @@ packages:
 | 
			
		||||
      source-map-js: 1.2.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /preact@10.12.1:
 | 
			
		||||
    resolution: {integrity: sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /preact@10.20.1:
 | 
			
		||||
    resolution: {integrity: sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
@ -3275,10 +3165,6 @@ packages:
 | 
			
		||||
    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /rangetouch@2.0.1:
 | 
			
		||||
    resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /rc@1.2.8:
 | 
			
		||||
    resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
 | 
			
		||||
    hasBin: true
 | 
			
		||||
@ -3289,18 +3175,6 @@ packages:
 | 
			
		||||
      strip-json-comments: 2.0.1
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /react-aptor@2.0.0(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-YnCayokuhAwmBBP4Oc0bbT2l6ApfsjbY3DEEVUddIKZEBlGl1npzjHHzWnSqWuboSbMZvRqUM01Io9yiIp1wcg==}
 | 
			
		||||
    engines: {node: '>=12.7.0'}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
      react: '>=16.8'
 | 
			
		||||
    peerDependenciesMeta:
 | 
			
		||||
      react:
 | 
			
		||||
        optional: true
 | 
			
		||||
    dependencies:
 | 
			
		||||
      react: 18.2.0
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /react-dom@18.2.0(react@18.2.0):
 | 
			
		||||
    resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
 | 
			
		||||
    peerDependencies:
 | 
			
		||||
@ -3902,10 +3776,6 @@ packages:
 | 
			
		||||
      punycode: 2.3.1
 | 
			
		||||
    dev: true
 | 
			
		||||
 | 
			
		||||
  /url-polyfill@1.1.12:
 | 
			
		||||
    resolution: {integrity: sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
  /util-deprecate@1.0.2:
 | 
			
		||||
    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
 | 
			
		||||
    dev: false
 | 
			
		||||
 | 
			
		||||
@ -1,8 +0,0 @@
 | 
			
		||||
.tmp/
 | 
			
		||||
.cache/
 | 
			
		||||
.git/
 | 
			
		||||
build/
 | 
			
		||||
node_modules/
 | 
			
		||||
.env
 | 
			
		||||
data/
 | 
			
		||||
backup/
 | 
			
		||||
							
								
								
									
										1
									
								
								packages/strapi/.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								packages/strapi/.npmrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
shamefully-hoist=true
 | 
			
		||||
@ -1,19 +1,28 @@
 | 
			
		||||
FROM node:18.16-alpine
 | 
			
		||||
# Installing libvips-dev for sharp Compatibility
 | 
			
		||||
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev
 | 
			
		||||
ARG NODE_ENV=development
 | 
			
		||||
ENV NODE_ENV=${NODE_ENV}
 | 
			
		||||
# Creating multi-stage build for production
 | 
			
		||||
FROM node:18-alpine as build
 | 
			
		||||
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev vips-dev git > /dev/null 2>&1
 | 
			
		||||
ENV NODE_ENV=production
 | 
			
		||||
 | 
			
		||||
WORKDIR /opt/
 | 
			
		||||
COPY package.json yarn.lock ./
 | 
			
		||||
RUN yarn config set network-timeout 600000 -g && yarn install
 | 
			
		||||
 | 
			
		||||
RUN yarn global add node-gyp
 | 
			
		||||
RUN yarn config set network-timeout 600000 -g && yarn install --production
 | 
			
		||||
ENV PATH /opt/node_modules/.bin:$PATH
 | 
			
		||||
WORKDIR /opt/app
 | 
			
		||||
COPY . .
 | 
			
		||||
RUN yarn build
 | 
			
		||||
 | 
			
		||||
# Creating final production image
 | 
			
		||||
FROM node:18-alpine
 | 
			
		||||
RUN apk add --no-cache vips-dev
 | 
			
		||||
ENV NODE_ENV=production
 | 
			
		||||
WORKDIR /opt/
 | 
			
		||||
COPY --from=build /opt/node_modules ./node_modules
 | 
			
		||||
WORKDIR /opt/app
 | 
			
		||||
COPY --from=build /opt/app ./
 | 
			
		||||
ENV PATH /opt/node_modules/.bin:$PATH
 | 
			
		||||
 | 
			
		||||
RUN chown -R node:node /opt/app
 | 
			
		||||
USER node
 | 
			
		||||
RUN ["yarn", "build"]
 | 
			
		||||
EXPOSE 1337
 | 
			
		||||
# CMD ["yarn", "develop"]
 | 
			
		||||
CMD yarn develop
 | 
			
		||||
CMD ["yarn", "start"]
 | 
			
		||||
							
								
								
									
										26
									
								
								packages/strapi/Dockerfile.old
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								packages/strapi/Dockerfile.old
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
			
		||||
FROM node:18.16-alpine as base
 | 
			
		||||
RUN corepack enable
 | 
			
		||||
# Installing libvips-dev for sharp Compatibility
 | 
			
		||||
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev
 | 
			
		||||
ARG NODE_ENV=development
 | 
			
		||||
ENV NODE_ENV=${NODE_ENV}
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FROM base AS build
 | 
			
		||||
COPY package.json pnpm-lock.yaml ./
 | 
			
		||||
# RUN yarn config set network-timeout 600000 -g && yarn install
 | 
			
		||||
RUN pnpm install --frozen-lockfile
 | 
			
		||||
COPY . .
 | 
			
		||||
ENV PATH=/app/node_modules/.bin:$PATH
 | 
			
		||||
RUN chown -R node:node /app
 | 
			
		||||
USER node
 | 
			
		||||
RUN pnpm run build
 | 
			
		||||
EXPOSE 1337
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FROM build AS dev
 | 
			
		||||
CMD ["pnpm", "run", "dev"]
 | 
			
		||||
 | 
			
		||||
FROM build AS release
 | 
			
		||||
ENTRYPOINT ["pnpm", "run", "start"]
 | 
			
		||||
							
								
								
									
										31
									
								
								packages/strapi/Dockerfile.old1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								packages/strapi/Dockerfile.old1
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
# Creating multi-stage build for production
 | 
			
		||||
FROM node:18-alpine as build
 | 
			
		||||
ENV PNPM_HOME="/pnpm"
 | 
			
		||||
ENV PATH="$PNPM_HOME:$PATH"
 | 
			
		||||
RUN corepack enable
 | 
			
		||||
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev vips-dev git > /dev/null 2>&1
 | 
			
		||||
ENV NODE_ENV=production
 | 
			
		||||
WORKDIR /opt/
 | 
			
		||||
COPY package.json pnpm-lock.yaml ./
 | 
			
		||||
RUN pnpm install --prod
 | 
			
		||||
ENV PATH /opt/node_modules/.bin:$PATH
 | 
			
		||||
WORKDIR /opt/app
 | 
			
		||||
COPY . .
 | 
			
		||||
RUN pnpm run build
 | 
			
		||||
 | 
			
		||||
# Creating final production image
 | 
			
		||||
FROM node:18-alpine
 | 
			
		||||
ENV PNPM_HOME="/pnpm"
 | 
			
		||||
ENV PATH="$PNPM_HOME:$PATH"
 | 
			
		||||
RUN corepack enable
 | 
			
		||||
RUN apk add --no-cache vips-dev
 | 
			
		||||
ENV NODE_ENV=production
 | 
			
		||||
WORKDIR /opt/
 | 
			
		||||
COPY --from=build /opt/node_modules ./node_modules
 | 
			
		||||
WORKDIR /opt/app
 | 
			
		||||
COPY --from=build /opt/app ./
 | 
			
		||||
ENV PATH /opt/node_modules/.bin:$PATH
 | 
			
		||||
RUN chown -R node:node /opt/app
 | 
			
		||||
USER node
 | 
			
		||||
EXPOSE 1337
 | 
			
		||||
CMD ["pnpm", "start"]
 | 
			
		||||
							
								
								
									
										19
									
								
								packages/strapi/dev.dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								packages/strapi/dev.dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
FROM node:18-alpine
 | 
			
		||||
# Installing libvips-dev for sharp Compatibility
 | 
			
		||||
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev git
 | 
			
		||||
ARG NODE_ENV=development
 | 
			
		||||
ENV NODE_ENV=${NODE_ENV}
 | 
			
		||||
 | 
			
		||||
WORKDIR /opt/
 | 
			
		||||
COPY package.json yarn.lock ./
 | 
			
		||||
RUN yarn global add node-gyp
 | 
			
		||||
RUN yarn config set network-timeout 600000 -g && yarn install
 | 
			
		||||
ENV PATH /opt/node_modules/.bin:$PATH
 | 
			
		||||
 | 
			
		||||
WORKDIR /opt/app
 | 
			
		||||
COPY . .
 | 
			
		||||
RUN chown -R node:node /opt/app
 | 
			
		||||
USER node
 | 
			
		||||
RUN ["yarn", "build"]
 | 
			
		||||
EXPOSE 1337
 | 
			
		||||
CMD ["yarn", "dev"]
 | 
			
		||||
@ -4,15 +4,14 @@
 | 
			
		||||
  "version": "0.1.0",
 | 
			
		||||
  "description": "A Strapi application",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "yarn strapi develop",
 | 
			
		||||
    "dev:c": "concurrently \"npm:tunnel\" \"npm:dev:strapi\"",
 | 
			
		||||
    "tunnel": "ngrok start futureporn-strapi",
 | 
			
		||||
    "chisel": "bash ./chisel.sh",
 | 
			
		||||
    "db": "bash ./database/devDb.sh",
 | 
			
		||||
    "start": "strapi start",
 | 
			
		||||
    "build": "strapi build",
 | 
			
		||||
    "develop": "NODE_ENV=development strapi develop",
 | 
			
		||||
    "strapi": "strapi",
 | 
			
		||||
    "preinstall": "npx only-allow yarn"
 | 
			
		||||
    "strapi": "strapi"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@11ty/eleventy-fetch": "^4.0.0",
 | 
			
		||||
@ -85,6 +84,5 @@
 | 
			
		||||
    "node": ">=14.19.1 <=18.x.x",
 | 
			
		||||
    "npm": ">=6.0.0"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "packageManager": "yarn@1.22.19"
 | 
			
		||||
  "license": "MIT"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13135
									
								
								packages/strapi/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										13135
									
								
								packages/strapi/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,10 +1,9 @@
 | 
			
		||||
const { S3Client, DeleteObjectCommand } = require("@aws-sdk/client-s3");
 | 
			
		||||
require('dotenv').config()
 | 
			
		||||
 | 
			
		||||
if (!process.env.S3_USC_BUCKET_NAME) throw new Error('S3_USC_BUCKET_NAME must be defined in env');
 | 
			
		||||
if (!process.env.S3_USC_BUCKET_ENDPOINT) throw new Error('S3_USC_BUCKET_ENDPOINT must be defined in env');
 | 
			
		||||
if (!process.env.S3_USC_BUCKET_REGION) throw new Error('S3_USC_BUCKET_REGION must be defined in env');
 | 
			
		||||
if (!process.env.AWS_ACCESS_KEY_ID) throw new Error('AWS_ACCESS_KEY_ID must be defined in env');
 | 
			
		||||
if (!process.env.AWS_SECRET_ACCESS_KEY) throw new Error('AWS_SECRET_ACCESS_KEY must be defined in env');
 | 
			
		||||
 | 
			
		||||
// AWS.config.loadFromPath('./credentials-ehl.json');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
require('dotenv').config()
 | 
			
		||||
 | 
			
		||||
if (!process.env.CDN_BUCKET_USC_URL) throw new Error('CDN_BUCKET_USC_URL environment variable is required!');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3172
									
								
								packages/uppy/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										3172
									
								
								packages/uppy/pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7012
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7012
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
packages:
 | 
			
		||||
  - 'packages/next'
 | 
			
		||||
  - 'packages/uppy'
 | 
			
		||||
  - 'packages/bot'
 | 
			
		||||
  - 'packages/next'
 | 
			
		||||
  
 | 
			
		||||
# strapi is not on here because it's not compatible with pnpm
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user