Compare commits
No commits in common. "main" and "issue-45-rbac-integration-tests" have entirely different histories.
main
...
issue-45-r
14261 changed files with 352917 additions and 1107849 deletions
BIN
.DS_Store
vendored
BIN
.DS_Store
vendored
Binary file not shown.
BIN
._.DS_Store
BIN
._.DS_Store
Binary file not shown.
2
.env
2
.env
|
|
@ -1,2 +0,0 @@
|
|||
JWT_SECRET=helpyourneighbour-secret-key-for-jwt
|
||||
PORT=3000
|
||||
22
ISSUE-007.md
22
ISSUE-007.md
|
|
@ -1,22 +0,0 @@
|
|||
# Docker-Installation und Playwright-Konfiguration reparieren
|
||||
|
||||
## Beschreibung
|
||||
Die Testumgebung des HelpYourNeighbour Projekts ist nicht vollständig funktionsfähig. Es gibt zwei Hauptprobleme:
|
||||
|
||||
1. **Docker nicht installiert**: Der `docker` Befehl ist nicht verfügbar, was die Ausführung der Integrationstests verhindert.
|
||||
2. **Playwright-Konfiguration fehlerhaft**: Integrationstests schlagen aufgrund eines Fehlers mit der `libatk-1.0.so.0` Bibliothek fehl.
|
||||
|
||||
## Aufgaben
|
||||
- [x] Prüfen, ob Docker auf dem System installiert ist
|
||||
- [x] Falls nicht, Installation vorbereiten
|
||||
- [x] Playwright-Konfiguration reparieren
|
||||
- [x] Fehler mit `libatk-1.0.so.0` beheben
|
||||
- [x] Lokale Tests erfolgreich durchführen
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- Docker ist installiert und funktioniert
|
||||
- Playwright-Tests können ausgeführt werden
|
||||
- Alle Tests bestehen
|
||||
|
||||
## Ergebnis
|
||||
Die Tests konnten erfolgreich ausgeführt werden. Das Projekt ist nun bereit für weitere Entwicklungsarbeiten.
|
||||
16
ISSUE-008.md
16
ISSUE-008.md
|
|
@ -1,16 +0,0 @@
|
|||
# Issue: Docker-Installation für Testumgebung
|
||||
|
||||
## Beschreibung
|
||||
Die Testumgebung des HelpYourNeighbour Projekts ist nicht vollständig funktionsfähig. Es fehlt die lokale Docker-Installation, welche für die Integrationstests benötigt wird.
|
||||
|
||||
## Aufgaben
|
||||
- [ ] Prüfen, ob Docker auf dem System installiert ist
|
||||
- [ ] Falls nicht, Installation vorbereiten
|
||||
- [ ] Playwright-Konfiguration reparieren
|
||||
- [ ] Fehler mit `libatk-1.0.so.0` beheben
|
||||
- [ ] Lokale Tests erfolgreich durchführen
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- Docker ist installiert und funktioniert
|
||||
- Playwright-Tests können ausgeführt werden
|
||||
- Alle Tests bestehen
|
||||
19
ISSUE-10.md
19
ISSUE-10.md
|
|
@ -1,19 +0,0 @@
|
|||
# Issue: Implement Role-Based Access Control (RBAC) for Dispute Endpoints
|
||||
|
||||
## Description
|
||||
Implement role-based access control for dispute-related endpoints to ensure that only authorized users (moderators and admins) can perform actions like changing dispute status or making final decisions.
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] Middleware `requireRole` is properly implemented and tested
|
||||
- [x] Dispute endpoints are secured with appropriate role checks
|
||||
- [x] Integration tests verify role-based access control
|
||||
- [x] Documentation of RBAC for dispute system is updated
|
||||
|
||||
## Related Files
|
||||
- `backend/src/middleware/requireRole.js`
|
||||
- `backend/src/controllers/dispute.controller.js`
|
||||
- `backend/src/routes/disputes.routes.js`
|
||||
- `backend/test/roles.test.js`
|
||||
|
||||
## Notes
|
||||
This task builds upon the existing roles and permissions documentation to enforce access control at the API level.
|
||||
25
ISSUE-11.md
25
ISSUE-11.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #11: Implement Data Validation
|
||||
|
||||
### Description
|
||||
|
||||
Implement comprehensive data validation for all API inputs to ensure data integrity and prevent security vulnerabilities.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create validation middleware
|
||||
- [ ] Define validation rules for all endpoints
|
||||
- [ ] Add error handling for validation failures
|
||||
- [ ] Integrate validation with existing routes
|
||||
- [ ] Document validation rules
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install and configure Joi or express-validator
|
||||
- [ ] Create validation middleware
|
||||
- [ ] Define validation schemas for API endpoints
|
||||
- [ ] Apply validation to all routes
|
||||
- [ ] Add comprehensive error messages for validation failures
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for robust data validation to ensure data integrity and prevent security vulnerabilities. The implementation will use a validation library to define rules for all API inputs, with proper error handling and clear error messages for validation failures.
|
||||
24
ISSUE-12.md
24
ISSUE-12.md
|
|
@ -1,18 +1,14 @@
|
|||
# Issue #12: Implement Role-Based Access Control (RBAC) for Dispute Endpoints
|
||||
## Beschreibung
|
||||
|
||||
## Description
|
||||
Implement role-based access control for dispute-related endpoints to ensure that only users with the appropriate roles (`user`, `moderator`, or `admin`) can access specific dispute functionalities.
|
||||
Implementiere die Middleware zur Rollenprüfung für die API-Endpunkte.
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] Middleware `requireRole` is implemented and tested
|
||||
- [x] Dispute endpoints are secured with appropriate role requirements
|
||||
- [x] Integration tests verify role-based access control
|
||||
- [x] Documentation of roles and permissions is updated
|
||||
## Aufwandsschätzung
|
||||
|
||||
## Related Files
|
||||
- `backend/src/middleware/requireRole.js`
|
||||
- `backend/src/middleware/requireRole.test.js`
|
||||
- `backend/src/dispute-flow/`
|
||||
Ca. 2 Stunden
|
||||
|
||||
## Notes
|
||||
This issue builds upon the existing roles and permissions documentation to ensure that dispute-related endpoints are properly secured.
|
||||
## Akzeptanzkriterien
|
||||
|
||||
- Die `requireRole`-Middleware ist implementiert und in allen benötigten Endpunkten eingebunden
|
||||
- Unit-Tests für die Middleware existieren
|
||||
- Die Middleware funktioniert korrekt mit verschiedenen Rollen
|
||||
- Fehlermeldungen bei fehlender Berechtigung sind klar und verständlich
|
||||
26
ISSUE-123.md
26
ISSUE-123.md
|
|
@ -1,18 +1,18 @@
|
|||
# Issue: Implement Role-Based Access Control (RBAC) for Dispute Endpoints
|
||||
# Issue #123: Implement Role-Based Access Control (RBAC) for API Endpoints
|
||||
|
||||
## Description
|
||||
Implement role-based access control for dispute-related endpoints to ensure that only users with the correct roles (`user`, `moderator`, or `admin`) can access specific dispute functionalities.
|
||||
|
||||
Implement role-based access control (RBAC) for the API endpoints to ensure that users can only access resources and perform actions according to their assigned roles (`user`, `moderator`, `admin`).
|
||||
|
||||
This task involves:
|
||||
1. Creating middleware to check user roles
|
||||
2. Applying role checks to existing API endpoints
|
||||
3. Ensuring audit logging for sensitive operations
|
||||
|
||||
## Acceptance Criteria
|
||||
- [x] Middleware `requireRole` is implemented and tested
|
||||
- [x] Dispute endpoints are secured with appropriate role requirements
|
||||
- [x] Integration tests verify role-based access control
|
||||
- [x] Documentation of roles and permissions is updated
|
||||
|
||||
## Related Files
|
||||
- `backend/src/middleware/requireRole.js`
|
||||
- `backend/src/middleware/requireRole.test.js`
|
||||
- `backend/src/dispute-flow/`
|
||||
|
||||
## Notes
|
||||
This task builds upon the existing roles-and-permissions.md documentation to implement secure access control for dispute-related functionalities.
|
||||
- [ ] JWT tokens include a `role` claim
|
||||
- [ ] Middleware `requireRole([...])` is implemented and functional
|
||||
- [ ] All existing API endpoints are updated with appropriate role requirements
|
||||
- [ ] Audit events are logged for sensitive actions
|
||||
- [ ] Documentation of the RBAC implementation is updated
|
||||
26
ISSUE-13.md
26
ISSUE-13.md
|
|
@ -1,26 +0,0 @@
|
|||
## Issue #13: Implement Database Migration Strategy
|
||||
|
||||
### Description
|
||||
|
||||
Implement a database migration strategy to manage schema changes and data updates effectively.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Choose and configure migration tool
|
||||
- [ ] Create initial database schema
|
||||
- [ ] Implement migration scripts for schema changes
|
||||
- [ ] Add rollback capability for migrations
|
||||
- [ ] Document migration process
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install and configure Sequelize or TypeORM
|
||||
- [ ] Create initial database models
|
||||
- [ ] Set up migration directory structure
|
||||
- [ ] Create first migration script
|
||||
- [ ] Implement rollback functionality
|
||||
- [ ] Document migration workflow
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for a structured approach to database schema changes. The implementation will use a migration tool to manage database schema updates, ensuring that changes can be applied consistently across different environments and rolled back if necessary.
|
||||
25
ISSUE-14.md
25
ISSUE-14.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #14: Implement Caching Strategy
|
||||
|
||||
### Description
|
||||
|
||||
Implement a caching strategy to improve application performance and reduce database load.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Choose and configure caching solution
|
||||
- [ ] Implement cache for frequently accessed data
|
||||
- [ ] Add cache invalidation strategy
|
||||
- [ ] Monitor cache performance
|
||||
- [ ] Document caching implementation
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install and configure Redis or Memcached
|
||||
- [ ] Implement caching middleware
|
||||
- [ ] Cache API responses for static data
|
||||
- [ ] Add cache invalidation for updated data
|
||||
- [ ] Set up monitoring for cache performance
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need to improve application performance through caching. The implementation will use a caching solution like Redis to store frequently accessed data, reducing database load and improving response times. A cache invalidation strategy will be implemented to ensure data consistency.
|
||||
25
ISSUE-15.md
25
ISSUE-15.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #15: Implement Monitoring and Metrics
|
||||
|
||||
### Description
|
||||
|
||||
Implement monitoring and metrics collection to track application performance and health.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Set up application monitoring
|
||||
- [ ] Collect key performance metrics
|
||||
- [ ] Configure alerting for critical issues
|
||||
- [ ] Create dashboard for monitoring
|
||||
- [ ] Document monitoring setup
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install and configure Prometheus or similar monitoring tool
|
||||
- [ ] Add application metrics collection
|
||||
- [ ] Set up alerting rules
|
||||
- [ ] Create monitoring dashboard
|
||||
- [ ] Integrate with existing logging system
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for comprehensive application monitoring to track performance and health. The implementation will include setting up a monitoring tool to collect key metrics, configure alerts for critical issues, and create a dashboard for easy monitoring of the application's status.
|
||||
25
ISSUE-16.md
25
ISSUE-16.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #16: Implement CI/CD Pipeline
|
||||
|
||||
### Description
|
||||
|
||||
Set up a continuous integration and continuous deployment pipeline for the helpyourneighbour project.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Configure CI pipeline for automated testing
|
||||
- [ ] Set up CD pipeline for automated deployment
|
||||
- [ ] Implement environment-specific configurations
|
||||
- [ ] Add deployment monitoring
|
||||
- [ ] Document CI/CD process
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Create GitHub Actions workflow files
|
||||
- [ ] Configure automated testing on push
|
||||
- [ ] Set up automated deployment to staging
|
||||
- [ ] Implement production deployment process
|
||||
- [ ] Add environment variables management
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for automated CI/CD to streamline development and deployment processes. The implementation will include setting up GitHub Actions workflows for automated testing, staging deployments, and production deployments, with proper environment configuration management.
|
||||
25
ISSUE-17.md
25
ISSUE-17.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #17: Implement User Feedback System
|
||||
|
||||
### Description
|
||||
|
||||
Implement a user feedback system to collect and manage user suggestions and bug reports.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create feedback submission endpoint
|
||||
- [ ] Implement feedback storage mechanism
|
||||
- [ ] Add admin interface for reviewing feedback
|
||||
- [ ] Enable automated response to users
|
||||
- [ ] Document feedback process
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Create `src/routes/feedback.js`
|
||||
- [ ] Implement MongoDB or PostgreSQL schema for feedback
|
||||
- [ ] Add feedback submission form
|
||||
- [ ] Create admin dashboard for feedback management
|
||||
- [ ] Set up automated email responses
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need to collect user feedback to improve the application. The implementation will include a feedback submission endpoint, storage mechanism, and an admin interface for reviewing and managing feedback. Automated responses will be sent to users to acknowledge their submissions.
|
||||
25
ISSUE-18.md
25
ISSUE-18.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #18: Implement Performance Optimization
|
||||
|
||||
### Description
|
||||
|
||||
Implement performance optimizations to improve application response times and resource usage.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [x] Analyze current performance bottlenecks
|
||||
- [x] Optimize database queries
|
||||
- [x] Implement lazy loading for resources
|
||||
- [x] Add performance monitoring
|
||||
- [x] Document optimization results
|
||||
|
||||
### Tasks
|
||||
|
||||
- [x] Run performance profiling tools
|
||||
- [x] Optimize slow database queries
|
||||
- [x] Implement pagination for large datasets
|
||||
- [x] Add lazy loading for images and assets
|
||||
- [x] Set up performance monitoring
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need to improve application performance. The implementation will include profiling to identify bottlenecks, optimizing database queries, implementing lazy loading for resources, and setting up performance monitoring to track improvements.
|
||||
25
ISSUE-19.md
25
ISSUE-19.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #19: Implement Internationalization (i18n)
|
||||
|
||||
### Description
|
||||
|
||||
Implement internationalization support to make the helpyourneighbour application available in multiple languages.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Choose and configure i18n library
|
||||
- [ ] Add language selection functionality
|
||||
- [ ] Translate all user-facing text
|
||||
- [ ] Implement locale detection
|
||||
- [ ] Document i18n setup
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install and configure i18next or similar library
|
||||
- [ ] Create language files for supported languages
|
||||
- [ ] Add language switcher UI component
|
||||
- [ ] Implement automatic locale detection
|
||||
- [ ] Translate all application text
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need to make the application available in multiple languages. The implementation will include choosing an i18n library, creating language files, adding a language switcher UI, and implementing automatic locale detection to provide a localized experience for users.
|
||||
25
ISSUE-20.md
25
ISSUE-20.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #20: Implement Backup and Recovery Strategy
|
||||
|
||||
### Description
|
||||
|
||||
Implement a backup and recovery strategy to ensure data integrity and availability.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Define backup schedule and retention policy
|
||||
- [ ] Set up automated database backups
|
||||
- [ ] Implement file backup strategy
|
||||
- [ ] Test recovery procedures
|
||||
- [ ] Document backup process
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Configure automated database backup scripts
|
||||
- [ ] Set up file system backup procedures
|
||||
- [ ] Implement cloud storage for backups
|
||||
- [ ] Test backup and restore processes
|
||||
- [ ] Create monitoring for backup success
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for data protection through backups. The implementation will include defining backup schedules and retention policies, setting up automated database and file backups, implementing cloud storage for backups, testing recovery procedures, and creating monitoring to ensure backups are successful.
|
||||
25
ISSUE-21.md
25
ISSUE-21.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #21: Implement User Onboarding Process
|
||||
|
||||
### Description
|
||||
|
||||
Implement a user onboarding process to help new users understand and use the helpyourneighbour application effectively.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create onboarding flow for new users
|
||||
- [ ] Add interactive tutorials
|
||||
- [ ] Implement progress tracking
|
||||
- [ ] Provide helpful tips and guidance
|
||||
- [ ] Document onboarding process
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Design onboarding user flow
|
||||
- [ ] Create interactive tutorial components
|
||||
- [ ] Implement progress tracking mechanism
|
||||
- [ ] Add contextual help and tips
|
||||
- [ ] Test onboarding experience
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need to improve user experience through a structured onboarding process. The implementation will include designing an onboarding flow, creating interactive tutorials, implementing progress tracking, adding contextual help, and testing the overall onboarding experience to ensure new users can quickly become productive.
|
||||
24
ISSUE-4.md
24
ISSUE-4.md
|
|
@ -1,24 +0,0 @@
|
|||
## Issue #4: API Versioning Policy
|
||||
|
||||
### Description
|
||||
|
||||
Implement a clear API versioning policy for the helpyourneighbour project.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create a document outlining the API versioning strategy
|
||||
- [ ] Define version format and deprecation policy
|
||||
- [ ] Document version history
|
||||
- [ ] Apply versioning to existing API endpoints
|
||||
|
||||
### Tasks
|
||||
|
||||
- [x] Create `docs/api-versioning.md`
|
||||
- [x] Define version format as `vX.Y.Z`
|
||||
- [x] Implement deprecation policy with 6-month notice period
|
||||
- [x] Add version history table
|
||||
- [x] Apply versioning to existing API endpoints
|
||||
|
||||
### Notes
|
||||
|
||||
This issue was created based on the project's need for a clear API versioning strategy. The implementation includes documentation and application of the versioning policy to existing endpoints.
|
||||
25
ISSUE-5.md
25
ISSUE-5.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #5: Implement User Authentication
|
||||
|
||||
### Description
|
||||
|
||||
Implement a user authentication system for the helpyourneighbour project to secure API endpoints and manage user access.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create authentication middleware
|
||||
- [ ] Implement login endpoint
|
||||
- [ ] Implement registration endpoint
|
||||
- [ ] Add token-based authentication
|
||||
- [ ] Secure existing API endpoints with authentication
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Create `src/middleware/auth.js`
|
||||
- [ ] Implement login route in `src/routes/auth.js`
|
||||
- [ ] Implement registration route in `src/routes/auth.js`
|
||||
- [ ] Add JWT token generation and validation
|
||||
- [ ] Apply authentication to existing routes
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for user authentication to secure the application's API endpoints. The implementation will use JWT tokens for authentication and include both login and registration functionality.
|
||||
25
ISSUE-6.md
25
ISSUE-6.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #6: Implement User Profile Management
|
||||
|
||||
### Description
|
||||
|
||||
Implement user profile management functionality to allow users to update their personal information and preferences.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create user profile endpoint
|
||||
- [ ] Allow users to update personal details
|
||||
- [ ] Enable users to manage preferences
|
||||
- [ ] Secure profile endpoints with authentication
|
||||
- [ ] Add validation for profile data
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Create `src/routes/profile.js`
|
||||
- [ ] Implement GET /profile endpoint
|
||||
- [ ] Implement PUT /profile endpoint
|
||||
- [ ] Add data validation middleware
|
||||
- [ ] Apply authentication to profile routes
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for users to manage their personal information and preferences within the application. The implementation will include endpoints for retrieving and updating user profiles, with proper validation and authentication.
|
||||
25
ISSUE-7.md
25
ISSUE-7.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #7: Implement API Documentation
|
||||
|
||||
### Description
|
||||
|
||||
Create comprehensive API documentation for the helpyourneighbour project to improve developer experience and ease of use.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Generate OpenAPI/Swagger documentation
|
||||
- [ ] Document all API endpoints
|
||||
- [ ] Include example requests and responses
|
||||
- [ ] Make documentation accessible via web interface
|
||||
- [ ] Update documentation with each API change
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Integrate Swagger/OpenAPI tooling
|
||||
- [ ] Add JSDoc comments to API endpoints
|
||||
- [ ] Create documentation generation script
|
||||
- [ ] Deploy documentation to public endpoint
|
||||
- [ ] Add link to documentation in README
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for clear and accessible API documentation. The implementation will use OpenAPI/Swagger to automatically generate documentation from code comments, making it easier for developers to understand and use the API.
|
||||
26
ISSUE-8.md
26
ISSUE-8.md
|
|
@ -1,26 +0,0 @@
|
|||
## Issue #8: Implement Testing Framework
|
||||
|
||||
### Description
|
||||
|
||||
Set up a comprehensive testing framework for the helpyourneighbour project to ensure code quality and prevent regressions.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Choose and integrate testing library
|
||||
- [ ] Create test structure and directory layout
|
||||
- [ ] Write unit tests for core functionality
|
||||
- [ ] Implement integration tests
|
||||
- [ ] Set up continuous integration pipeline
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Install Jest or Mocha testing framework
|
||||
- [ ] Configure test environment
|
||||
- [ ] Create test directories and files
|
||||
- [ ] Write unit tests for authentication
|
||||
- [ ] Write integration tests for API endpoints
|
||||
- [ ] Set up CI pipeline with GitHub Actions
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for a robust testing framework to maintain code quality and prevent regressions. The implementation will include both unit and integration tests, with a CI pipeline to automatically run tests on code changes.
|
||||
25
ISSUE-9.md
25
ISSUE-9.md
|
|
@ -1,25 +0,0 @@
|
|||
## Issue #9: Implement Error Handling and Logging
|
||||
|
||||
### Description
|
||||
|
||||
Implement comprehensive error handling and logging mechanisms to improve application stability and debugging capabilities.
|
||||
|
||||
### Acceptance Criteria
|
||||
|
||||
- [ ] Create centralized error handling middleware
|
||||
- [ ] Implement structured logging
|
||||
- [ ] Add error reporting to monitoring system
|
||||
- [ ] Ensure all API endpoints handle errors gracefully
|
||||
- [ ] Log important application events
|
||||
|
||||
### Tasks
|
||||
|
||||
- [ ] Create `src/middleware/error-handler.js`
|
||||
- [ ] Implement Winston or Bunyan logging
|
||||
- [ ] Add error response format
|
||||
- [ ] Integrate logging with API endpoints
|
||||
- [ ] Set up log aggregation and monitoring
|
||||
|
||||
### Notes
|
||||
|
||||
This issue addresses the need for robust error handling and logging to improve application stability. The implementation will include centralized error handling middleware, structured logging, and integration with monitoring systems to track application health and debug issues effectively.
|
||||
|
|
@ -13,4 +13,4 @@ Brief description of the task to be done.
|
|||
- File 2
|
||||
|
||||
### Notes
|
||||
Additional context or information.
|
||||
Any additional context or notes.
|
||||
46
ISSUES.md
46
ISSUES.md
|
|
@ -1,46 +0,0 @@
|
|||
# Offene Issues
|
||||
|
||||
## #1: Backend Grundgerüst + Auth API
|
||||
|
||||
- Beschreibung: Erstelle das grundlegende Backend mit Express.js und implementiere die Auth-API (Register, Login).
|
||||
- Aufwandsschätzung: 2 Tage
|
||||
- Akzeptanzkriterien:
|
||||
- [x] Express.js Projektstruktur eingerichtet
|
||||
- [x] .env Konfiguration
|
||||
- [x] Auth API Endpunkte implementiert
|
||||
- [ ] Unit Tests für Auth API
|
||||
|
||||
## #2: Datenmodell für Request/Offer/Negotiation/Deal
|
||||
|
||||
- Beschreibung: Definiere das Datenmodell für Requests, Offers, Negotiations und Deals.
|
||||
- Aufwandsschätzung: 3 Tage
|
||||
- Akzeptanzkriterien:
|
||||
- [x] SQL Schema definiert
|
||||
- [ ] Unit Tests für Datenmodell
|
||||
- [ ] API Endpunkte für CRUD Operationen
|
||||
|
||||
## #3: Bewertungssystem 2-14 Tage Verzögerung
|
||||
|
||||
- Beschreibung: Implementiere das Bewertungssystem mit 2-14 Tage Verzögerung.
|
||||
- Aufwandsschätzung: 2 Tage
|
||||
- Akzeptanzkriterien:
|
||||
- [ ] Bewertungssystem implementiert
|
||||
- [ ] Unit Tests für Bewertungssystem
|
||||
|
||||
## #4: Adressänderung nur per Briefbestätigung
|
||||
|
||||
- Beschreibung: Implementiere den Flow für Adressänderungen mit Briefbestätigung.
|
||||
- Aufwandsschätzung: 2 Tage
|
||||
- Akzeptanzkriterien:
|
||||
- [ ] Briefcode-Generierung implementiert
|
||||
- [ ] Briefbestätigungs-Flow implementiert
|
||||
- [ ] Unit Tests für Adressänderung
|
||||
|
||||
## #5: Dispute-Flow Implementierung
|
||||
|
||||
- Beschreibung: Implementiere den Dispute-Flow gemäß der Dokumentation.
|
||||
- Aufwandsschätzung: 3 Tage
|
||||
- Akzeptanzkriterien:
|
||||
- [ ] Dispute-Endpunkte implementiert
|
||||
- [ ] Statusmaschine serverseitig durchgesetzt
|
||||
- [ ] Unit Tests für Dispute-Flow
|
||||
|
|
@ -1,12 +1,20 @@
|
|||
## Beschreibung
|
||||
|
||||
Beschreibe das Problem oder die Aufgabe im Detail.
|
||||
Implementiere eine neue API-Endpunkt für die Verwaltung von Benutzerrollen im System.
|
||||
|
||||
## Aufwandsschätzung
|
||||
## Anforderungen
|
||||
|
||||
Wie viel Zeit wird benötigt? (z.B. 2h, 1 Tag)
|
||||
- Erstelle einen neuen Endpunkt `/api/users/:userId/roles`
|
||||
- Unterstütze folgende Methoden:
|
||||
- `GET` - Liefert die Rollen eines Benutzers
|
||||
- `PUT` - Ändert die Rollen eines Benutzers
|
||||
- `DELETE` - Entfernt alle Rollen eines Benutzers
|
||||
- Implementiere eine Middleware zur Überprüfung der Berechtigungen (nur Admins dürfen Rollen ändern)
|
||||
- Füge Tests für den neuen Endpunkt hinzu
|
||||
|
||||
## Akzeptanzkriterien
|
||||
|
||||
- [ ] Kriterium 1
|
||||
- [ ] Kriterium 2
|
||||
- [ ] Endpunkt ist implementiert und dokumentiert
|
||||
- [ ] Berechtigungsprüfung funktioniert korrekt
|
||||
- [ ] Tests sind erfolgreich
|
||||
- [ ] Code wurde reviewed und merged
|
||||
40
TESTING.md
40
TESTING.md
|
|
@ -1,24 +1,32 @@
|
|||
# Testing
|
||||
# Testkonzept – helpyourneighbour
|
||||
|
||||
## Unit Tests
|
||||
Dieses Testkonzept ist **verpflichtend vor jedem Push**.
|
||||
|
||||
Unit tests are written using Jest and run with `npm run test:unit`.
|
||||
## Ziel
|
||||
Stabile, sichere Releases durch standardisierte Tests in Docker auf dem Unraid-Host.
|
||||
|
||||
## Contract Tests
|
||||
## Pflichtablauf (immer)
|
||||
1. **Lokaler Schnelltest**
|
||||
- `cd backend && npm ci && npm test`
|
||||
2. **Docker-Test auf Unraid**
|
||||
- Image bauen und Smoke-Test im Container ausführen.
|
||||
3. **Erst danach pushen**
|
||||
- Wenn ein Test fehlschlägt: kein Push, zuerst Fix.
|
||||
|
||||
Contract tests ensure that the API behaves as documented in `openapi.yaml`. They are run with `npm run test:contract`.
|
||||
## Docker-Standard (Unraid)
|
||||
Im Repo-Root ausführen:
|
||||
|
||||
## Integration Tests
|
||||
```bash
|
||||
./scripts/test-in-docker.sh
|
||||
```
|
||||
|
||||
Integration tests verify the complete flow of features. They are run with `npm run test:integration`.
|
||||
## Mindest-Testumfang
|
||||
- Syntax-Validierung aller Backend-JS-Dateien (`node --check`)
|
||||
- Smoke-Test-Exitcode 0
|
||||
|
||||
## Dispute Flow Tests
|
||||
## Erweiterung (nächster Schritt)
|
||||
- API-Integrationstests (Auth, Requests, Offers, Contacts)
|
||||
- DB-Container für reproduzierbare End-to-End-Tests
|
||||
|
||||
The dispute flow is tested in `test-dispute-flow.md` and includes:
|
||||
- Creating disputes
|
||||
- Adding evidence
|
||||
- Updating status
|
||||
- Resolving disputes
|
||||
- Retrieving dispute history
|
||||
|
||||
Tests are implemented using the existing backend infrastructure.
|
||||
## Verbindlichkeit
|
||||
Dieses Konzept gilt als Standardprozess für alle weiteren Änderungen in `helpyourneighbour`.
|
||||
|
|
|
|||
BIN
backend/.DS_Store
vendored
BIN
backend/.DS_Store
vendored
Binary file not shown.
Binary file not shown.
11
backend/.env
11
backend/.env
|
|
@ -1,11 +0,0 @@
|
|||
PORT=3000
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_USER=root
|
||||
DB_PASSWORD=
|
||||
DB_NAME=helpyourneighbour
|
||||
JWT_SECRET=fallback_secret_key_for_dev
|
||||
RATE_LIMIT_WINDOW_MS=900000
|
||||
RATE_LIMIT_MAX_REQUESTS=100
|
||||
RATE_LIMIT_AUTH_WINDOW_MS=300000
|
||||
RATE_LIMIT_AUTH_MAX_REQUESTS=5
|
||||
1
backend/node_modules/.bin/bcrypt
generated
vendored
1
backend/node_modules/.bin/bcrypt
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../bcryptjs/bin/bcrypt
|
||||
1
backend/node_modules/.bin/create-jest
generated
vendored
1
backend/node_modules/.bin/create-jest
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../create-jest/bin/create-jest.js
|
||||
1
backend/node_modules/.bin/node-gyp-build
generated
vendored
1
backend/node_modules/.bin/node-gyp-build
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../node-gyp-build/bin.js
|
||||
1
backend/node_modules/.bin/node-gyp-build-optional
generated
vendored
1
backend/node_modules/.bin/node-gyp-build-optional
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../node-gyp-build/optional.js
|
||||
1
backend/node_modules/.bin/node-gyp-build-test
generated
vendored
1
backend/node_modules/.bin/node-gyp-build-test
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../node-gyp-build/build-test.js
|
||||
1
backend/node_modules/.bin/playwright
generated
vendored
1
backend/node_modules/.bin/playwright
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../@playwright/test/cli.js
|
||||
1
backend/node_modules/.bin/playwright-core
generated
vendored
1
backend/node_modules/.bin/playwright-core
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../playwright-core/cli.js
|
||||
1
backend/node_modules/.bin/regjsparser
generated
vendored
1
backend/node_modules/.bin/regjsparser
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../regjsparser/bin/parser
|
||||
1
backend/node_modules/.bin/resolve
generated
vendored
1
backend/node_modules/.bin/resolve
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
../resolve/bin/resolve
|
||||
9217
backend/node_modules/.package-lock.json
generated
vendored
9217
backend/node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load diff
19
backend/node_modules/@babel/helper-annotate-as-pure/README.md
generated
vendored
19
backend/node_modules/@babel/helper-annotate-as-pure/README.md
generated
vendored
|
|
@ -1,19 +0,0 @@
|
|||
# @babel/helper-annotate-as-pure
|
||||
|
||||
> Helper function to annotate paths and nodes with #__PURE__ comment
|
||||
|
||||
See our website [@babel/helper-annotate-as-pure](https://babeljs.io/docs/babel-helper-annotate-as-pure) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save @babel/helper-annotate-as-pure
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/helper-annotate-as-pure
|
||||
```
|
||||
23
backend/node_modules/@babel/helper-annotate-as-pure/lib/index.js
generated
vendored
23
backend/node_modules/@babel/helper-annotate-as-pure/lib/index.js
generated
vendored
|
|
@ -1,23 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = annotateAsPure;
|
||||
var _t = require("@babel/types");
|
||||
const {
|
||||
addComment
|
||||
} = _t;
|
||||
const PURE_ANNOTATION = "#__PURE__";
|
||||
const isPureAnnotated = ({
|
||||
leadingComments
|
||||
}) => !!leadingComments && leadingComments.some(comment => /[@#]__PURE__/.test(comment.value));
|
||||
function annotateAsPure(pathOrNode) {
|
||||
const node = pathOrNode.node || pathOrNode;
|
||||
if (isPureAnnotated(node)) {
|
||||
return;
|
||||
}
|
||||
addComment(node, "leading", PURE_ANNOTATION);
|
||||
}
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
backend/node_modules/@babel/helper-annotate-as-pure/lib/index.js.map
generated
vendored
1
backend/node_modules/@babel/helper-annotate-as-pure/lib/index.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"names":["_t","require","addComment","PURE_ANNOTATION","isPureAnnotated","leadingComments","some","comment","test","value","annotateAsPure","pathOrNode","node"],"sources":["../src/index.ts"],"sourcesContent":["import { addComment, type Node } from \"@babel/types\";\n\nconst PURE_ANNOTATION = \"#__PURE__\";\n\nconst isPureAnnotated = ({ leadingComments }: Node): boolean =>\n !!leadingComments &&\n leadingComments.some(comment => /[@#]__PURE__/.test(comment.value));\n\nexport default function annotateAsPure(\n pathOrNode: Node | { node: Node },\n): void {\n const node =\n // @ts-expect-error Node will not have `node` property\n (pathOrNode.node || pathOrNode) as Node;\n if (isPureAnnotated(node)) {\n return;\n }\n addComment(node, \"leading\", PURE_ANNOTATION);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,EAAA,GAAAC,OAAA;AAAqD;EAA5CC;AAAU,IAAAF,EAAA;AAEnB,MAAMG,eAAe,GAAG,WAAW;AAEnC,MAAMC,eAAe,GAAGA,CAAC;EAAEC;AAAsB,CAAC,KAChD,CAAC,CAACA,eAAe,IACjBA,eAAe,CAACC,IAAI,CAACC,OAAO,IAAI,cAAc,CAACC,IAAI,CAACD,OAAO,CAACE,KAAK,CAAC,CAAC;AAEtD,SAASC,cAAcA,CACpCC,UAAiC,EAC3B;EACN,MAAMC,IAAI,GAEPD,UAAU,CAACC,IAAI,IAAID,UAAmB;EACzC,IAAIP,eAAe,CAACQ,IAAI,CAAC,EAAE;IACzB;EACF;EACAV,UAAU,CAACU,IAAI,EAAE,SAAS,EAAET,eAAe,CAAC;AAC9C","ignoreList":[]}
|
||||
27
backend/node_modules/@babel/helper-annotate-as-pure/package.json
generated
vendored
27
backend/node_modules/@babel/helper-annotate-as-pure/package.json
generated
vendored
|
|
@ -1,27 +0,0 @@
|
|||
{
|
||||
"name": "@babel/helper-annotate-as-pure",
|
||||
"version": "7.27.3",
|
||||
"description": "Helper function to annotate paths and nodes with #__PURE__ comment",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-helper-annotate-as-pure"
|
||||
},
|
||||
"homepage": "https://babel.dev/docs/en/next/babel-helper-annotate-as-pure",
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"main": "./lib/index.js",
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.27.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/traverse": "^7.27.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"author": "The Babel Team (https://babel.dev/team)",
|
||||
"type": "commonjs"
|
||||
}
|
||||
443
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/README.md
generated
vendored
443
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/README.md
generated
vendored
|
|
@ -1,443 +0,0 @@
|
|||
semver(1) -- The semantic versioner for npm
|
||||
===========================================
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install semver
|
||||
````
|
||||
|
||||
## Usage
|
||||
|
||||
As a node module:
|
||||
|
||||
```js
|
||||
const semver = require('semver')
|
||||
|
||||
semver.valid('1.2.3') // '1.2.3'
|
||||
semver.valid('a.b.c') // null
|
||||
semver.clean(' =v1.2.3 ') // '1.2.3'
|
||||
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
|
||||
semver.gt('1.2.3', '9.8.7') // false
|
||||
semver.lt('1.2.3', '9.8.7') // true
|
||||
semver.minVersion('>=1.0.0') // '1.0.0'
|
||||
semver.valid(semver.coerce('v2')) // '2.0.0'
|
||||
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
|
||||
```
|
||||
|
||||
As a command-line utility:
|
||||
|
||||
```
|
||||
$ semver -h
|
||||
|
||||
A JavaScript implementation of the https://semver.org/ specification
|
||||
Copyright Isaac Z. Schlueter
|
||||
|
||||
Usage: semver [options] <version> [<version> [...]]
|
||||
Prints valid versions sorted by SemVer precedence
|
||||
|
||||
Options:
|
||||
-r --range <range>
|
||||
Print versions that match the specified range.
|
||||
|
||||
-i --increment [<level>]
|
||||
Increment a version by the specified level. Level can
|
||||
be one of: major, minor, patch, premajor, preminor,
|
||||
prepatch, or prerelease. Default level is 'patch'.
|
||||
Only one version may be specified.
|
||||
|
||||
--preid <identifier>
|
||||
Identifier to be used to prefix premajor, preminor,
|
||||
prepatch or prerelease version increments.
|
||||
|
||||
-l --loose
|
||||
Interpret versions and ranges loosely
|
||||
|
||||
-p --include-prerelease
|
||||
Always include prerelease versions in range matching
|
||||
|
||||
-c --coerce
|
||||
Coerce a string into SemVer if possible
|
||||
(does not imply --loose)
|
||||
|
||||
--rtl
|
||||
Coerce version strings right to left
|
||||
|
||||
--ltr
|
||||
Coerce version strings left to right (default)
|
||||
|
||||
Program exits successfully if any valid version satisfies
|
||||
all supplied ranges, and prints all satisfying versions.
|
||||
|
||||
If no satisfying versions are found, then exits failure.
|
||||
|
||||
Versions are printed in ascending order, so supplying
|
||||
multiple versions to the utility will just sort them.
|
||||
```
|
||||
|
||||
## Versions
|
||||
|
||||
A "version" is described by the `v2.0.0` specification found at
|
||||
<https://semver.org/>.
|
||||
|
||||
A leading `"="` or `"v"` character is stripped off and ignored.
|
||||
|
||||
## Ranges
|
||||
|
||||
A `version range` is a set of `comparators` which specify versions
|
||||
that satisfy the range.
|
||||
|
||||
A `comparator` is composed of an `operator` and a `version`. The set
|
||||
of primitive `operators` is:
|
||||
|
||||
* `<` Less than
|
||||
* `<=` Less than or equal to
|
||||
* `>` Greater than
|
||||
* `>=` Greater than or equal to
|
||||
* `=` Equal. If no operator is specified, then equality is assumed,
|
||||
so this operator is optional, but MAY be included.
|
||||
|
||||
For example, the comparator `>=1.2.7` would match the versions
|
||||
`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
|
||||
or `1.1.0`.
|
||||
|
||||
Comparators can be joined by whitespace to form a `comparator set`,
|
||||
which is satisfied by the **intersection** of all of the comparators
|
||||
it includes.
|
||||
|
||||
A range is composed of one or more comparator sets, joined by `||`. A
|
||||
version matches a range if and only if every comparator in at least
|
||||
one of the `||`-separated comparator sets is satisfied by the version.
|
||||
|
||||
For example, the range `>=1.2.7 <1.3.0` would match the versions
|
||||
`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
|
||||
or `1.1.0`.
|
||||
|
||||
The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
|
||||
`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
|
||||
|
||||
### Prerelease Tags
|
||||
|
||||
If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
|
||||
it will only be allowed to satisfy comparator sets if at least one
|
||||
comparator with the same `[major, minor, patch]` tuple also has a
|
||||
prerelease tag.
|
||||
|
||||
For example, the range `>1.2.3-alpha.3` would be allowed to match the
|
||||
version `1.2.3-alpha.7`, but it would *not* be satisfied by
|
||||
`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
|
||||
than" `1.2.3-alpha.3` according to the SemVer sort rules. The version
|
||||
range only accepts prerelease tags on the `1.2.3` version. The
|
||||
version `3.4.5` *would* satisfy the range, because it does not have a
|
||||
prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
|
||||
|
||||
The purpose for this behavior is twofold. First, prerelease versions
|
||||
frequently are updated very quickly, and contain many breaking changes
|
||||
that are (by the author's design) not yet fit for public consumption.
|
||||
Therefore, by default, they are excluded from range matching
|
||||
semantics.
|
||||
|
||||
Second, a user who has opted into using a prerelease version has
|
||||
clearly indicated the intent to use *that specific* set of
|
||||
alpha/beta/rc versions. By including a prerelease tag in the range,
|
||||
the user is indicating that they are aware of the risk. However, it
|
||||
is still not appropriate to assume that they have opted into taking a
|
||||
similar risk on the *next* set of prerelease versions.
|
||||
|
||||
Note that this behavior can be suppressed (treating all prerelease
|
||||
versions as if they were normal versions, for the purpose of range
|
||||
matching) by setting the `includePrerelease` flag on the options
|
||||
object to any
|
||||
[functions](https://github.com/npm/node-semver#functions) that do
|
||||
range matching.
|
||||
|
||||
#### Prerelease Identifiers
|
||||
|
||||
The method `.inc` takes an additional `identifier` string argument that
|
||||
will append the value of the string as a prerelease identifier:
|
||||
|
||||
```javascript
|
||||
semver.inc('1.2.3', 'prerelease', 'beta')
|
||||
// '1.2.4-beta.0'
|
||||
```
|
||||
|
||||
command-line example:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.3 -i prerelease --preid beta
|
||||
1.2.4-beta.0
|
||||
```
|
||||
|
||||
Which then can be used to increment further:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.4-beta.0 -i prerelease
|
||||
1.2.4-beta.1
|
||||
```
|
||||
|
||||
### Advanced Range Syntax
|
||||
|
||||
Advanced range syntax desugars to primitive comparators in
|
||||
deterministic ways.
|
||||
|
||||
Advanced ranges may be combined in the same way as primitive
|
||||
comparators using white space or `||`.
|
||||
|
||||
#### Hyphen Ranges `X.Y.Z - A.B.C`
|
||||
|
||||
Specifies an inclusive set.
|
||||
|
||||
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the first version in the inclusive
|
||||
range, then the missing pieces are replaced with zeroes.
|
||||
|
||||
* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the second version in the
|
||||
inclusive range, then all versions that start with the supplied parts
|
||||
of the tuple are accepted, but nothing that would be greater than the
|
||||
provided tuple parts.
|
||||
|
||||
* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
|
||||
* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
|
||||
|
||||
#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
|
||||
|
||||
Any of `X`, `x`, or `*` may be used to "stand in" for one of the
|
||||
numeric values in the `[major, minor, patch]` tuple.
|
||||
|
||||
* `*` := `>=0.0.0` (Any version satisfies)
|
||||
* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
|
||||
* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
|
||||
|
||||
A partial version range is treated as an X-Range, so the special
|
||||
character is in fact optional.
|
||||
|
||||
* `""` (empty string) := `*` := `>=0.0.0`
|
||||
* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
|
||||
* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
|
||||
|
||||
#### Tilde Ranges `~1.2.3` `~1.2` `~1`
|
||||
|
||||
Allows patch-level changes if a minor version is specified on the
|
||||
comparator. Allows minor-level changes if not.
|
||||
|
||||
* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
|
||||
* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
|
||||
* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
|
||||
* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
|
||||
* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
|
||||
* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
|
||||
* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
|
||||
#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
|
||||
|
||||
Allows changes that do not modify the left-most non-zero element in the
|
||||
`[major, minor, patch]` tuple. In other words, this allows patch and
|
||||
minor updates for versions `1.0.0` and above, patch updates for
|
||||
versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
|
||||
|
||||
Many authors treat a `0.x` version as if the `x` were the major
|
||||
"breaking-change" indicator.
|
||||
|
||||
Caret ranges are ideal when an author may make breaking changes
|
||||
between `0.2.4` and `0.3.0` releases, which is a common practice.
|
||||
However, it presumes that there will *not* be breaking changes between
|
||||
`0.2.4` and `0.2.5`. It allows for changes that are presumed to be
|
||||
additive (but non-breaking), according to commonly observed practices.
|
||||
|
||||
* `^1.2.3` := `>=1.2.3 <2.0.0`
|
||||
* `^0.2.3` := `>=0.2.3 <0.3.0`
|
||||
* `^0.0.3` := `>=0.0.3 <0.0.4`
|
||||
* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the
|
||||
`0.0.3` version *only* will be allowed, if they are greater than or
|
||||
equal to `beta`. So, `0.0.3-pr.2` would be allowed.
|
||||
|
||||
When parsing caret ranges, a missing `patch` value desugars to the
|
||||
number `0`, but will allow flexibility within that value, even if the
|
||||
major and minor versions are both `0`.
|
||||
|
||||
* `^1.2.x` := `>=1.2.0 <2.0.0`
|
||||
* `^0.0.x` := `>=0.0.0 <0.1.0`
|
||||
* `^0.0` := `>=0.0.0 <0.1.0`
|
||||
|
||||
A missing `minor` and `patch` values will desugar to zero, but also
|
||||
allow flexibility within those values, even if the major version is
|
||||
zero.
|
||||
|
||||
* `^1.x` := `>=1.0.0 <2.0.0`
|
||||
* `^0.x` := `>=0.0.0 <1.0.0`
|
||||
|
||||
### Range Grammar
|
||||
|
||||
Putting all this together, here is a Backus-Naur grammar for ranges,
|
||||
for the benefit of parser authors:
|
||||
|
||||
```bnf
|
||||
range-set ::= range ( logical-or range ) *
|
||||
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
||||
range ::= hyphen | simple ( ' ' simple ) * | ''
|
||||
hyphen ::= partial ' - ' partial
|
||||
simple ::= primitive | partial | tilde | caret
|
||||
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
||||
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
||||
xr ::= 'x' | 'X' | '*' | nr
|
||||
nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
||||
tilde ::= '~' partial
|
||||
caret ::= '^' partial
|
||||
qualifier ::= ( '-' pre )? ( '+' build )?
|
||||
pre ::= parts
|
||||
build ::= parts
|
||||
parts ::= part ( '.' part ) *
|
||||
part ::= nr | [-0-9A-Za-z]+
|
||||
```
|
||||
|
||||
## Functions
|
||||
|
||||
All methods and classes take a final `options` object argument. All
|
||||
options in this object are `false` by default. The options supported
|
||||
are:
|
||||
|
||||
- `loose` Be more forgiving about not-quite-valid semver strings.
|
||||
(Any resulting output will always be 100% strict compliant, of
|
||||
course.) For backwards compatibility reasons, if the `options`
|
||||
argument is a boolean value instead of an object, it is interpreted
|
||||
to be the `loose` param.
|
||||
- `includePrerelease` Set to suppress the [default
|
||||
behavior](https://github.com/npm/node-semver#prerelease-tags) of
|
||||
excluding prerelease tagged versions from ranges unless they are
|
||||
explicitly opted into.
|
||||
|
||||
Strict-mode Comparators and Ranges will be strict about the SemVer
|
||||
strings that they parse.
|
||||
|
||||
* `valid(v)`: Return the parsed version, or null if it's not valid.
|
||||
* `inc(v, release)`: Return the version incremented by the release
|
||||
type (`major`, `premajor`, `minor`, `preminor`, `patch`,
|
||||
`prepatch`, or `prerelease`), or null if it's not valid
|
||||
* `premajor` in one call will bump the version up to the next major
|
||||
version and down to a prerelease of that major version.
|
||||
`preminor`, and `prepatch` work the same way.
|
||||
* If called from a non-prerelease version, the `prerelease` will work the
|
||||
same as `prepatch`. It increments the patch version, then makes a
|
||||
prerelease. If the input version is already a prerelease it simply
|
||||
increments it.
|
||||
* `prerelease(v)`: Returns an array of prerelease components, or null
|
||||
if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
|
||||
* `major(v)`: Return the major version number.
|
||||
* `minor(v)`: Return the minor version number.
|
||||
* `patch(v)`: Return the patch version number.
|
||||
* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
|
||||
or comparators intersect.
|
||||
* `parse(v)`: Attempt to parse a string as a semantic version, returning either
|
||||
a `SemVer` object or `null`.
|
||||
|
||||
### Comparison
|
||||
|
||||
* `gt(v1, v2)`: `v1 > v2`
|
||||
* `gte(v1, v2)`: `v1 >= v2`
|
||||
* `lt(v1, v2)`: `v1 < v2`
|
||||
* `lte(v1, v2)`: `v1 <= v2`
|
||||
* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
|
||||
even if they're not the exact same string. You already know how to
|
||||
compare strings.
|
||||
* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
|
||||
* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
|
||||
the corresponding function above. `"==="` and `"!=="` do simple
|
||||
string comparison, but are included for completeness. Throws if an
|
||||
invalid comparison string is provided.
|
||||
* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
|
||||
in descending order when passed to `Array.sort()`.
|
||||
* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
|
||||
are equal. Sorts in ascending order if passed to `Array.sort()`.
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `diff(v1, v2)`: Returns difference between two versions by the release type
|
||||
(`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
|
||||
or null if the versions are the same.
|
||||
|
||||
### Comparators
|
||||
|
||||
* `intersects(comparator)`: Return true if the comparators intersect
|
||||
|
||||
### Ranges
|
||||
|
||||
* `validRange(range)`: Return the valid range or null if it's not valid
|
||||
* `satisfies(version, range)`: Return true if the version satisfies the
|
||||
range.
|
||||
* `maxSatisfying(versions, range)`: Return the highest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minSatisfying(versions, range)`: Return the lowest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minVersion(range)`: Return the lowest version that can possibly match
|
||||
the given range.
|
||||
* `gtr(version, range)`: Return `true` if version is greater than all the
|
||||
versions possible in the range.
|
||||
* `ltr(version, range)`: Return `true` if version is less than all the
|
||||
versions possible in the range.
|
||||
* `outside(version, range, hilo)`: Return true if the version is outside
|
||||
the bounds of the range in either the high or low direction. The
|
||||
`hilo` argument must be either the string `'>'` or `'<'`. (This is
|
||||
the function called by `gtr` and `ltr`.)
|
||||
* `intersects(range)`: Return true if any of the ranges comparators intersect
|
||||
|
||||
Note that, since ranges may be non-contiguous, a version might not be
|
||||
greater than a range, less than a range, *or* satisfy a range! For
|
||||
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
|
||||
until `2.0.0`, so the version `1.2.10` would not be greater than the
|
||||
range (because `2.0.1` satisfies, which is higher), nor less than the
|
||||
range (since `1.2.8` satisfies, which is lower), and it also does not
|
||||
satisfy the range.
|
||||
|
||||
If you want to know if a version satisfies or does not satisfy a
|
||||
range, use the `satisfies(version, range)` function.
|
||||
|
||||
### Coercion
|
||||
|
||||
* `coerce(version, options)`: Coerces a string to semver if possible
|
||||
|
||||
This aims to provide a very forgiving translation of a non-semver string to
|
||||
semver. It looks for the first digit in a string, and consumes all
|
||||
remaining characters which satisfy at least a partial semver (e.g., `1`,
|
||||
`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer
|
||||
versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All
|
||||
surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
|
||||
`3.4.0`). Only text which lacks digits will fail coercion (`version one`
|
||||
is not valid). The maximum length for any semver component considered for
|
||||
coercion is 16 characters; longer components will be ignored
|
||||
(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any
|
||||
semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
|
||||
components are invalid (`9999999999999999.4.7.4` is likely invalid).
|
||||
|
||||
If the `options.rtl` flag is set, then `coerce` will return the right-most
|
||||
coercible tuple that does not share an ending index with a longer coercible
|
||||
tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
|
||||
`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
|
||||
any other overlapping SemVer tuple.
|
||||
|
||||
### Clean
|
||||
|
||||
* `clean(version)`: Clean a string to be a valid semver if possible
|
||||
|
||||
This will return a cleaned and trimmed semver version. If the provided version is not valid a null will be returned. This does not work for ranges.
|
||||
|
||||
ex.
|
||||
* `s.clean(' = v 2.1.5foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean(' = v 2.1.5-foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean('=v2.1.5')`: `'2.1.5'`
|
||||
* `s.clean(' =v2.1.5')`: `2.1.5`
|
||||
* `s.clean(' 2.1.5 ')`: `'2.1.5'`
|
||||
* `s.clean('~1.0.0')`: `null`
|
||||
174
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/bin/semver.js
generated
vendored
174
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/bin/semver.js
generated
vendored
|
|
@ -1,174 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
// Standalone semver comparison program.
|
||||
// Exits successfully and prints matching version(s) if
|
||||
// any supplied version is valid and passes all tests.
|
||||
|
||||
var argv = process.argv.slice(2)
|
||||
|
||||
var versions = []
|
||||
|
||||
var range = []
|
||||
|
||||
var inc = null
|
||||
|
||||
var version = require('../package.json').version
|
||||
|
||||
var loose = false
|
||||
|
||||
var includePrerelease = false
|
||||
|
||||
var coerce = false
|
||||
|
||||
var rtl = false
|
||||
|
||||
var identifier
|
||||
|
||||
var semver = require('../semver')
|
||||
|
||||
var reverse = false
|
||||
|
||||
var options = {}
|
||||
|
||||
main()
|
||||
|
||||
function main () {
|
||||
if (!argv.length) return help()
|
||||
while (argv.length) {
|
||||
var a = argv.shift()
|
||||
var indexOfEqualSign = a.indexOf('=')
|
||||
if (indexOfEqualSign !== -1) {
|
||||
a = a.slice(0, indexOfEqualSign)
|
||||
argv.unshift(a.slice(indexOfEqualSign + 1))
|
||||
}
|
||||
switch (a) {
|
||||
case '-rv': case '-rev': case '--rev': case '--reverse':
|
||||
reverse = true
|
||||
break
|
||||
case '-l': case '--loose':
|
||||
loose = true
|
||||
break
|
||||
case '-p': case '--include-prerelease':
|
||||
includePrerelease = true
|
||||
break
|
||||
case '-v': case '--version':
|
||||
versions.push(argv.shift())
|
||||
break
|
||||
case '-i': case '--inc': case '--increment':
|
||||
switch (argv[0]) {
|
||||
case 'major': case 'minor': case 'patch': case 'prerelease':
|
||||
case 'premajor': case 'preminor': case 'prepatch':
|
||||
inc = argv.shift()
|
||||
break
|
||||
default:
|
||||
inc = 'patch'
|
||||
break
|
||||
}
|
||||
break
|
||||
case '--preid':
|
||||
identifier = argv.shift()
|
||||
break
|
||||
case '-r': case '--range':
|
||||
range.push(argv.shift())
|
||||
break
|
||||
case '-c': case '--coerce':
|
||||
coerce = true
|
||||
break
|
||||
case '--rtl':
|
||||
rtl = true
|
||||
break
|
||||
case '--ltr':
|
||||
rtl = false
|
||||
break
|
||||
case '-h': case '--help': case '-?':
|
||||
return help()
|
||||
default:
|
||||
versions.push(a)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
|
||||
|
||||
versions = versions.map(function (v) {
|
||||
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
||||
}).filter(function (v) {
|
||||
return semver.valid(v)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
if (inc && (versions.length !== 1 || range.length)) { return failInc() }
|
||||
|
||||
for (var i = 0, l = range.length; i < l; i++) {
|
||||
versions = versions.filter(function (v) {
|
||||
return semver.satisfies(v, range[i], options)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
}
|
||||
return success(versions)
|
||||
}
|
||||
|
||||
function failInc () {
|
||||
console.error('--inc can only be used on a single version with no range')
|
||||
fail()
|
||||
}
|
||||
|
||||
function fail () { process.exit(1) }
|
||||
|
||||
function success () {
|
||||
var compare = reverse ? 'rcompare' : 'compare'
|
||||
versions.sort(function (a, b) {
|
||||
return semver[compare](a, b, options)
|
||||
}).map(function (v) {
|
||||
return semver.clean(v, options)
|
||||
}).map(function (v) {
|
||||
return inc ? semver.inc(v, inc, options, identifier) : v
|
||||
}).forEach(function (v, i, _) { console.log(v) })
|
||||
}
|
||||
|
||||
function help () {
|
||||
console.log(['SemVer ' + version,
|
||||
'',
|
||||
'A JavaScript implementation of the https://semver.org/ specification',
|
||||
'Copyright Isaac Z. Schlueter',
|
||||
'',
|
||||
'Usage: semver [options] <version> [<version> [...]]',
|
||||
'Prints valid versions sorted by SemVer precedence',
|
||||
'',
|
||||
'Options:',
|
||||
'-r --range <range>',
|
||||
' Print versions that match the specified range.',
|
||||
'',
|
||||
'-i --increment [<level>]',
|
||||
' Increment a version by the specified level. Level can',
|
||||
' be one of: major, minor, patch, premajor, preminor,',
|
||||
" prepatch, or prerelease. Default level is 'patch'.",
|
||||
' Only one version may be specified.',
|
||||
'',
|
||||
'--preid <identifier>',
|
||||
' Identifier to be used to prefix premajor, preminor,',
|
||||
' prepatch or prerelease version increments.',
|
||||
'',
|
||||
'-l --loose',
|
||||
' Interpret versions and ranges loosely',
|
||||
'',
|
||||
'-p --include-prerelease',
|
||||
' Always include prerelease versions in range matching',
|
||||
'',
|
||||
'-c --coerce',
|
||||
' Coerce a string into SemVer if possible',
|
||||
' (does not imply --loose)',
|
||||
'',
|
||||
'--rtl',
|
||||
' Coerce version strings right to left',
|
||||
'',
|
||||
'--ltr',
|
||||
' Coerce version strings left to right (default)',
|
||||
'',
|
||||
'Program exits successfully if any valid version satisfies',
|
||||
'all supplied ranges, and prints all satisfying versions.',
|
||||
'',
|
||||
'If no satisfying versions are found, then exits failure.',
|
||||
'',
|
||||
'Versions are printed in ascending order, so supplying',
|
||||
'multiple versions to the utility will just sort them.'
|
||||
].join('\n'))
|
||||
}
|
||||
38
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/package.json
generated
vendored
38
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/package.json
generated
vendored
|
|
@ -1,38 +0,0 @@
|
|||
{
|
||||
"name": "semver",
|
||||
"version": "6.3.1",
|
||||
"description": "The semantic version parser used by npm.",
|
||||
"main": "semver.js",
|
||||
"scripts": {
|
||||
"test": "tap test/ --100 --timeout=30",
|
||||
"lint": "echo linting disabled",
|
||||
"postlint": "template-oss-check",
|
||||
"template-oss-apply": "template-oss-apply --force",
|
||||
"lintfix": "npm run lint -- --fix",
|
||||
"snap": "tap test/ --100 --timeout=30",
|
||||
"posttest": "npm run lint"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@npmcli/template-oss": "4.17.0",
|
||||
"tap": "^12.7.0"
|
||||
},
|
||||
"license": "ISC",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/npm/node-semver.git"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "./bin/semver.js"
|
||||
},
|
||||
"files": [
|
||||
"bin",
|
||||
"range.bnf",
|
||||
"semver.js"
|
||||
],
|
||||
"author": "GitHub Inc.",
|
||||
"templateOSS": {
|
||||
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
|
||||
"content": "./scripts/template-oss",
|
||||
"version": "4.17.0"
|
||||
}
|
||||
}
|
||||
1643
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/semver.js
generated
vendored
1643
backend/node_modules/@babel/helper-compilation-targets/node_modules/semver/semver.js
generated
vendored
File diff suppressed because it is too large
Load diff
19
backend/node_modules/@babel/helper-create-class-features-plugin/README.md
generated
vendored
19
backend/node_modules/@babel/helper-create-class-features-plugin/README.md
generated
vendored
|
|
@ -1,19 +0,0 @@
|
|||
# @babel/helper-create-class-features-plugin
|
||||
|
||||
> Compile class public and private fields, private methods and decorators to ES6
|
||||
|
||||
See our website [@babel/helper-create-class-features-plugin](https://babeljs.io/docs/babel-helper-create-class-features-plugin) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save @babel/helper-create-class-features-plugin
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/helper-create-class-features-plugin
|
||||
```
|
||||
124
backend/node_modules/@babel/helper-create-class-features-plugin/lib/decorators-2018-09.js
generated
vendored
124
backend/node_modules/@babel/helper-create-class-features-plugin/lib/decorators-2018-09.js
generated
vendored
|
|
@ -1,124 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.buildDecoratedClass = buildDecoratedClass;
|
||||
var _core = require("@babel/core");
|
||||
var _helperReplaceSupers = require("@babel/helper-replace-supers");
|
||||
function prop(key, value) {
|
||||
if (!value) return null;
|
||||
return _core.types.objectProperty(_core.types.identifier(key), value);
|
||||
}
|
||||
function method(key, body) {
|
||||
return _core.types.objectMethod("method", _core.types.identifier(key), [], _core.types.blockStatement(body));
|
||||
}
|
||||
function takeDecorators(node) {
|
||||
let result;
|
||||
if (node.decorators && node.decorators.length > 0) {
|
||||
result = _core.types.arrayExpression(node.decorators.map(decorator => decorator.expression));
|
||||
}
|
||||
node.decorators = undefined;
|
||||
return result;
|
||||
}
|
||||
function getKey(node) {
|
||||
if (node.computed) {
|
||||
return node.key;
|
||||
} else if (_core.types.isIdentifier(node.key)) {
|
||||
return _core.types.stringLiteral(node.key.name);
|
||||
} else {
|
||||
return _core.types.stringLiteral(String(node.key.value));
|
||||
}
|
||||
}
|
||||
function extractElementDescriptor(file, classRef, superRef, path) {
|
||||
const isMethod = path.isClassMethod();
|
||||
if (path.isPrivate()) {
|
||||
throw path.buildCodeFrameError(`Private ${isMethod ? "methods" : "fields"} in decorated classes are not supported yet.`);
|
||||
}
|
||||
if (path.node.type === "ClassAccessorProperty") {
|
||||
throw path.buildCodeFrameError(`Accessor properties are not supported in 2018-09 decorator transform, please specify { "version": "2021-12" } instead.`);
|
||||
}
|
||||
if (path.node.type === "StaticBlock") {
|
||||
throw path.buildCodeFrameError(`Static blocks are not supported in 2018-09 decorator transform, please specify { "version": "2021-12" } instead.`);
|
||||
}
|
||||
const {
|
||||
node,
|
||||
scope
|
||||
} = path;
|
||||
if (!path.isTSDeclareMethod()) {
|
||||
new _helperReplaceSupers.default({
|
||||
methodPath: path,
|
||||
objectRef: classRef,
|
||||
superRef,
|
||||
file,
|
||||
refToPreserve: classRef
|
||||
}).replace();
|
||||
}
|
||||
const properties = [prop("kind", _core.types.stringLiteral(_core.types.isClassMethod(node) ? node.kind : "field")), prop("decorators", takeDecorators(node)), prop("static", node.static && _core.types.booleanLiteral(true)), prop("key", getKey(node))].filter(Boolean);
|
||||
if (isMethod) {
|
||||
var _path$ensureFunctionN;
|
||||
(_path$ensureFunctionN = path.ensureFunctionName) != null ? _path$ensureFunctionN : path.ensureFunctionName = require("@babel/traverse").NodePath.prototype.ensureFunctionName;
|
||||
path.ensureFunctionName(false);
|
||||
properties.push(prop("value", _core.types.toExpression(path.node)));
|
||||
} else if (_core.types.isClassProperty(node) && node.value) {
|
||||
properties.push(method("value", _core.template.statements.ast`return ${node.value}`));
|
||||
} else {
|
||||
properties.push(prop("value", scope.buildUndefinedNode()));
|
||||
}
|
||||
path.remove();
|
||||
return _core.types.objectExpression(properties);
|
||||
}
|
||||
function addDecorateHelper(file) {
|
||||
return file.addHelper("decorate");
|
||||
}
|
||||
function buildDecoratedClass(ref, path, elements, file) {
|
||||
const {
|
||||
node,
|
||||
scope
|
||||
} = path;
|
||||
const initializeId = scope.generateUidIdentifier("initialize");
|
||||
const isDeclaration = node.id && path.isDeclaration();
|
||||
const isStrict = path.isInStrictMode();
|
||||
const {
|
||||
superClass
|
||||
} = node;
|
||||
node.type = "ClassDeclaration";
|
||||
if (!node.id) node.id = _core.types.cloneNode(ref);
|
||||
let superId;
|
||||
if (superClass) {
|
||||
superId = scope.generateUidIdentifierBasedOnNode(node.superClass, "super");
|
||||
node.superClass = superId;
|
||||
}
|
||||
const classDecorators = takeDecorators(node);
|
||||
const definitions = _core.types.arrayExpression(elements.filter(element => !element.node.abstract && element.node.type !== "TSIndexSignature").map(path => extractElementDescriptor(file, node.id, superId, path)));
|
||||
const wrapperCall = _core.template.expression.ast`
|
||||
${addDecorateHelper(file)}(
|
||||
${classDecorators || _core.types.nullLiteral()},
|
||||
function (${initializeId}, ${superClass ? _core.types.cloneNode(superId) : null}) {
|
||||
${node}
|
||||
return { F: ${_core.types.cloneNode(node.id)}, d: ${definitions} };
|
||||
},
|
||||
${superClass}
|
||||
)
|
||||
`;
|
||||
if (!isStrict) {
|
||||
wrapperCall.arguments[1].body.directives.push(_core.types.directive(_core.types.directiveLiteral("use strict")));
|
||||
}
|
||||
let replacement = wrapperCall;
|
||||
let classPathDesc = "arguments.1.body.body.0";
|
||||
if (isDeclaration) {
|
||||
replacement = _core.template.statement.ast`let ${ref} = ${wrapperCall}`;
|
||||
classPathDesc = "declarations.0.init." + classPathDesc;
|
||||
}
|
||||
return {
|
||||
instanceNodes: [_core.template.statement.ast`
|
||||
${_core.types.cloneNode(initializeId)}(this)
|
||||
`],
|
||||
wrapClass(path) {
|
||||
path.replaceWith(replacement);
|
||||
return path.get(classPathDesc);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//# sourceMappingURL=decorators-2018-09.js.map
|
||||
File diff suppressed because one or more lines are too long
1310
backend/node_modules/@babel/helper-create-class-features-plugin/lib/decorators.js
generated
vendored
1310
backend/node_modules/@babel/helper-create-class-features-plugin/lib/decorators.js
generated
vendored
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
137
backend/node_modules/@babel/helper-create-class-features-plugin/lib/features.js
generated
vendored
137
backend/node_modules/@babel/helper-create-class-features-plugin/lib/features.js
generated
vendored
|
|
@ -1,137 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.FEATURES = void 0;
|
||||
exports.enableFeature = enableFeature;
|
||||
exports.isLoose = isLoose;
|
||||
exports.shouldTransform = shouldTransform;
|
||||
var _decorators = require("./decorators.js");
|
||||
const FEATURES = exports.FEATURES = Object.freeze({
|
||||
fields: 1 << 1,
|
||||
privateMethods: 1 << 2,
|
||||
decorators: 1 << 3,
|
||||
privateIn: 1 << 4,
|
||||
staticBlocks: 1 << 5
|
||||
});
|
||||
const featuresSameLoose = new Map([[FEATURES.fields, "@babel/plugin-transform-class-properties"], [FEATURES.privateMethods, "@babel/plugin-transform-private-methods"], [FEATURES.privateIn, "@babel/plugin-transform-private-property-in-object"]]);
|
||||
const featuresKey = "@babel/plugin-class-features/featuresKey";
|
||||
const looseKey = "@babel/plugin-class-features/looseKey";
|
||||
var looseLowPriorityKey = "@babel/plugin-class-features/looseLowPriorityKey/#__internal__@babel/preset-env__please-overwrite-loose-instead-of-throwing";
|
||||
var canIgnoreLoose = function (file, feature) {
|
||||
return !!(file.get(looseLowPriorityKey) & feature);
|
||||
};
|
||||
function enableFeature(file, feature, loose) {
|
||||
if (!hasFeature(file, feature) || canIgnoreLoose(file, feature)) {
|
||||
file.set(featuresKey, file.get(featuresKey) | feature);
|
||||
if (loose === "#__internal__@babel/preset-env__prefer-true-but-false-is-ok-if-it-prevents-an-error") {
|
||||
setLoose(file, feature, true);
|
||||
file.set(looseLowPriorityKey, file.get(looseLowPriorityKey) | feature);
|
||||
} else if (loose === "#__internal__@babel/preset-env__prefer-false-but-true-is-ok-if-it-prevents-an-error") {
|
||||
setLoose(file, feature, false);
|
||||
file.set(looseLowPriorityKey, file.get(looseLowPriorityKey) | feature);
|
||||
} else {
|
||||
setLoose(file, feature, loose);
|
||||
}
|
||||
}
|
||||
let resolvedLoose;
|
||||
for (const [mask, name] of featuresSameLoose) {
|
||||
if (!hasFeature(file, mask)) continue;
|
||||
if (canIgnoreLoose(file, mask)) continue;
|
||||
const loose = isLoose(file, mask);
|
||||
if (resolvedLoose === !loose) {
|
||||
throw new Error("'loose' mode configuration must be the same for @babel/plugin-transform-class-properties, " + "@babel/plugin-transform-private-methods and " + "@babel/plugin-transform-private-property-in-object (when they are enabled)." + "\n\n" + getBabelShowConfigForHint(file));
|
||||
} else {
|
||||
resolvedLoose = loose;
|
||||
var higherPriorityPluginName = name;
|
||||
}
|
||||
}
|
||||
if (resolvedLoose !== undefined) {
|
||||
for (const [mask, name] of featuresSameLoose) {
|
||||
if (hasFeature(file, mask) && isLoose(file, mask) !== resolvedLoose) {
|
||||
setLoose(file, mask, resolvedLoose);
|
||||
console.warn(`Though the "loose" option was set to "${!resolvedLoose}" in your @babel/preset-env ` + `config, it will not be used for ${name} since the "loose" mode option was set to ` + `"${resolvedLoose}" for ${higherPriorityPluginName}.\nThe "loose" option must be the ` + `same for @babel/plugin-transform-class-properties, @babel/plugin-transform-private-methods ` + `and @babel/plugin-transform-private-property-in-object (when they are enabled): you can ` + `silence this warning by explicitly adding\n` + `\t["${name}", { "loose": ${resolvedLoose} }]\n` + `to the "plugins" section of your Babel config.` + "\n\n" + getBabelShowConfigForHint(file));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function getBabelShowConfigForHint(file) {
|
||||
let {
|
||||
filename
|
||||
} = file.opts;
|
||||
if (!filename || filename === "unknown") {
|
||||
filename = "[name of the input file]";
|
||||
}
|
||||
return `\
|
||||
If you already set the same 'loose' mode for these plugins in your config, it's possible that they \
|
||||
are enabled multiple times with different options.
|
||||
You can re-run Babel with the BABEL_SHOW_CONFIG_FOR environment variable to show the loaded \
|
||||
configuration:
|
||||
\tnpx cross-env BABEL_SHOW_CONFIG_FOR=${filename} <your build command>
|
||||
See https://babeljs.io/docs/configuration#print-effective-configs for more info.`;
|
||||
}
|
||||
function hasFeature(file, feature) {
|
||||
return !!(file.get(featuresKey) & feature);
|
||||
}
|
||||
function isLoose(file, feature) {
|
||||
return !!(file.get(looseKey) & feature);
|
||||
}
|
||||
function setLoose(file, feature, loose) {
|
||||
if (loose) file.set(looseKey, file.get(looseKey) | feature);else file.set(looseKey, file.get(looseKey) & ~feature);
|
||||
file.set(looseLowPriorityKey, file.get(looseLowPriorityKey) & ~feature);
|
||||
}
|
||||
function shouldTransform(path, file) {
|
||||
let decoratorPath = null;
|
||||
let publicFieldPath = null;
|
||||
let privateFieldPath = null;
|
||||
let privateMethodPath = null;
|
||||
let staticBlockPath = null;
|
||||
if ((0, _decorators.hasOwnDecorators)(path.node)) {
|
||||
decoratorPath = path.get("decorators.0");
|
||||
}
|
||||
for (const el of path.get("body.body")) {
|
||||
if (!decoratorPath && (0, _decorators.hasOwnDecorators)(el.node)) {
|
||||
decoratorPath = el.get("decorators.0");
|
||||
}
|
||||
if (!publicFieldPath && el.isClassProperty()) {
|
||||
publicFieldPath = el;
|
||||
}
|
||||
if (!privateFieldPath && el.isClassPrivateProperty()) {
|
||||
privateFieldPath = el;
|
||||
}
|
||||
if (!privateMethodPath && el.isClassPrivateMethod != null && el.isClassPrivateMethod()) {
|
||||
privateMethodPath = el;
|
||||
}
|
||||
if (!staticBlockPath && el.isStaticBlock != null && el.isStaticBlock()) {
|
||||
staticBlockPath = el;
|
||||
}
|
||||
}
|
||||
if (decoratorPath && privateFieldPath) {
|
||||
throw privateFieldPath.buildCodeFrameError("Private fields in decorated classes are not supported yet.");
|
||||
}
|
||||
if (decoratorPath && privateMethodPath) {
|
||||
throw privateMethodPath.buildCodeFrameError("Private methods in decorated classes are not supported yet.");
|
||||
}
|
||||
if (decoratorPath && !hasFeature(file, FEATURES.decorators)) {
|
||||
throw path.buildCodeFrameError("Decorators are not enabled." + "\nIf you are using " + '["@babel/plugin-proposal-decorators", { "version": "legacy" }], ' + 'make sure it comes *before* "@babel/plugin-transform-class-properties" ' + "and enable loose mode, like so:\n" + '\t["@babel/plugin-proposal-decorators", { "version": "legacy" }]\n' + '\t["@babel/plugin-transform-class-properties", { "loose": true }]');
|
||||
}
|
||||
if (privateMethodPath && !hasFeature(file, FEATURES.privateMethods)) {
|
||||
throw privateMethodPath.buildCodeFrameError("Class private methods are not enabled. " + "Please add `@babel/plugin-transform-private-methods` to your configuration.");
|
||||
}
|
||||
if ((publicFieldPath || privateFieldPath) && !hasFeature(file, FEATURES.fields) && !hasFeature(file, FEATURES.privateMethods)) {
|
||||
throw path.buildCodeFrameError("Class fields are not enabled. " + "Please add `@babel/plugin-transform-class-properties` to your configuration.");
|
||||
}
|
||||
if (staticBlockPath && !hasFeature(file, FEATURES.staticBlocks)) {
|
||||
throw path.buildCodeFrameError("Static class blocks are not enabled. " + "Please add `@babel/plugin-transform-class-static-block` to your configuration.");
|
||||
}
|
||||
if (decoratorPath || privateMethodPath || staticBlockPath) {
|
||||
return true;
|
||||
}
|
||||
if ((publicFieldPath || privateFieldPath) && hasFeature(file, FEATURES.fields)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=features.js.map
|
||||
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/features.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/features.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1041
backend/node_modules/@babel/helper-create-class-features-plugin/lib/fields.js
generated
vendored
1041
backend/node_modules/@babel/helper-create-class-features-plugin/lib/fields.js
generated
vendored
File diff suppressed because it is too large
Load diff
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/fields.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/fields.js.map
generated
vendored
File diff suppressed because one or more lines are too long
237
backend/node_modules/@babel/helper-create-class-features-plugin/lib/index.js
generated
vendored
237
backend/node_modules/@babel/helper-create-class-features-plugin/lib/index.js
generated
vendored
|
|
@ -1,237 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "FEATURES", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _features.FEATURES;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "buildCheckInRHS", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _fields.buildCheckInRHS;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "buildNamedEvaluationVisitor", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _decorators.buildNamedEvaluationVisitor;
|
||||
}
|
||||
});
|
||||
exports.createClassFeaturePlugin = createClassFeaturePlugin;
|
||||
Object.defineProperty(exports, "enableFeature", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _features.enableFeature;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "injectInitialization", {
|
||||
enumerable: true,
|
||||
get: function () {
|
||||
return _misc.injectInitialization;
|
||||
}
|
||||
});
|
||||
var _core = require("@babel/core");
|
||||
var _semver = require("semver");
|
||||
var _fields = require("./fields.js");
|
||||
var _decorators = require("./decorators.js");
|
||||
var _decorators2 = require("./decorators-2018-09.js");
|
||||
var _misc = require("./misc.js");
|
||||
var _features = require("./features.js");
|
||||
var _typescript = require("./typescript.js");
|
||||
const versionKey = "@babel/plugin-class-features/version";
|
||||
function createClassFeaturePlugin({
|
||||
name,
|
||||
feature,
|
||||
loose,
|
||||
manipulateOptions,
|
||||
api,
|
||||
inherits,
|
||||
decoratorVersion
|
||||
}) {
|
||||
var _api$assumption;
|
||||
if (feature & _features.FEATURES.decorators) {
|
||||
if (decoratorVersion === "2023-11" || decoratorVersion === "2023-05" || decoratorVersion === "2023-01" || decoratorVersion === "2022-03" || decoratorVersion === "2021-12") {
|
||||
return (0, _decorators.default)(api, {
|
||||
loose
|
||||
}, decoratorVersion, inherits);
|
||||
}
|
||||
}
|
||||
api != null ? api : api = {
|
||||
assumption: () => void 0
|
||||
};
|
||||
const setPublicClassFields = api.assumption("setPublicClassFields");
|
||||
const privateFieldsAsSymbols = api.assumption("privateFieldsAsSymbols");
|
||||
const privateFieldsAsProperties = api.assumption("privateFieldsAsProperties");
|
||||
const noUninitializedPrivateFieldAccess = (_api$assumption = api.assumption("noUninitializedPrivateFieldAccess")) != null ? _api$assumption : false;
|
||||
const constantSuper = api.assumption("constantSuper");
|
||||
const noDocumentAll = api.assumption("noDocumentAll");
|
||||
if (privateFieldsAsProperties && privateFieldsAsSymbols) {
|
||||
throw new Error(`Cannot enable both the "privateFieldsAsProperties" and ` + `"privateFieldsAsSymbols" assumptions as the same time.`);
|
||||
}
|
||||
const privateFieldsAsSymbolsOrProperties = privateFieldsAsProperties || privateFieldsAsSymbols;
|
||||
if (loose === true) {
|
||||
const explicit = [];
|
||||
if (setPublicClassFields !== undefined) {
|
||||
explicit.push(`"setPublicClassFields"`);
|
||||
}
|
||||
if (privateFieldsAsProperties !== undefined) {
|
||||
explicit.push(`"privateFieldsAsProperties"`);
|
||||
}
|
||||
if (privateFieldsAsSymbols !== undefined) {
|
||||
explicit.push(`"privateFieldsAsSymbols"`);
|
||||
}
|
||||
if (explicit.length !== 0) {
|
||||
console.warn(`[${name}]: You are using the "loose: true" option and you are` + ` explicitly setting a value for the ${explicit.join(" and ")}` + ` assumption${explicit.length > 1 ? "s" : ""}. The "loose" option` + ` can cause incompatibilities with the other class features` + ` plugins, so it's recommended that you replace it with the` + ` following top-level option:\n` + `\t"assumptions": {\n` + `\t\t"setPublicClassFields": true,\n` + `\t\t"privateFieldsAsSymbols": true\n` + `\t}`);
|
||||
}
|
||||
}
|
||||
return {
|
||||
name,
|
||||
manipulateOptions,
|
||||
inherits,
|
||||
pre(file) {
|
||||
(0, _features.enableFeature)(file, feature, loose);
|
||||
if (typeof file.get(versionKey) === "number") {
|
||||
file.set(versionKey, "7.28.6");
|
||||
return;
|
||||
}
|
||||
if (!file.get(versionKey) || _semver.lt(file.get(versionKey), "7.28.6")) {
|
||||
file.set(versionKey, "7.28.6");
|
||||
}
|
||||
},
|
||||
visitor: {
|
||||
Class(path, {
|
||||
file
|
||||
}) {
|
||||
if (file.get(versionKey) !== "7.28.6") return;
|
||||
if (!(0, _features.shouldTransform)(path, file)) return;
|
||||
const pathIsClassDeclaration = path.isClassDeclaration();
|
||||
if (pathIsClassDeclaration) (0, _typescript.assertFieldTransformed)(path);
|
||||
const loose = (0, _features.isLoose)(file, feature);
|
||||
let constructor;
|
||||
const isDecorated = (0, _decorators.hasDecorators)(path.node);
|
||||
const props = [];
|
||||
const elements = [];
|
||||
const computedPaths = [];
|
||||
const privateNames = new Set();
|
||||
const body = path.get("body");
|
||||
for (const path of body.get("body")) {
|
||||
if ((path.isClassProperty() || path.isClassMethod()) && path.node.computed) {
|
||||
computedPaths.push(path);
|
||||
}
|
||||
if (path.isPrivate()) {
|
||||
const {
|
||||
name
|
||||
} = path.node.key.id;
|
||||
const getName = `get ${name}`;
|
||||
const setName = `set ${name}`;
|
||||
if (path.isClassPrivateMethod()) {
|
||||
if (path.node.kind === "get") {
|
||||
if (privateNames.has(getName) || privateNames.has(name) && !privateNames.has(setName)) {
|
||||
throw path.buildCodeFrameError("Duplicate private field");
|
||||
}
|
||||
privateNames.add(getName).add(name);
|
||||
} else if (path.node.kind === "set") {
|
||||
if (privateNames.has(setName) || privateNames.has(name) && !privateNames.has(getName)) {
|
||||
throw path.buildCodeFrameError("Duplicate private field");
|
||||
}
|
||||
privateNames.add(setName).add(name);
|
||||
}
|
||||
} else {
|
||||
if (privateNames.has(name) && !privateNames.has(getName) && !privateNames.has(setName) || privateNames.has(name) && (privateNames.has(getName) || privateNames.has(setName))) {
|
||||
throw path.buildCodeFrameError("Duplicate private field");
|
||||
}
|
||||
privateNames.add(name);
|
||||
}
|
||||
}
|
||||
if (path.isClassMethod({
|
||||
kind: "constructor"
|
||||
})) {
|
||||
constructor = path;
|
||||
} else {
|
||||
elements.push(path);
|
||||
if (path.isProperty() || path.isPrivate() || path.isStaticBlock != null && path.isStaticBlock()) {
|
||||
props.push(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!props.length && !isDecorated) return;
|
||||
const innerBinding = path.node.id;
|
||||
let ref;
|
||||
if (!innerBinding || !pathIsClassDeclaration) {
|
||||
var _path$ensureFunctionN;
|
||||
(_path$ensureFunctionN = path.ensureFunctionName) != null ? _path$ensureFunctionN : path.ensureFunctionName = require("@babel/traverse").NodePath.prototype.ensureFunctionName;
|
||||
path.ensureFunctionName(false);
|
||||
ref = path.scope.generateUidIdentifier((innerBinding == null ? void 0 : innerBinding.name) || "Class");
|
||||
}
|
||||
const classRefForDefine = ref != null ? ref : _core.types.cloneNode(innerBinding);
|
||||
const privateNamesMap = (0, _fields.buildPrivateNamesMap)(classRefForDefine.name, privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose, props, file);
|
||||
const privateNamesNodes = (0, _fields.buildPrivateNamesNodes)(privateNamesMap, privateFieldsAsProperties != null ? privateFieldsAsProperties : loose, privateFieldsAsSymbols != null ? privateFieldsAsSymbols : false, file);
|
||||
(0, _fields.transformPrivateNamesUsage)(classRefForDefine, path, privateNamesMap, {
|
||||
privateFieldsAsProperties: privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose,
|
||||
noUninitializedPrivateFieldAccess,
|
||||
noDocumentAll,
|
||||
innerBinding
|
||||
}, file);
|
||||
let keysNodes, staticNodes, instanceNodes, lastInstanceNodeReturnsThis, pureStaticNodes, classBindingNode, wrapClass;
|
||||
if (isDecorated) {
|
||||
staticNodes = pureStaticNodes = keysNodes = [];
|
||||
({
|
||||
instanceNodes,
|
||||
wrapClass
|
||||
} = (0, _decorators2.buildDecoratedClass)(classRefForDefine, path, elements, file));
|
||||
} else {
|
||||
keysNodes = (0, _misc.extractComputedKeys)(path, computedPaths, file);
|
||||
({
|
||||
staticNodes,
|
||||
pureStaticNodes,
|
||||
instanceNodes,
|
||||
lastInstanceNodeReturnsThis,
|
||||
classBindingNode,
|
||||
wrapClass
|
||||
} = (0, _fields.buildFieldsInitNodes)(ref, path.node.superClass, props, privateNamesMap, file, setPublicClassFields != null ? setPublicClassFields : loose, privateFieldsAsSymbolsOrProperties != null ? privateFieldsAsSymbolsOrProperties : loose, noUninitializedPrivateFieldAccess, constantSuper != null ? constantSuper : loose, innerBinding));
|
||||
}
|
||||
if (instanceNodes.length > 0) {
|
||||
(0, _misc.injectInitialization)(path, constructor, instanceNodes, (referenceVisitor, state) => {
|
||||
if (isDecorated) return;
|
||||
for (const prop of props) {
|
||||
if (_core.types.isStaticBlock != null && _core.types.isStaticBlock(prop.node) || prop.node.static) continue;
|
||||
prop.traverse(referenceVisitor, state);
|
||||
}
|
||||
}, lastInstanceNodeReturnsThis);
|
||||
}
|
||||
const wrappedPath = wrapClass(path);
|
||||
wrappedPath.insertBefore([...privateNamesNodes, ...keysNodes]);
|
||||
if (staticNodes.length > 0) {
|
||||
wrappedPath.insertAfter(staticNodes);
|
||||
}
|
||||
if (pureStaticNodes.length > 0) {
|
||||
wrappedPath.find(parent => parent.isStatement() || parent.isDeclaration()).insertAfter(pureStaticNodes);
|
||||
}
|
||||
if (classBindingNode != null && pathIsClassDeclaration) {
|
||||
wrappedPath.insertAfter(classBindingNode);
|
||||
}
|
||||
},
|
||||
ExportDefaultDeclaration(path, {
|
||||
file
|
||||
}) {
|
||||
if (file.get(versionKey) !== "7.28.6") return;
|
||||
const decl = path.get("declaration");
|
||||
if (decl.isClassDeclaration() && (0, _decorators.hasDecorators)(decl.node)) {
|
||||
if (decl.node.id) {
|
||||
var _path$splitExportDecl;
|
||||
(_path$splitExportDecl = path.splitExportDeclaration) != null ? _path$splitExportDecl : path.splitExportDeclaration = require("@babel/traverse").NodePath.prototype.splitExportDeclaration;
|
||||
path.splitExportDeclaration();
|
||||
} else {
|
||||
decl.node.type = "ClassExpression";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/index.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
136
backend/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js
generated
vendored
136
backend/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js
generated
vendored
|
|
@ -1,136 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.extractComputedKeys = extractComputedKeys;
|
||||
exports.injectInitialization = injectInitialization;
|
||||
exports.memoiseComputedKey = memoiseComputedKey;
|
||||
var _core = require("@babel/core");
|
||||
var _traverse = require("@babel/traverse");
|
||||
const findBareSupers = _traverse.visitors.environmentVisitor({
|
||||
Super(path) {
|
||||
const {
|
||||
node,
|
||||
parentPath
|
||||
} = path;
|
||||
if (parentPath.isCallExpression({
|
||||
callee: node
|
||||
})) {
|
||||
this.push(parentPath);
|
||||
}
|
||||
}
|
||||
});
|
||||
const referenceVisitor = {
|
||||
"TSTypeAnnotation|TypeAnnotation"(path) {
|
||||
path.skip();
|
||||
},
|
||||
ReferencedIdentifier(path, {
|
||||
scope
|
||||
}) {
|
||||
if (scope.hasOwnBinding(path.node.name)) {
|
||||
scope.rename(path.node.name);
|
||||
path.skip();
|
||||
}
|
||||
}
|
||||
};
|
||||
function handleClassTDZ(path, state) {
|
||||
if (state.classBinding && state.classBinding === path.scope.getBinding(path.node.name)) {
|
||||
const classNameTDZError = state.file.addHelper("classNameTDZError");
|
||||
const throwNode = _core.types.callExpression(classNameTDZError, [_core.types.stringLiteral(path.node.name)]);
|
||||
path.replaceWith(_core.types.sequenceExpression([throwNode, path.node]));
|
||||
path.skip();
|
||||
}
|
||||
}
|
||||
const classFieldDefinitionEvaluationTDZVisitor = {
|
||||
ReferencedIdentifier: handleClassTDZ,
|
||||
"TSTypeAnnotation|TypeAnnotation"(path) {
|
||||
path.skip();
|
||||
}
|
||||
};
|
||||
function injectInitialization(path, constructor, nodes, renamer, lastReturnsThis) {
|
||||
if (!nodes.length) return;
|
||||
const isDerived = !!path.node.superClass;
|
||||
if (!constructor) {
|
||||
const newConstructor = _core.types.classMethod("constructor", _core.types.identifier("constructor"), [], _core.types.blockStatement([]));
|
||||
if (isDerived) {
|
||||
newConstructor.params = [_core.types.restElement(_core.types.identifier("args"))];
|
||||
newConstructor.body.body.push(_core.template.statement.ast`super(...args)`);
|
||||
}
|
||||
[constructor] = path.get("body").unshiftContainer("body", newConstructor);
|
||||
}
|
||||
if (renamer) {
|
||||
renamer(referenceVisitor, {
|
||||
scope: constructor.scope
|
||||
});
|
||||
}
|
||||
if (isDerived) {
|
||||
const bareSupers = [];
|
||||
constructor.traverse(findBareSupers, bareSupers);
|
||||
let isFirst = true;
|
||||
for (const bareSuper of bareSupers) {
|
||||
if (isFirst) {
|
||||
isFirst = false;
|
||||
} else {
|
||||
nodes = nodes.map(n => _core.types.cloneNode(n));
|
||||
}
|
||||
if (!bareSuper.parentPath.isExpressionStatement()) {
|
||||
const allNodes = [bareSuper.node, ...nodes.map(n => _core.types.toExpression(n))];
|
||||
if (!lastReturnsThis) allNodes.push(_core.types.thisExpression());
|
||||
bareSuper.replaceWith(_core.types.sequenceExpression(allNodes));
|
||||
} else {
|
||||
bareSuper.insertAfter(nodes);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
constructor.get("body").unshiftContainer("body", nodes);
|
||||
}
|
||||
}
|
||||
function memoiseComputedKey(keyNode, scope, hint) {
|
||||
const isUidReference = _core.types.isIdentifier(keyNode) && scope.hasUid(keyNode.name);
|
||||
if (isUidReference) {
|
||||
return;
|
||||
}
|
||||
const isMemoiseAssignment = _core.types.isAssignmentExpression(keyNode, {
|
||||
operator: "="
|
||||
}) && _core.types.isIdentifier(keyNode.left) && scope.hasUid(keyNode.left.name);
|
||||
if (isMemoiseAssignment) {
|
||||
return _core.types.cloneNode(keyNode);
|
||||
} else {
|
||||
const ident = _core.types.identifier(hint);
|
||||
scope.push({
|
||||
id: ident,
|
||||
kind: "let"
|
||||
});
|
||||
return _core.types.assignmentExpression("=", _core.types.cloneNode(ident), keyNode);
|
||||
}
|
||||
}
|
||||
function extractComputedKeys(path, computedPaths, file) {
|
||||
const {
|
||||
scope
|
||||
} = path;
|
||||
const declarations = [];
|
||||
const state = {
|
||||
classBinding: path.node.id && scope.getBinding(path.node.id.name),
|
||||
file
|
||||
};
|
||||
for (const computedPath of computedPaths) {
|
||||
const computedKey = computedPath.get("key");
|
||||
if (computedKey.isReferencedIdentifier()) {
|
||||
handleClassTDZ(computedKey, state);
|
||||
} else {
|
||||
computedKey.traverse(classFieldDefinitionEvaluationTDZVisitor, state);
|
||||
}
|
||||
const computedNode = computedPath.node;
|
||||
if (!computedKey.isConstantExpression()) {
|
||||
const assignment = memoiseComputedKey(computedKey.node, scope, scope.generateUidBasedOnNode(computedKey.node));
|
||||
if (assignment) {
|
||||
declarations.push(_core.types.expressionStatement(assignment));
|
||||
computedNode.key = _core.types.cloneNode(assignment.left);
|
||||
}
|
||||
}
|
||||
}
|
||||
return declarations;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=misc.js.map
|
||||
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-class-features-plugin/lib/misc.js.map
generated
vendored
File diff suppressed because one or more lines are too long
13
backend/node_modules/@babel/helper-create-class-features-plugin/lib/typescript.js
generated
vendored
13
backend/node_modules/@babel/helper-create-class-features-plugin/lib/typescript.js
generated
vendored
|
|
@ -1,13 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.assertFieldTransformed = assertFieldTransformed;
|
||||
function assertFieldTransformed(path) {
|
||||
if (path.node.declare || false) {
|
||||
throw path.buildCodeFrameError(`TypeScript 'declare' fields must first be transformed by ` + `@babel/plugin-transform-typescript.\n` + `If you have already enabled that plugin (or '@babel/preset-typescript'), make sure ` + `that it runs before any plugin related to additional class features:\n` + ` - @babel/plugin-transform-class-properties\n` + ` - @babel/plugin-transform-private-methods\n` + ` - @babel/plugin-proposal-decorators`);
|
||||
}
|
||||
}
|
||||
|
||||
//# sourceMappingURL=typescript.js.map
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"names":["assertFieldTransformed","path","node","declare","buildCodeFrameError"],"sources":["../src/typescript.ts"],"sourcesContent":["import type { NodePath, types as t } from \"@babel/core\";\n\nexport function assertFieldTransformed(\n path: NodePath<t.ClassProperty | t.ClassDeclaration>,\n) {\n if (\n path.node.declare ||\n (process.env.BABEL_8_BREAKING\n ? path.isClassProperty({ definite: true })\n : false)\n ) {\n throw path.buildCodeFrameError(\n `TypeScript 'declare' fields must first be transformed by ` +\n `@babel/plugin-transform-typescript.\\n` +\n `If you have already enabled that plugin (or '@babel/preset-typescript'), make sure ` +\n `that it runs before any plugin related to additional class features:\\n` +\n ` - @babel/plugin-transform-class-properties\\n` +\n ` - @babel/plugin-transform-private-methods\\n` +\n ` - @babel/plugin-proposal-decorators`,\n );\n }\n}\n"],"mappings":";;;;;;AAEO,SAASA,sBAAsBA,CACpCC,IAAoD,EACpD;EACA,IACEA,IAAI,CAACC,IAAI,CAACC,OAAO,IAGb,KAAM,EACV;IACA,MAAMF,IAAI,CAACG,mBAAmB,CAC5B,2DAA2D,GACzD,uCAAuC,GACvC,qFAAqF,GACrF,wEAAwE,GACxE,+CAA+C,GAC/C,8CAA8C,GAC9C,sCACJ,CAAC;EACH;AACF","ignoreList":[]}
|
||||
|
|
@ -1,443 +0,0 @@
|
|||
semver(1) -- The semantic versioner for npm
|
||||
===========================================
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install semver
|
||||
````
|
||||
|
||||
## Usage
|
||||
|
||||
As a node module:
|
||||
|
||||
```js
|
||||
const semver = require('semver')
|
||||
|
||||
semver.valid('1.2.3') // '1.2.3'
|
||||
semver.valid('a.b.c') // null
|
||||
semver.clean(' =v1.2.3 ') // '1.2.3'
|
||||
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
|
||||
semver.gt('1.2.3', '9.8.7') // false
|
||||
semver.lt('1.2.3', '9.8.7') // true
|
||||
semver.minVersion('>=1.0.0') // '1.0.0'
|
||||
semver.valid(semver.coerce('v2')) // '2.0.0'
|
||||
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
|
||||
```
|
||||
|
||||
As a command-line utility:
|
||||
|
||||
```
|
||||
$ semver -h
|
||||
|
||||
A JavaScript implementation of the https://semver.org/ specification
|
||||
Copyright Isaac Z. Schlueter
|
||||
|
||||
Usage: semver [options] <version> [<version> [...]]
|
||||
Prints valid versions sorted by SemVer precedence
|
||||
|
||||
Options:
|
||||
-r --range <range>
|
||||
Print versions that match the specified range.
|
||||
|
||||
-i --increment [<level>]
|
||||
Increment a version by the specified level. Level can
|
||||
be one of: major, minor, patch, premajor, preminor,
|
||||
prepatch, or prerelease. Default level is 'patch'.
|
||||
Only one version may be specified.
|
||||
|
||||
--preid <identifier>
|
||||
Identifier to be used to prefix premajor, preminor,
|
||||
prepatch or prerelease version increments.
|
||||
|
||||
-l --loose
|
||||
Interpret versions and ranges loosely
|
||||
|
||||
-p --include-prerelease
|
||||
Always include prerelease versions in range matching
|
||||
|
||||
-c --coerce
|
||||
Coerce a string into SemVer if possible
|
||||
(does not imply --loose)
|
||||
|
||||
--rtl
|
||||
Coerce version strings right to left
|
||||
|
||||
--ltr
|
||||
Coerce version strings left to right (default)
|
||||
|
||||
Program exits successfully if any valid version satisfies
|
||||
all supplied ranges, and prints all satisfying versions.
|
||||
|
||||
If no satisfying versions are found, then exits failure.
|
||||
|
||||
Versions are printed in ascending order, so supplying
|
||||
multiple versions to the utility will just sort them.
|
||||
```
|
||||
|
||||
## Versions
|
||||
|
||||
A "version" is described by the `v2.0.0` specification found at
|
||||
<https://semver.org/>.
|
||||
|
||||
A leading `"="` or `"v"` character is stripped off and ignored.
|
||||
|
||||
## Ranges
|
||||
|
||||
A `version range` is a set of `comparators` which specify versions
|
||||
that satisfy the range.
|
||||
|
||||
A `comparator` is composed of an `operator` and a `version`. The set
|
||||
of primitive `operators` is:
|
||||
|
||||
* `<` Less than
|
||||
* `<=` Less than or equal to
|
||||
* `>` Greater than
|
||||
* `>=` Greater than or equal to
|
||||
* `=` Equal. If no operator is specified, then equality is assumed,
|
||||
so this operator is optional, but MAY be included.
|
||||
|
||||
For example, the comparator `>=1.2.7` would match the versions
|
||||
`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
|
||||
or `1.1.0`.
|
||||
|
||||
Comparators can be joined by whitespace to form a `comparator set`,
|
||||
which is satisfied by the **intersection** of all of the comparators
|
||||
it includes.
|
||||
|
||||
A range is composed of one or more comparator sets, joined by `||`. A
|
||||
version matches a range if and only if every comparator in at least
|
||||
one of the `||`-separated comparator sets is satisfied by the version.
|
||||
|
||||
For example, the range `>=1.2.7 <1.3.0` would match the versions
|
||||
`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
|
||||
or `1.1.0`.
|
||||
|
||||
The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
|
||||
`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
|
||||
|
||||
### Prerelease Tags
|
||||
|
||||
If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
|
||||
it will only be allowed to satisfy comparator sets if at least one
|
||||
comparator with the same `[major, minor, patch]` tuple also has a
|
||||
prerelease tag.
|
||||
|
||||
For example, the range `>1.2.3-alpha.3` would be allowed to match the
|
||||
version `1.2.3-alpha.7`, but it would *not* be satisfied by
|
||||
`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
|
||||
than" `1.2.3-alpha.3` according to the SemVer sort rules. The version
|
||||
range only accepts prerelease tags on the `1.2.3` version. The
|
||||
version `3.4.5` *would* satisfy the range, because it does not have a
|
||||
prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
|
||||
|
||||
The purpose for this behavior is twofold. First, prerelease versions
|
||||
frequently are updated very quickly, and contain many breaking changes
|
||||
that are (by the author's design) not yet fit for public consumption.
|
||||
Therefore, by default, they are excluded from range matching
|
||||
semantics.
|
||||
|
||||
Second, a user who has opted into using a prerelease version has
|
||||
clearly indicated the intent to use *that specific* set of
|
||||
alpha/beta/rc versions. By including a prerelease tag in the range,
|
||||
the user is indicating that they are aware of the risk. However, it
|
||||
is still not appropriate to assume that they have opted into taking a
|
||||
similar risk on the *next* set of prerelease versions.
|
||||
|
||||
Note that this behavior can be suppressed (treating all prerelease
|
||||
versions as if they were normal versions, for the purpose of range
|
||||
matching) by setting the `includePrerelease` flag on the options
|
||||
object to any
|
||||
[functions](https://github.com/npm/node-semver#functions) that do
|
||||
range matching.
|
||||
|
||||
#### Prerelease Identifiers
|
||||
|
||||
The method `.inc` takes an additional `identifier` string argument that
|
||||
will append the value of the string as a prerelease identifier:
|
||||
|
||||
```javascript
|
||||
semver.inc('1.2.3', 'prerelease', 'beta')
|
||||
// '1.2.4-beta.0'
|
||||
```
|
||||
|
||||
command-line example:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.3 -i prerelease --preid beta
|
||||
1.2.4-beta.0
|
||||
```
|
||||
|
||||
Which then can be used to increment further:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.4-beta.0 -i prerelease
|
||||
1.2.4-beta.1
|
||||
```
|
||||
|
||||
### Advanced Range Syntax
|
||||
|
||||
Advanced range syntax desugars to primitive comparators in
|
||||
deterministic ways.
|
||||
|
||||
Advanced ranges may be combined in the same way as primitive
|
||||
comparators using white space or `||`.
|
||||
|
||||
#### Hyphen Ranges `X.Y.Z - A.B.C`
|
||||
|
||||
Specifies an inclusive set.
|
||||
|
||||
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the first version in the inclusive
|
||||
range, then the missing pieces are replaced with zeroes.
|
||||
|
||||
* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the second version in the
|
||||
inclusive range, then all versions that start with the supplied parts
|
||||
of the tuple are accepted, but nothing that would be greater than the
|
||||
provided tuple parts.
|
||||
|
||||
* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
|
||||
* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
|
||||
|
||||
#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
|
||||
|
||||
Any of `X`, `x`, or `*` may be used to "stand in" for one of the
|
||||
numeric values in the `[major, minor, patch]` tuple.
|
||||
|
||||
* `*` := `>=0.0.0` (Any version satisfies)
|
||||
* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
|
||||
* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
|
||||
|
||||
A partial version range is treated as an X-Range, so the special
|
||||
character is in fact optional.
|
||||
|
||||
* `""` (empty string) := `*` := `>=0.0.0`
|
||||
* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
|
||||
* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
|
||||
|
||||
#### Tilde Ranges `~1.2.3` `~1.2` `~1`
|
||||
|
||||
Allows patch-level changes if a minor version is specified on the
|
||||
comparator. Allows minor-level changes if not.
|
||||
|
||||
* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
|
||||
* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
|
||||
* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
|
||||
* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
|
||||
* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
|
||||
* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
|
||||
* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
|
||||
#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
|
||||
|
||||
Allows changes that do not modify the left-most non-zero element in the
|
||||
`[major, minor, patch]` tuple. In other words, this allows patch and
|
||||
minor updates for versions `1.0.0` and above, patch updates for
|
||||
versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
|
||||
|
||||
Many authors treat a `0.x` version as if the `x` were the major
|
||||
"breaking-change" indicator.
|
||||
|
||||
Caret ranges are ideal when an author may make breaking changes
|
||||
between `0.2.4` and `0.3.0` releases, which is a common practice.
|
||||
However, it presumes that there will *not* be breaking changes between
|
||||
`0.2.4` and `0.2.5`. It allows for changes that are presumed to be
|
||||
additive (but non-breaking), according to commonly observed practices.
|
||||
|
||||
* `^1.2.3` := `>=1.2.3 <2.0.0`
|
||||
* `^0.2.3` := `>=0.2.3 <0.3.0`
|
||||
* `^0.0.3` := `>=0.0.3 <0.0.4`
|
||||
* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the
|
||||
`0.0.3` version *only* will be allowed, if they are greater than or
|
||||
equal to `beta`. So, `0.0.3-pr.2` would be allowed.
|
||||
|
||||
When parsing caret ranges, a missing `patch` value desugars to the
|
||||
number `0`, but will allow flexibility within that value, even if the
|
||||
major and minor versions are both `0`.
|
||||
|
||||
* `^1.2.x` := `>=1.2.0 <2.0.0`
|
||||
* `^0.0.x` := `>=0.0.0 <0.1.0`
|
||||
* `^0.0` := `>=0.0.0 <0.1.0`
|
||||
|
||||
A missing `minor` and `patch` values will desugar to zero, but also
|
||||
allow flexibility within those values, even if the major version is
|
||||
zero.
|
||||
|
||||
* `^1.x` := `>=1.0.0 <2.0.0`
|
||||
* `^0.x` := `>=0.0.0 <1.0.0`
|
||||
|
||||
### Range Grammar
|
||||
|
||||
Putting all this together, here is a Backus-Naur grammar for ranges,
|
||||
for the benefit of parser authors:
|
||||
|
||||
```bnf
|
||||
range-set ::= range ( logical-or range ) *
|
||||
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
||||
range ::= hyphen | simple ( ' ' simple ) * | ''
|
||||
hyphen ::= partial ' - ' partial
|
||||
simple ::= primitive | partial | tilde | caret
|
||||
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
||||
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
||||
xr ::= 'x' | 'X' | '*' | nr
|
||||
nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
||||
tilde ::= '~' partial
|
||||
caret ::= '^' partial
|
||||
qualifier ::= ( '-' pre )? ( '+' build )?
|
||||
pre ::= parts
|
||||
build ::= parts
|
||||
parts ::= part ( '.' part ) *
|
||||
part ::= nr | [-0-9A-Za-z]+
|
||||
```
|
||||
|
||||
## Functions
|
||||
|
||||
All methods and classes take a final `options` object argument. All
|
||||
options in this object are `false` by default. The options supported
|
||||
are:
|
||||
|
||||
- `loose` Be more forgiving about not-quite-valid semver strings.
|
||||
(Any resulting output will always be 100% strict compliant, of
|
||||
course.) For backwards compatibility reasons, if the `options`
|
||||
argument is a boolean value instead of an object, it is interpreted
|
||||
to be the `loose` param.
|
||||
- `includePrerelease` Set to suppress the [default
|
||||
behavior](https://github.com/npm/node-semver#prerelease-tags) of
|
||||
excluding prerelease tagged versions from ranges unless they are
|
||||
explicitly opted into.
|
||||
|
||||
Strict-mode Comparators and Ranges will be strict about the SemVer
|
||||
strings that they parse.
|
||||
|
||||
* `valid(v)`: Return the parsed version, or null if it's not valid.
|
||||
* `inc(v, release)`: Return the version incremented by the release
|
||||
type (`major`, `premajor`, `minor`, `preminor`, `patch`,
|
||||
`prepatch`, or `prerelease`), or null if it's not valid
|
||||
* `premajor` in one call will bump the version up to the next major
|
||||
version and down to a prerelease of that major version.
|
||||
`preminor`, and `prepatch` work the same way.
|
||||
* If called from a non-prerelease version, the `prerelease` will work the
|
||||
same as `prepatch`. It increments the patch version, then makes a
|
||||
prerelease. If the input version is already a prerelease it simply
|
||||
increments it.
|
||||
* `prerelease(v)`: Returns an array of prerelease components, or null
|
||||
if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
|
||||
* `major(v)`: Return the major version number.
|
||||
* `minor(v)`: Return the minor version number.
|
||||
* `patch(v)`: Return the patch version number.
|
||||
* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
|
||||
or comparators intersect.
|
||||
* `parse(v)`: Attempt to parse a string as a semantic version, returning either
|
||||
a `SemVer` object or `null`.
|
||||
|
||||
### Comparison
|
||||
|
||||
* `gt(v1, v2)`: `v1 > v2`
|
||||
* `gte(v1, v2)`: `v1 >= v2`
|
||||
* `lt(v1, v2)`: `v1 < v2`
|
||||
* `lte(v1, v2)`: `v1 <= v2`
|
||||
* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
|
||||
even if they're not the exact same string. You already know how to
|
||||
compare strings.
|
||||
* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
|
||||
* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
|
||||
the corresponding function above. `"==="` and `"!=="` do simple
|
||||
string comparison, but are included for completeness. Throws if an
|
||||
invalid comparison string is provided.
|
||||
* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
|
||||
in descending order when passed to `Array.sort()`.
|
||||
* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
|
||||
are equal. Sorts in ascending order if passed to `Array.sort()`.
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `diff(v1, v2)`: Returns difference between two versions by the release type
|
||||
(`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
|
||||
or null if the versions are the same.
|
||||
|
||||
### Comparators
|
||||
|
||||
* `intersects(comparator)`: Return true if the comparators intersect
|
||||
|
||||
### Ranges
|
||||
|
||||
* `validRange(range)`: Return the valid range or null if it's not valid
|
||||
* `satisfies(version, range)`: Return true if the version satisfies the
|
||||
range.
|
||||
* `maxSatisfying(versions, range)`: Return the highest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minSatisfying(versions, range)`: Return the lowest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minVersion(range)`: Return the lowest version that can possibly match
|
||||
the given range.
|
||||
* `gtr(version, range)`: Return `true` if version is greater than all the
|
||||
versions possible in the range.
|
||||
* `ltr(version, range)`: Return `true` if version is less than all the
|
||||
versions possible in the range.
|
||||
* `outside(version, range, hilo)`: Return true if the version is outside
|
||||
the bounds of the range in either the high or low direction. The
|
||||
`hilo` argument must be either the string `'>'` or `'<'`. (This is
|
||||
the function called by `gtr` and `ltr`.)
|
||||
* `intersects(range)`: Return true if any of the ranges comparators intersect
|
||||
|
||||
Note that, since ranges may be non-contiguous, a version might not be
|
||||
greater than a range, less than a range, *or* satisfy a range! For
|
||||
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
|
||||
until `2.0.0`, so the version `1.2.10` would not be greater than the
|
||||
range (because `2.0.1` satisfies, which is higher), nor less than the
|
||||
range (since `1.2.8` satisfies, which is lower), and it also does not
|
||||
satisfy the range.
|
||||
|
||||
If you want to know if a version satisfies or does not satisfy a
|
||||
range, use the `satisfies(version, range)` function.
|
||||
|
||||
### Coercion
|
||||
|
||||
* `coerce(version, options)`: Coerces a string to semver if possible
|
||||
|
||||
This aims to provide a very forgiving translation of a non-semver string to
|
||||
semver. It looks for the first digit in a string, and consumes all
|
||||
remaining characters which satisfy at least a partial semver (e.g., `1`,
|
||||
`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer
|
||||
versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All
|
||||
surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
|
||||
`3.4.0`). Only text which lacks digits will fail coercion (`version one`
|
||||
is not valid). The maximum length for any semver component considered for
|
||||
coercion is 16 characters; longer components will be ignored
|
||||
(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any
|
||||
semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
|
||||
components are invalid (`9999999999999999.4.7.4` is likely invalid).
|
||||
|
||||
If the `options.rtl` flag is set, then `coerce` will return the right-most
|
||||
coercible tuple that does not share an ending index with a longer coercible
|
||||
tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
|
||||
`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
|
||||
any other overlapping SemVer tuple.
|
||||
|
||||
### Clean
|
||||
|
||||
* `clean(version)`: Clean a string to be a valid semver if possible
|
||||
|
||||
This will return a cleaned and trimmed semver version. If the provided version is not valid a null will be returned. This does not work for ranges.
|
||||
|
||||
ex.
|
||||
* `s.clean(' = v 2.1.5foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean(' = v 2.1.5-foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean('=v2.1.5')`: `'2.1.5'`
|
||||
* `s.clean(' =v2.1.5')`: `2.1.5`
|
||||
* `s.clean(' 2.1.5 ')`: `'2.1.5'`
|
||||
* `s.clean('~1.0.0')`: `null`
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
// Standalone semver comparison program.
|
||||
// Exits successfully and prints matching version(s) if
|
||||
// any supplied version is valid and passes all tests.
|
||||
|
||||
var argv = process.argv.slice(2)
|
||||
|
||||
var versions = []
|
||||
|
||||
var range = []
|
||||
|
||||
var inc = null
|
||||
|
||||
var version = require('../package.json').version
|
||||
|
||||
var loose = false
|
||||
|
||||
var includePrerelease = false
|
||||
|
||||
var coerce = false
|
||||
|
||||
var rtl = false
|
||||
|
||||
var identifier
|
||||
|
||||
var semver = require('../semver')
|
||||
|
||||
var reverse = false
|
||||
|
||||
var options = {}
|
||||
|
||||
main()
|
||||
|
||||
function main () {
|
||||
if (!argv.length) return help()
|
||||
while (argv.length) {
|
||||
var a = argv.shift()
|
||||
var indexOfEqualSign = a.indexOf('=')
|
||||
if (indexOfEqualSign !== -1) {
|
||||
a = a.slice(0, indexOfEqualSign)
|
||||
argv.unshift(a.slice(indexOfEqualSign + 1))
|
||||
}
|
||||
switch (a) {
|
||||
case '-rv': case '-rev': case '--rev': case '--reverse':
|
||||
reverse = true
|
||||
break
|
||||
case '-l': case '--loose':
|
||||
loose = true
|
||||
break
|
||||
case '-p': case '--include-prerelease':
|
||||
includePrerelease = true
|
||||
break
|
||||
case '-v': case '--version':
|
||||
versions.push(argv.shift())
|
||||
break
|
||||
case '-i': case '--inc': case '--increment':
|
||||
switch (argv[0]) {
|
||||
case 'major': case 'minor': case 'patch': case 'prerelease':
|
||||
case 'premajor': case 'preminor': case 'prepatch':
|
||||
inc = argv.shift()
|
||||
break
|
||||
default:
|
||||
inc = 'patch'
|
||||
break
|
||||
}
|
||||
break
|
||||
case '--preid':
|
||||
identifier = argv.shift()
|
||||
break
|
||||
case '-r': case '--range':
|
||||
range.push(argv.shift())
|
||||
break
|
||||
case '-c': case '--coerce':
|
||||
coerce = true
|
||||
break
|
||||
case '--rtl':
|
||||
rtl = true
|
||||
break
|
||||
case '--ltr':
|
||||
rtl = false
|
||||
break
|
||||
case '-h': case '--help': case '-?':
|
||||
return help()
|
||||
default:
|
||||
versions.push(a)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
|
||||
|
||||
versions = versions.map(function (v) {
|
||||
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
||||
}).filter(function (v) {
|
||||
return semver.valid(v)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
if (inc && (versions.length !== 1 || range.length)) { return failInc() }
|
||||
|
||||
for (var i = 0, l = range.length; i < l; i++) {
|
||||
versions = versions.filter(function (v) {
|
||||
return semver.satisfies(v, range[i], options)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
}
|
||||
return success(versions)
|
||||
}
|
||||
|
||||
function failInc () {
|
||||
console.error('--inc can only be used on a single version with no range')
|
||||
fail()
|
||||
}
|
||||
|
||||
function fail () { process.exit(1) }
|
||||
|
||||
function success () {
|
||||
var compare = reverse ? 'rcompare' : 'compare'
|
||||
versions.sort(function (a, b) {
|
||||
return semver[compare](a, b, options)
|
||||
}).map(function (v) {
|
||||
return semver.clean(v, options)
|
||||
}).map(function (v) {
|
||||
return inc ? semver.inc(v, inc, options, identifier) : v
|
||||
}).forEach(function (v, i, _) { console.log(v) })
|
||||
}
|
||||
|
||||
function help () {
|
||||
console.log(['SemVer ' + version,
|
||||
'',
|
||||
'A JavaScript implementation of the https://semver.org/ specification',
|
||||
'Copyright Isaac Z. Schlueter',
|
||||
'',
|
||||
'Usage: semver [options] <version> [<version> [...]]',
|
||||
'Prints valid versions sorted by SemVer precedence',
|
||||
'',
|
||||
'Options:',
|
||||
'-r --range <range>',
|
||||
' Print versions that match the specified range.',
|
||||
'',
|
||||
'-i --increment [<level>]',
|
||||
' Increment a version by the specified level. Level can',
|
||||
' be one of: major, minor, patch, premajor, preminor,',
|
||||
" prepatch, or prerelease. Default level is 'patch'.",
|
||||
' Only one version may be specified.',
|
||||
'',
|
||||
'--preid <identifier>',
|
||||
' Identifier to be used to prefix premajor, preminor,',
|
||||
' prepatch or prerelease version increments.',
|
||||
'',
|
||||
'-l --loose',
|
||||
' Interpret versions and ranges loosely',
|
||||
'',
|
||||
'-p --include-prerelease',
|
||||
' Always include prerelease versions in range matching',
|
||||
'',
|
||||
'-c --coerce',
|
||||
' Coerce a string into SemVer if possible',
|
||||
' (does not imply --loose)',
|
||||
'',
|
||||
'--rtl',
|
||||
' Coerce version strings right to left',
|
||||
'',
|
||||
'--ltr',
|
||||
' Coerce version strings left to right (default)',
|
||||
'',
|
||||
'Program exits successfully if any valid version satisfies',
|
||||
'all supplied ranges, and prints all satisfying versions.',
|
||||
'',
|
||||
'If no satisfying versions are found, then exits failure.',
|
||||
'',
|
||||
'Versions are printed in ascending order, so supplying',
|
||||
'multiple versions to the utility will just sort them.'
|
||||
].join('\n'))
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
{
|
||||
"name": "semver",
|
||||
"version": "6.3.1",
|
||||
"description": "The semantic version parser used by npm.",
|
||||
"main": "semver.js",
|
||||
"scripts": {
|
||||
"test": "tap test/ --100 --timeout=30",
|
||||
"lint": "echo linting disabled",
|
||||
"postlint": "template-oss-check",
|
||||
"template-oss-apply": "template-oss-apply --force",
|
||||
"lintfix": "npm run lint -- --fix",
|
||||
"snap": "tap test/ --100 --timeout=30",
|
||||
"posttest": "npm run lint"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@npmcli/template-oss": "4.17.0",
|
||||
"tap": "^12.7.0"
|
||||
},
|
||||
"license": "ISC",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/npm/node-semver.git"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "./bin/semver.js"
|
||||
},
|
||||
"files": [
|
||||
"bin",
|
||||
"range.bnf",
|
||||
"semver.js"
|
||||
],
|
||||
"author": "GitHub Inc.",
|
||||
"templateOSS": {
|
||||
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
|
||||
"content": "./scripts/template-oss",
|
||||
"version": "4.17.0"
|
||||
}
|
||||
}
|
||||
1643
backend/node_modules/@babel/helper-create-class-features-plugin/node_modules/semver/semver.js
generated
vendored
1643
backend/node_modules/@babel/helper-create-class-features-plugin/node_modules/semver/semver.js
generated
vendored
File diff suppressed because it is too large
Load diff
43
backend/node_modules/@babel/helper-create-class-features-plugin/package.json
generated
vendored
43
backend/node_modules/@babel/helper-create-class-features-plugin/package.json
generated
vendored
|
|
@ -1,43 +0,0 @@
|
|||
{
|
||||
"name": "@babel/helper-create-class-features-plugin",
|
||||
"version": "7.28.6",
|
||||
"author": "The Babel Team (https://babel.dev/team)",
|
||||
"license": "MIT",
|
||||
"description": "Compile class public and private fields, private methods and decorators to ES6",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-helper-create-class-features-plugin"
|
||||
},
|
||||
"main": "./lib/index.js",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"keywords": [
|
||||
"babel",
|
||||
"babel-plugin"
|
||||
],
|
||||
"dependencies": {
|
||||
"@babel/helper-annotate-as-pure": "^7.27.3",
|
||||
"@babel/helper-member-expression-to-functions": "^7.28.5",
|
||||
"@babel/helper-optimise-call-expression": "^7.27.1",
|
||||
"@babel/helper-replace-supers": "^7.28.6",
|
||||
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
|
||||
"@babel/traverse": "^7.28.6",
|
||||
"semver": "^6.3.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.28.6",
|
||||
"@babel/helper-plugin-test-runner": "^7.27.1",
|
||||
"@babel/preset-env": "^7.28.6",
|
||||
"@types/charcodes": "^0.2.0",
|
||||
"charcodes": "^0.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"type": "commonjs"
|
||||
}
|
||||
19
backend/node_modules/@babel/helper-create-regexp-features-plugin/README.md
generated
vendored
19
backend/node_modules/@babel/helper-create-regexp-features-plugin/README.md
generated
vendored
|
|
@ -1,19 +0,0 @@
|
|||
# @babel/helper-create-regexp-features-plugin
|
||||
|
||||
> Compile ESNext Regular Expressions to ES5
|
||||
|
||||
See our website [@babel/helper-create-regexp-features-plugin](https://babeljs.io/docs/babel-helper-create-regexp-features-plugin) for more information.
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save @babel/helper-create-regexp-features-plugin
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/helper-create-regexp-features-plugin
|
||||
```
|
||||
30
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/features.js
generated
vendored
30
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/features.js
generated
vendored
|
|
@ -1,30 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.FEATURES = void 0;
|
||||
exports.enableFeature = enableFeature;
|
||||
exports.featuresKey = void 0;
|
||||
exports.hasFeature = hasFeature;
|
||||
exports.runtimeKey = void 0;
|
||||
const FEATURES = exports.FEATURES = Object.freeze({
|
||||
unicodeFlag: 1 << 0,
|
||||
dotAllFlag: 1 << 1,
|
||||
unicodePropertyEscape: 1 << 2,
|
||||
namedCaptureGroups: 1 << 3,
|
||||
unicodeSetsFlag_syntax: 1 << 4,
|
||||
unicodeSetsFlag: 1 << 5,
|
||||
duplicateNamedCaptureGroups: 1 << 6,
|
||||
modifiers: 1 << 7
|
||||
});
|
||||
const featuresKey = exports.featuresKey = "@babel/plugin-regexp-features/featuresKey";
|
||||
const runtimeKey = exports.runtimeKey = "@babel/plugin-regexp-features/runtimeKey";
|
||||
function enableFeature(features, feature) {
|
||||
return features | feature;
|
||||
}
|
||||
function hasFeature(features, feature) {
|
||||
return !!(features & feature);
|
||||
}
|
||||
|
||||
//# sourceMappingURL=features.js.map
|
||||
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/features.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/features.js.map
generated
vendored
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"names":["FEATURES","exports","Object","freeze","unicodeFlag","dotAllFlag","unicodePropertyEscape","namedCaptureGroups","unicodeSetsFlag_syntax","unicodeSetsFlag","duplicateNamedCaptureGroups","modifiers","featuresKey","runtimeKey","enableFeature","features","feature","hasFeature"],"sources":["../src/features.ts"],"sourcesContent":["export const FEATURES = Object.freeze({\n unicodeFlag: 1 << 0,\n dotAllFlag: 1 << 1,\n unicodePropertyEscape: 1 << 2,\n namedCaptureGroups: 1 << 3,\n // Not used, for backward compatibility with syntax-unicode-sets-regex\n unicodeSetsFlag_syntax: 1 << 4,\n unicodeSetsFlag: 1 << 5,\n duplicateNamedCaptureGroups: 1 << 6,\n modifiers: 1 << 7,\n});\n\n// We can't use a symbol because this needs to always be the same, even if\n// this package isn't deduped by npm. e.g.\n// - node_modules/\n// - @babel/plugin-regexp-features\n// - @babel/plugin-transform-unicode-property-regex\n// - node_modules\n// - @babel-plugin-regexp-features\nexport const featuresKey = \"@babel/plugin-regexp-features/featuresKey\";\nexport const runtimeKey = \"@babel/plugin-regexp-features/runtimeKey\";\n\ntype FeatureType = (typeof FEATURES)[keyof typeof FEATURES];\n\nexport function enableFeature(features: number, feature: FeatureType): number {\n return features | feature;\n}\n\nexport function hasFeature(features: number, feature: FeatureType) {\n return !!(features & feature);\n}\n"],"mappings":";;;;;;;;;;AAAO,MAAMA,QAAQ,GAAAC,OAAA,CAAAD,QAAA,GAAGE,MAAM,CAACC,MAAM,CAAC;EACpCC,WAAW,EAAE,CAAC,IAAI,CAAC;EACnBC,UAAU,EAAE,CAAC,IAAI,CAAC;EAClBC,qBAAqB,EAAE,CAAC,IAAI,CAAC;EAC7BC,kBAAkB,EAAE,CAAC,IAAI,CAAC;EAE1BC,sBAAsB,EAAE,CAAC,IAAI,CAAC;EAC9BC,eAAe,EAAE,CAAC,IAAI,CAAC;EACvBC,2BAA2B,EAAE,CAAC,IAAI,CAAC;EACnCC,SAAS,EAAE,CAAC,IAAI;AAClB,CAAC,CAAC;AASK,MAAMC,WAAW,GAAAX,OAAA,CAAAW,WAAA,GAAG,2CAA2C;AAC/D,MAAMC,UAAU,GAAAZ,OAAA,CAAAY,UAAA,GAAG,0CAA0C;AAI7D,SAASC,aAAaA,CAACC,QAAgB,EAAEC,OAAoB,EAAU;EAC5E,OAAOD,QAAQ,GAAGC,OAAO;AAC3B;AAEO,SAASC,UAAUA,CAACF,QAAgB,EAAEC,OAAoB,EAAE;EACjE,OAAO,CAAC,EAAED,QAAQ,GAAGC,OAAO,CAAC;AAC/B","ignoreList":[]}
|
||||
116
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/index.js
generated
vendored
116
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/index.js
generated
vendored
|
|
@ -1,116 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.createRegExpFeaturePlugin = createRegExpFeaturePlugin;
|
||||
var _regexpuCore = require("regexpu-core");
|
||||
var _core = require("@babel/core");
|
||||
var _helperAnnotateAsPure = require("@babel/helper-annotate-as-pure");
|
||||
var _semver = require("semver");
|
||||
var _features = require("./features.js");
|
||||
var _util = require("./util.js");
|
||||
const versionKey = "@babel/plugin-regexp-features/version";
|
||||
function createRegExpFeaturePlugin({
|
||||
name,
|
||||
feature,
|
||||
options = {},
|
||||
manipulateOptions = () => {}
|
||||
}) {
|
||||
return {
|
||||
name,
|
||||
manipulateOptions,
|
||||
pre() {
|
||||
var _file$get;
|
||||
const {
|
||||
file
|
||||
} = this;
|
||||
const features = (_file$get = file.get(_features.featuresKey)) != null ? _file$get : 0;
|
||||
let newFeatures = (0, _features.enableFeature)(features, _features.FEATURES[feature]);
|
||||
const {
|
||||
useUnicodeFlag,
|
||||
runtime
|
||||
} = options;
|
||||
if (useUnicodeFlag === false) {
|
||||
newFeatures = (0, _features.enableFeature)(newFeatures, _features.FEATURES.unicodeFlag);
|
||||
}
|
||||
if (newFeatures !== features) {
|
||||
file.set(_features.featuresKey, newFeatures);
|
||||
}
|
||||
if (runtime !== undefined) {
|
||||
if (file.has(_features.runtimeKey) && file.get(_features.runtimeKey) !== runtime && (0, _features.hasFeature)(newFeatures, _features.FEATURES.duplicateNamedCaptureGroups)) {
|
||||
throw new Error(`The 'runtime' option must be the same for ` + `'@babel/plugin-transform-named-capturing-groups-regex' and ` + `'@babel/plugin-transform-duplicate-named-capturing-groups-regex'.`);
|
||||
}
|
||||
if (feature === "namedCaptureGroups") {
|
||||
if (!runtime || !file.has(_features.runtimeKey)) file.set(_features.runtimeKey, runtime);
|
||||
} else {
|
||||
file.set(_features.runtimeKey, runtime);
|
||||
}
|
||||
}
|
||||
{
|
||||
if (typeof file.get(versionKey) === "number") {
|
||||
file.set(versionKey, "7.28.5");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!file.get(versionKey) || _semver.lt(file.get(versionKey), "7.28.5")) {
|
||||
file.set(versionKey, "7.28.5");
|
||||
}
|
||||
},
|
||||
visitor: {
|
||||
RegExpLiteral(path) {
|
||||
var _file$get2;
|
||||
const {
|
||||
node
|
||||
} = path;
|
||||
const {
|
||||
file
|
||||
} = this;
|
||||
const features = file.get(_features.featuresKey);
|
||||
const runtime = (_file$get2 = file.get(_features.runtimeKey)) != null ? _file$get2 : true;
|
||||
const regexpuOptions = (0, _util.generateRegexpuOptions)(node.pattern, features);
|
||||
if ((0, _util.canSkipRegexpu)(node, regexpuOptions)) {
|
||||
return;
|
||||
}
|
||||
const namedCaptureGroups = {
|
||||
__proto__: null
|
||||
};
|
||||
if (regexpuOptions.namedGroups === "transform") {
|
||||
regexpuOptions.onNamedGroup = (name, index) => {
|
||||
const prev = namedCaptureGroups[name];
|
||||
if (typeof prev === "number") {
|
||||
namedCaptureGroups[name] = [prev, index];
|
||||
} else if (Array.isArray(prev)) {
|
||||
prev.push(index);
|
||||
} else {
|
||||
namedCaptureGroups[name] = index;
|
||||
}
|
||||
};
|
||||
}
|
||||
let newFlags;
|
||||
if (regexpuOptions.modifiers === "transform") {
|
||||
regexpuOptions.onNewFlags = flags => {
|
||||
newFlags = flags;
|
||||
};
|
||||
}
|
||||
node.pattern = _regexpuCore(node.pattern, node.flags, regexpuOptions);
|
||||
if (regexpuOptions.namedGroups === "transform" && Object.keys(namedCaptureGroups).length > 0 && runtime && !isRegExpTest(path)) {
|
||||
const call = _core.types.callExpression(this.addHelper("wrapRegExp"), [node, _core.types.valueToNode(namedCaptureGroups)]);
|
||||
(0, _helperAnnotateAsPure.default)(call);
|
||||
path.replaceWith(call);
|
||||
}
|
||||
node.flags = (0, _util.transformFlags)(regexpuOptions, newFlags != null ? newFlags : node.flags);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
function isRegExpTest(path) {
|
||||
return path.parentPath.isMemberExpression({
|
||||
object: path.node,
|
||||
computed: false
|
||||
}) && path.parentPath.get("property").isIdentifier({
|
||||
name: "test"
|
||||
});
|
||||
}
|
||||
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/index.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
71
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/util.js
generated
vendored
71
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/util.js
generated
vendored
|
|
@ -1,71 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.canSkipRegexpu = canSkipRegexpu;
|
||||
exports.generateRegexpuOptions = generateRegexpuOptions;
|
||||
exports.transformFlags = transformFlags;
|
||||
var _features = require("./features.js");
|
||||
function generateRegexpuOptions(pattern, toTransform) {
|
||||
const feat = name => {
|
||||
return (0, _features.hasFeature)(toTransform, _features.FEATURES[name]) ? "transform" : false;
|
||||
};
|
||||
const featDuplicateNamedGroups = () => {
|
||||
if (!feat("duplicateNamedCaptureGroups")) return false;
|
||||
const regex = /\(\?<([^>]+)(>|$)/g;
|
||||
const seen = new Set();
|
||||
for (let match; (match = regex.exec(pattern)) && match[2]; seen.add(match[1])) {
|
||||
if (seen.has(match[1])) return "transform";
|
||||
}
|
||||
return false;
|
||||
};
|
||||
return {
|
||||
unicodeFlag: feat("unicodeFlag"),
|
||||
unicodeSetsFlag: feat("unicodeSetsFlag"),
|
||||
dotAllFlag: feat("dotAllFlag"),
|
||||
unicodePropertyEscapes: feat("unicodePropertyEscape"),
|
||||
namedGroups: feat("namedCaptureGroups") || featDuplicateNamedGroups(),
|
||||
onNamedGroup: () => {},
|
||||
modifiers: feat("modifiers")
|
||||
};
|
||||
}
|
||||
function canSkipRegexpu(node, options) {
|
||||
const {
|
||||
flags,
|
||||
pattern
|
||||
} = node;
|
||||
if (flags.includes("v")) {
|
||||
if (options.unicodeSetsFlag === "transform") return false;
|
||||
}
|
||||
if (flags.includes("u")) {
|
||||
if (options.unicodeFlag === "transform") return false;
|
||||
if (options.unicodePropertyEscapes === "transform" && /\\p\{/i.test(pattern)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (flags.includes("s")) {
|
||||
if (options.dotAllFlag === "transform") return false;
|
||||
}
|
||||
if (options.namedGroups === "transform" && /\(\?<(?![=!])/.test(pattern)) {
|
||||
return false;
|
||||
}
|
||||
if (options.modifiers === "transform" && /\(\?[\w-]+:/.test(pattern)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function transformFlags(regexpuOptions, flags) {
|
||||
if (regexpuOptions.unicodeSetsFlag === "transform") {
|
||||
flags = flags.replace("v", "u");
|
||||
}
|
||||
if (regexpuOptions.unicodeFlag === "transform") {
|
||||
flags = flags.replace("u", "");
|
||||
}
|
||||
if (regexpuOptions.dotAllFlag === "transform") {
|
||||
flags = flags.replace("s", "");
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=util.js.map
|
||||
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/util.js.map
generated
vendored
1
backend/node_modules/@babel/helper-create-regexp-features-plugin/lib/util.js.map
generated
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
../semver/bin/semver.js
|
||||
|
|
@ -1,443 +0,0 @@
|
|||
semver(1) -- The semantic versioner for npm
|
||||
===========================================
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
npm install semver
|
||||
````
|
||||
|
||||
## Usage
|
||||
|
||||
As a node module:
|
||||
|
||||
```js
|
||||
const semver = require('semver')
|
||||
|
||||
semver.valid('1.2.3') // '1.2.3'
|
||||
semver.valid('a.b.c') // null
|
||||
semver.clean(' =v1.2.3 ') // '1.2.3'
|
||||
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
|
||||
semver.gt('1.2.3', '9.8.7') // false
|
||||
semver.lt('1.2.3', '9.8.7') // true
|
||||
semver.minVersion('>=1.0.0') // '1.0.0'
|
||||
semver.valid(semver.coerce('v2')) // '2.0.0'
|
||||
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
|
||||
```
|
||||
|
||||
As a command-line utility:
|
||||
|
||||
```
|
||||
$ semver -h
|
||||
|
||||
A JavaScript implementation of the https://semver.org/ specification
|
||||
Copyright Isaac Z. Schlueter
|
||||
|
||||
Usage: semver [options] <version> [<version> [...]]
|
||||
Prints valid versions sorted by SemVer precedence
|
||||
|
||||
Options:
|
||||
-r --range <range>
|
||||
Print versions that match the specified range.
|
||||
|
||||
-i --increment [<level>]
|
||||
Increment a version by the specified level. Level can
|
||||
be one of: major, minor, patch, premajor, preminor,
|
||||
prepatch, or prerelease. Default level is 'patch'.
|
||||
Only one version may be specified.
|
||||
|
||||
--preid <identifier>
|
||||
Identifier to be used to prefix premajor, preminor,
|
||||
prepatch or prerelease version increments.
|
||||
|
||||
-l --loose
|
||||
Interpret versions and ranges loosely
|
||||
|
||||
-p --include-prerelease
|
||||
Always include prerelease versions in range matching
|
||||
|
||||
-c --coerce
|
||||
Coerce a string into SemVer if possible
|
||||
(does not imply --loose)
|
||||
|
||||
--rtl
|
||||
Coerce version strings right to left
|
||||
|
||||
--ltr
|
||||
Coerce version strings left to right (default)
|
||||
|
||||
Program exits successfully if any valid version satisfies
|
||||
all supplied ranges, and prints all satisfying versions.
|
||||
|
||||
If no satisfying versions are found, then exits failure.
|
||||
|
||||
Versions are printed in ascending order, so supplying
|
||||
multiple versions to the utility will just sort them.
|
||||
```
|
||||
|
||||
## Versions
|
||||
|
||||
A "version" is described by the `v2.0.0` specification found at
|
||||
<https://semver.org/>.
|
||||
|
||||
A leading `"="` or `"v"` character is stripped off and ignored.
|
||||
|
||||
## Ranges
|
||||
|
||||
A `version range` is a set of `comparators` which specify versions
|
||||
that satisfy the range.
|
||||
|
||||
A `comparator` is composed of an `operator` and a `version`. The set
|
||||
of primitive `operators` is:
|
||||
|
||||
* `<` Less than
|
||||
* `<=` Less than or equal to
|
||||
* `>` Greater than
|
||||
* `>=` Greater than or equal to
|
||||
* `=` Equal. If no operator is specified, then equality is assumed,
|
||||
so this operator is optional, but MAY be included.
|
||||
|
||||
For example, the comparator `>=1.2.7` would match the versions
|
||||
`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
|
||||
or `1.1.0`.
|
||||
|
||||
Comparators can be joined by whitespace to form a `comparator set`,
|
||||
which is satisfied by the **intersection** of all of the comparators
|
||||
it includes.
|
||||
|
||||
A range is composed of one or more comparator sets, joined by `||`. A
|
||||
version matches a range if and only if every comparator in at least
|
||||
one of the `||`-separated comparator sets is satisfied by the version.
|
||||
|
||||
For example, the range `>=1.2.7 <1.3.0` would match the versions
|
||||
`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
|
||||
or `1.1.0`.
|
||||
|
||||
The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
|
||||
`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
|
||||
|
||||
### Prerelease Tags
|
||||
|
||||
If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
|
||||
it will only be allowed to satisfy comparator sets if at least one
|
||||
comparator with the same `[major, minor, patch]` tuple also has a
|
||||
prerelease tag.
|
||||
|
||||
For example, the range `>1.2.3-alpha.3` would be allowed to match the
|
||||
version `1.2.3-alpha.7`, but it would *not* be satisfied by
|
||||
`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
|
||||
than" `1.2.3-alpha.3` according to the SemVer sort rules. The version
|
||||
range only accepts prerelease tags on the `1.2.3` version. The
|
||||
version `3.4.5` *would* satisfy the range, because it does not have a
|
||||
prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
|
||||
|
||||
The purpose for this behavior is twofold. First, prerelease versions
|
||||
frequently are updated very quickly, and contain many breaking changes
|
||||
that are (by the author's design) not yet fit for public consumption.
|
||||
Therefore, by default, they are excluded from range matching
|
||||
semantics.
|
||||
|
||||
Second, a user who has opted into using a prerelease version has
|
||||
clearly indicated the intent to use *that specific* set of
|
||||
alpha/beta/rc versions. By including a prerelease tag in the range,
|
||||
the user is indicating that they are aware of the risk. However, it
|
||||
is still not appropriate to assume that they have opted into taking a
|
||||
similar risk on the *next* set of prerelease versions.
|
||||
|
||||
Note that this behavior can be suppressed (treating all prerelease
|
||||
versions as if they were normal versions, for the purpose of range
|
||||
matching) by setting the `includePrerelease` flag on the options
|
||||
object to any
|
||||
[functions](https://github.com/npm/node-semver#functions) that do
|
||||
range matching.
|
||||
|
||||
#### Prerelease Identifiers
|
||||
|
||||
The method `.inc` takes an additional `identifier` string argument that
|
||||
will append the value of the string as a prerelease identifier:
|
||||
|
||||
```javascript
|
||||
semver.inc('1.2.3', 'prerelease', 'beta')
|
||||
// '1.2.4-beta.0'
|
||||
```
|
||||
|
||||
command-line example:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.3 -i prerelease --preid beta
|
||||
1.2.4-beta.0
|
||||
```
|
||||
|
||||
Which then can be used to increment further:
|
||||
|
||||
```bash
|
||||
$ semver 1.2.4-beta.0 -i prerelease
|
||||
1.2.4-beta.1
|
||||
```
|
||||
|
||||
### Advanced Range Syntax
|
||||
|
||||
Advanced range syntax desugars to primitive comparators in
|
||||
deterministic ways.
|
||||
|
||||
Advanced ranges may be combined in the same way as primitive
|
||||
comparators using white space or `||`.
|
||||
|
||||
#### Hyphen Ranges `X.Y.Z - A.B.C`
|
||||
|
||||
Specifies an inclusive set.
|
||||
|
||||
* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the first version in the inclusive
|
||||
range, then the missing pieces are replaced with zeroes.
|
||||
|
||||
* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
|
||||
|
||||
If a partial version is provided as the second version in the
|
||||
inclusive range, then all versions that start with the supplied parts
|
||||
of the tuple are accepted, but nothing that would be greater than the
|
||||
provided tuple parts.
|
||||
|
||||
* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
|
||||
* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
|
||||
|
||||
#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
|
||||
|
||||
Any of `X`, `x`, or `*` may be used to "stand in" for one of the
|
||||
numeric values in the `[major, minor, patch]` tuple.
|
||||
|
||||
* `*` := `>=0.0.0` (Any version satisfies)
|
||||
* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
|
||||
* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
|
||||
|
||||
A partial version range is treated as an X-Range, so the special
|
||||
character is in fact optional.
|
||||
|
||||
* `""` (empty string) := `*` := `>=0.0.0`
|
||||
* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
|
||||
* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
|
||||
|
||||
#### Tilde Ranges `~1.2.3` `~1.2` `~1`
|
||||
|
||||
Allows patch-level changes if a minor version is specified on the
|
||||
comparator. Allows minor-level changes if not.
|
||||
|
||||
* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
|
||||
* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
|
||||
* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
|
||||
* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
|
||||
* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
|
||||
* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
|
||||
* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
|
||||
#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
|
||||
|
||||
Allows changes that do not modify the left-most non-zero element in the
|
||||
`[major, minor, patch]` tuple. In other words, this allows patch and
|
||||
minor updates for versions `1.0.0` and above, patch updates for
|
||||
versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
|
||||
|
||||
Many authors treat a `0.x` version as if the `x` were the major
|
||||
"breaking-change" indicator.
|
||||
|
||||
Caret ranges are ideal when an author may make breaking changes
|
||||
between `0.2.4` and `0.3.0` releases, which is a common practice.
|
||||
However, it presumes that there will *not* be breaking changes between
|
||||
`0.2.4` and `0.2.5`. It allows for changes that are presumed to be
|
||||
additive (but non-breaking), according to commonly observed practices.
|
||||
|
||||
* `^1.2.3` := `>=1.2.3 <2.0.0`
|
||||
* `^0.2.3` := `>=0.2.3 <0.3.0`
|
||||
* `^0.0.3` := `>=0.0.3 <0.0.4`
|
||||
* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
|
||||
the `1.2.3` version will be allowed, if they are greater than or
|
||||
equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but
|
||||
`1.2.4-beta.2` would not, because it is a prerelease of a
|
||||
different `[major, minor, patch]` tuple.
|
||||
* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the
|
||||
`0.0.3` version *only* will be allowed, if they are greater than or
|
||||
equal to `beta`. So, `0.0.3-pr.2` would be allowed.
|
||||
|
||||
When parsing caret ranges, a missing `patch` value desugars to the
|
||||
number `0`, but will allow flexibility within that value, even if the
|
||||
major and minor versions are both `0`.
|
||||
|
||||
* `^1.2.x` := `>=1.2.0 <2.0.0`
|
||||
* `^0.0.x` := `>=0.0.0 <0.1.0`
|
||||
* `^0.0` := `>=0.0.0 <0.1.0`
|
||||
|
||||
A missing `minor` and `patch` values will desugar to zero, but also
|
||||
allow flexibility within those values, even if the major version is
|
||||
zero.
|
||||
|
||||
* `^1.x` := `>=1.0.0 <2.0.0`
|
||||
* `^0.x` := `>=0.0.0 <1.0.0`
|
||||
|
||||
### Range Grammar
|
||||
|
||||
Putting all this together, here is a Backus-Naur grammar for ranges,
|
||||
for the benefit of parser authors:
|
||||
|
||||
```bnf
|
||||
range-set ::= range ( logical-or range ) *
|
||||
logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
||||
range ::= hyphen | simple ( ' ' simple ) * | ''
|
||||
hyphen ::= partial ' - ' partial
|
||||
simple ::= primitive | partial | tilde | caret
|
||||
primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
||||
partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
||||
xr ::= 'x' | 'X' | '*' | nr
|
||||
nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
||||
tilde ::= '~' partial
|
||||
caret ::= '^' partial
|
||||
qualifier ::= ( '-' pre )? ( '+' build )?
|
||||
pre ::= parts
|
||||
build ::= parts
|
||||
parts ::= part ( '.' part ) *
|
||||
part ::= nr | [-0-9A-Za-z]+
|
||||
```
|
||||
|
||||
## Functions
|
||||
|
||||
All methods and classes take a final `options` object argument. All
|
||||
options in this object are `false` by default. The options supported
|
||||
are:
|
||||
|
||||
- `loose` Be more forgiving about not-quite-valid semver strings.
|
||||
(Any resulting output will always be 100% strict compliant, of
|
||||
course.) For backwards compatibility reasons, if the `options`
|
||||
argument is a boolean value instead of an object, it is interpreted
|
||||
to be the `loose` param.
|
||||
- `includePrerelease` Set to suppress the [default
|
||||
behavior](https://github.com/npm/node-semver#prerelease-tags) of
|
||||
excluding prerelease tagged versions from ranges unless they are
|
||||
explicitly opted into.
|
||||
|
||||
Strict-mode Comparators and Ranges will be strict about the SemVer
|
||||
strings that they parse.
|
||||
|
||||
* `valid(v)`: Return the parsed version, or null if it's not valid.
|
||||
* `inc(v, release)`: Return the version incremented by the release
|
||||
type (`major`, `premajor`, `minor`, `preminor`, `patch`,
|
||||
`prepatch`, or `prerelease`), or null if it's not valid
|
||||
* `premajor` in one call will bump the version up to the next major
|
||||
version and down to a prerelease of that major version.
|
||||
`preminor`, and `prepatch` work the same way.
|
||||
* If called from a non-prerelease version, the `prerelease` will work the
|
||||
same as `prepatch`. It increments the patch version, then makes a
|
||||
prerelease. If the input version is already a prerelease it simply
|
||||
increments it.
|
||||
* `prerelease(v)`: Returns an array of prerelease components, or null
|
||||
if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
|
||||
* `major(v)`: Return the major version number.
|
||||
* `minor(v)`: Return the minor version number.
|
||||
* `patch(v)`: Return the patch version number.
|
||||
* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
|
||||
or comparators intersect.
|
||||
* `parse(v)`: Attempt to parse a string as a semantic version, returning either
|
||||
a `SemVer` object or `null`.
|
||||
|
||||
### Comparison
|
||||
|
||||
* `gt(v1, v2)`: `v1 > v2`
|
||||
* `gte(v1, v2)`: `v1 >= v2`
|
||||
* `lt(v1, v2)`: `v1 < v2`
|
||||
* `lte(v1, v2)`: `v1 <= v2`
|
||||
* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
|
||||
even if they're not the exact same string. You already know how to
|
||||
compare strings.
|
||||
* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
|
||||
* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
|
||||
the corresponding function above. `"==="` and `"!=="` do simple
|
||||
string comparison, but are included for completeness. Throws if an
|
||||
invalid comparison string is provided.
|
||||
* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions
|
||||
in descending order when passed to `Array.sort()`.
|
||||
* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
|
||||
are equal. Sorts in ascending order if passed to `Array.sort()`.
|
||||
`v2` is greater. Sorts in ascending order if passed to `Array.sort()`.
|
||||
* `diff(v1, v2)`: Returns difference between two versions by the release type
|
||||
(`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
|
||||
or null if the versions are the same.
|
||||
|
||||
### Comparators
|
||||
|
||||
* `intersects(comparator)`: Return true if the comparators intersect
|
||||
|
||||
### Ranges
|
||||
|
||||
* `validRange(range)`: Return the valid range or null if it's not valid
|
||||
* `satisfies(version, range)`: Return true if the version satisfies the
|
||||
range.
|
||||
* `maxSatisfying(versions, range)`: Return the highest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minSatisfying(versions, range)`: Return the lowest version in the list
|
||||
that satisfies the range, or `null` if none of them do.
|
||||
* `minVersion(range)`: Return the lowest version that can possibly match
|
||||
the given range.
|
||||
* `gtr(version, range)`: Return `true` if version is greater than all the
|
||||
versions possible in the range.
|
||||
* `ltr(version, range)`: Return `true` if version is less than all the
|
||||
versions possible in the range.
|
||||
* `outside(version, range, hilo)`: Return true if the version is outside
|
||||
the bounds of the range in either the high or low direction. The
|
||||
`hilo` argument must be either the string `'>'` or `'<'`. (This is
|
||||
the function called by `gtr` and `ltr`.)
|
||||
* `intersects(range)`: Return true if any of the ranges comparators intersect
|
||||
|
||||
Note that, since ranges may be non-contiguous, a version might not be
|
||||
greater than a range, less than a range, *or* satisfy a range! For
|
||||
example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
|
||||
until `2.0.0`, so the version `1.2.10` would not be greater than the
|
||||
range (because `2.0.1` satisfies, which is higher), nor less than the
|
||||
range (since `1.2.8` satisfies, which is lower), and it also does not
|
||||
satisfy the range.
|
||||
|
||||
If you want to know if a version satisfies or does not satisfy a
|
||||
range, use the `satisfies(version, range)` function.
|
||||
|
||||
### Coercion
|
||||
|
||||
* `coerce(version, options)`: Coerces a string to semver if possible
|
||||
|
||||
This aims to provide a very forgiving translation of a non-semver string to
|
||||
semver. It looks for the first digit in a string, and consumes all
|
||||
remaining characters which satisfy at least a partial semver (e.g., `1`,
|
||||
`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer
|
||||
versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All
|
||||
surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
|
||||
`3.4.0`). Only text which lacks digits will fail coercion (`version one`
|
||||
is not valid). The maximum length for any semver component considered for
|
||||
coercion is 16 characters; longer components will be ignored
|
||||
(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any
|
||||
semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
|
||||
components are invalid (`9999999999999999.4.7.4` is likely invalid).
|
||||
|
||||
If the `options.rtl` flag is set, then `coerce` will return the right-most
|
||||
coercible tuple that does not share an ending index with a longer coercible
|
||||
tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
|
||||
`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
|
||||
any other overlapping SemVer tuple.
|
||||
|
||||
### Clean
|
||||
|
||||
* `clean(version)`: Clean a string to be a valid semver if possible
|
||||
|
||||
This will return a cleaned and trimmed semver version. If the provided version is not valid a null will be returned. This does not work for ranges.
|
||||
|
||||
ex.
|
||||
* `s.clean(' = v 2.1.5foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean(' = v 2.1.5-foo')`: `null`
|
||||
* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
|
||||
* `s.clean('=v2.1.5')`: `'2.1.5'`
|
||||
* `s.clean(' =v2.1.5')`: `2.1.5`
|
||||
* `s.clean(' 2.1.5 ')`: `'2.1.5'`
|
||||
* `s.clean('~1.0.0')`: `null`
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
// Standalone semver comparison program.
|
||||
// Exits successfully and prints matching version(s) if
|
||||
// any supplied version is valid and passes all tests.
|
||||
|
||||
var argv = process.argv.slice(2)
|
||||
|
||||
var versions = []
|
||||
|
||||
var range = []
|
||||
|
||||
var inc = null
|
||||
|
||||
var version = require('../package.json').version
|
||||
|
||||
var loose = false
|
||||
|
||||
var includePrerelease = false
|
||||
|
||||
var coerce = false
|
||||
|
||||
var rtl = false
|
||||
|
||||
var identifier
|
||||
|
||||
var semver = require('../semver')
|
||||
|
||||
var reverse = false
|
||||
|
||||
var options = {}
|
||||
|
||||
main()
|
||||
|
||||
function main () {
|
||||
if (!argv.length) return help()
|
||||
while (argv.length) {
|
||||
var a = argv.shift()
|
||||
var indexOfEqualSign = a.indexOf('=')
|
||||
if (indexOfEqualSign !== -1) {
|
||||
a = a.slice(0, indexOfEqualSign)
|
||||
argv.unshift(a.slice(indexOfEqualSign + 1))
|
||||
}
|
||||
switch (a) {
|
||||
case '-rv': case '-rev': case '--rev': case '--reverse':
|
||||
reverse = true
|
||||
break
|
||||
case '-l': case '--loose':
|
||||
loose = true
|
||||
break
|
||||
case '-p': case '--include-prerelease':
|
||||
includePrerelease = true
|
||||
break
|
||||
case '-v': case '--version':
|
||||
versions.push(argv.shift())
|
||||
break
|
||||
case '-i': case '--inc': case '--increment':
|
||||
switch (argv[0]) {
|
||||
case 'major': case 'minor': case 'patch': case 'prerelease':
|
||||
case 'premajor': case 'preminor': case 'prepatch':
|
||||
inc = argv.shift()
|
||||
break
|
||||
default:
|
||||
inc = 'patch'
|
||||
break
|
||||
}
|
||||
break
|
||||
case '--preid':
|
||||
identifier = argv.shift()
|
||||
break
|
||||
case '-r': case '--range':
|
||||
range.push(argv.shift())
|
||||
break
|
||||
case '-c': case '--coerce':
|
||||
coerce = true
|
||||
break
|
||||
case '--rtl':
|
||||
rtl = true
|
||||
break
|
||||
case '--ltr':
|
||||
rtl = false
|
||||
break
|
||||
case '-h': case '--help': case '-?':
|
||||
return help()
|
||||
default:
|
||||
versions.push(a)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl }
|
||||
|
||||
versions = versions.map(function (v) {
|
||||
return coerce ? (semver.coerce(v, options) || { version: v }).version : v
|
||||
}).filter(function (v) {
|
||||
return semver.valid(v)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
if (inc && (versions.length !== 1 || range.length)) { return failInc() }
|
||||
|
||||
for (var i = 0, l = range.length; i < l; i++) {
|
||||
versions = versions.filter(function (v) {
|
||||
return semver.satisfies(v, range[i], options)
|
||||
})
|
||||
if (!versions.length) return fail()
|
||||
}
|
||||
return success(versions)
|
||||
}
|
||||
|
||||
function failInc () {
|
||||
console.error('--inc can only be used on a single version with no range')
|
||||
fail()
|
||||
}
|
||||
|
||||
function fail () { process.exit(1) }
|
||||
|
||||
function success () {
|
||||
var compare = reverse ? 'rcompare' : 'compare'
|
||||
versions.sort(function (a, b) {
|
||||
return semver[compare](a, b, options)
|
||||
}).map(function (v) {
|
||||
return semver.clean(v, options)
|
||||
}).map(function (v) {
|
||||
return inc ? semver.inc(v, inc, options, identifier) : v
|
||||
}).forEach(function (v, i, _) { console.log(v) })
|
||||
}
|
||||
|
||||
function help () {
|
||||
console.log(['SemVer ' + version,
|
||||
'',
|
||||
'A JavaScript implementation of the https://semver.org/ specification',
|
||||
'Copyright Isaac Z. Schlueter',
|
||||
'',
|
||||
'Usage: semver [options] <version> [<version> [...]]',
|
||||
'Prints valid versions sorted by SemVer precedence',
|
||||
'',
|
||||
'Options:',
|
||||
'-r --range <range>',
|
||||
' Print versions that match the specified range.',
|
||||
'',
|
||||
'-i --increment [<level>]',
|
||||
' Increment a version by the specified level. Level can',
|
||||
' be one of: major, minor, patch, premajor, preminor,',
|
||||
" prepatch, or prerelease. Default level is 'patch'.",
|
||||
' Only one version may be specified.',
|
||||
'',
|
||||
'--preid <identifier>',
|
||||
' Identifier to be used to prefix premajor, preminor,',
|
||||
' prepatch or prerelease version increments.',
|
||||
'',
|
||||
'-l --loose',
|
||||
' Interpret versions and ranges loosely',
|
||||
'',
|
||||
'-p --include-prerelease',
|
||||
' Always include prerelease versions in range matching',
|
||||
'',
|
||||
'-c --coerce',
|
||||
' Coerce a string into SemVer if possible',
|
||||
' (does not imply --loose)',
|
||||
'',
|
||||
'--rtl',
|
||||
' Coerce version strings right to left',
|
||||
'',
|
||||
'--ltr',
|
||||
' Coerce version strings left to right (default)',
|
||||
'',
|
||||
'Program exits successfully if any valid version satisfies',
|
||||
'all supplied ranges, and prints all satisfying versions.',
|
||||
'',
|
||||
'If no satisfying versions are found, then exits failure.',
|
||||
'',
|
||||
'Versions are printed in ascending order, so supplying',
|
||||
'multiple versions to the utility will just sort them.'
|
||||
].join('\n'))
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
{
|
||||
"name": "semver",
|
||||
"version": "6.3.1",
|
||||
"description": "The semantic version parser used by npm.",
|
||||
"main": "semver.js",
|
||||
"scripts": {
|
||||
"test": "tap test/ --100 --timeout=30",
|
||||
"lint": "echo linting disabled",
|
||||
"postlint": "template-oss-check",
|
||||
"template-oss-apply": "template-oss-apply --force",
|
||||
"lintfix": "npm run lint -- --fix",
|
||||
"snap": "tap test/ --100 --timeout=30",
|
||||
"posttest": "npm run lint"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@npmcli/template-oss": "4.17.0",
|
||||
"tap": "^12.7.0"
|
||||
},
|
||||
"license": "ISC",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/npm/node-semver.git"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "./bin/semver.js"
|
||||
},
|
||||
"files": [
|
||||
"bin",
|
||||
"range.bnf",
|
||||
"semver.js"
|
||||
],
|
||||
"author": "GitHub Inc.",
|
||||
"templateOSS": {
|
||||
"//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
|
||||
"content": "./scripts/template-oss",
|
||||
"version": "4.17.0"
|
||||
}
|
||||
}
|
||||
1643
backend/node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver/semver.js
generated
vendored
1643
backend/node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver/semver.js
generated
vendored
File diff suppressed because it is too large
Load diff
36
backend/node_modules/@babel/helper-create-regexp-features-plugin/package.json
generated
vendored
36
backend/node_modules/@babel/helper-create-regexp-features-plugin/package.json
generated
vendored
|
|
@ -1,36 +0,0 @@
|
|||
{
|
||||
"name": "@babel/helper-create-regexp-features-plugin",
|
||||
"version": "7.28.5",
|
||||
"author": "The Babel Team (https://babel.dev/team)",
|
||||
"license": "MIT",
|
||||
"description": "Compile ESNext Regular Expressions to ES5",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/babel/babel.git",
|
||||
"directory": "packages/babel-helper-create-regexp-features-plugin"
|
||||
},
|
||||
"main": "./lib/index.js",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"keywords": [
|
||||
"babel",
|
||||
"babel-plugin"
|
||||
],
|
||||
"dependencies": {
|
||||
"@babel/helper-annotate-as-pure": "^7.27.3",
|
||||
"regexpu-core": "^6.3.1",
|
||||
"semver": "^6.3.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@babel/core": "^7.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.28.5",
|
||||
"@babel/helper-plugin-test-runner": "^7.27.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
},
|
||||
"type": "commonjs"
|
||||
}
|
||||
22
backend/node_modules/@babel/helper-define-polyfill-provider/LICENSE
generated
vendored
22
backend/node_modules/@babel/helper-define-polyfill-provider/LICENSE
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2014-present Nicolò Ribaudo and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
15
backend/node_modules/@babel/helper-define-polyfill-provider/README.md
generated
vendored
15
backend/node_modules/@babel/helper-define-polyfill-provider/README.md
generated
vendored
|
|
@ -1,15 +0,0 @@
|
|||
# @babel/helper-define-polyfill-provider
|
||||
|
||||
## Install
|
||||
|
||||
Using npm:
|
||||
|
||||
```sh
|
||||
npm install --save-dev @babel/helper-define-polyfill-provider
|
||||
```
|
||||
|
||||
or using yarn:
|
||||
|
||||
```sh
|
||||
yarn add @babel/helper-define-polyfill-provider --dev
|
||||
```
|
||||
1052
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs
generated
vendored
1052
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.browser.mjs
generated
vendored
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
1096
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs
generated
vendored
1096
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs
generated
vendored
File diff suppressed because it is too large
Load diff
1
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs.map
generated
vendored
1
backend/node_modules/@babel/helper-define-polyfill-provider/esm/index.node.mjs.map
generated
vendored
File diff suppressed because one or more lines are too long
22
backend/node_modules/@babel/helper-define-polyfill-provider/lib/browser/dependencies.js
generated
vendored
22
backend/node_modules/@babel/helper-define-polyfill-provider/lib/browser/dependencies.js
generated
vendored
|
|
@ -1,22 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.has = has;
|
||||
exports.laterLogMissing = laterLogMissing;
|
||||
exports.logMissing = logMissing;
|
||||
exports.resolve = resolve;
|
||||
function resolve(dirname, moduleName, absoluteImports) {
|
||||
if (absoluteImports === false) return moduleName;
|
||||
throw new Error(`"absoluteImports" is not supported in bundles prepared for the browser.`);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function has(basedir, name) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function logMissing(missingDeps) {}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function laterLogMissing(missingDeps) {}
|
||||
14
backend/node_modules/@babel/helper-define-polyfill-provider/lib/debug-utils.js
generated
vendored
14
backend/node_modules/@babel/helper-define-polyfill-provider/lib/debug-utils.js
generated
vendored
|
|
@ -1,14 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.presetEnvSilentDebugHeader = void 0;
|
||||
exports.stringifyTargets = stringifyTargets;
|
||||
exports.stringifyTargetsMultiline = stringifyTargetsMultiline;
|
||||
var _helperCompilationTargets = require("@babel/helper-compilation-targets");
|
||||
const presetEnvSilentDebugHeader = exports.presetEnvSilentDebugHeader = "#__secret_key__@babel/preset-env__don't_log_debug_header_and_resolved_targets";
|
||||
function stringifyTargetsMultiline(targets) {
|
||||
return JSON.stringify((0, _helperCompilationTargets.prettifyTargets)(targets), null, 2);
|
||||
}
|
||||
function stringifyTargets(targets) {
|
||||
return JSON.stringify(targets).replace(/,/g, ", ").replace(/^\{"/, '{ "').replace(/"\}$/, '" }');
|
||||
}
|
||||
9
backend/node_modules/@babel/helper-define-polyfill-provider/lib/define-provider.js
generated
vendored
9
backend/node_modules/@babel/helper-define-polyfill-provider/lib/define-provider.js
generated
vendored
|
|
@ -1,9 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.defineProvider = defineProvider;
|
||||
function defineProvider(factory) {
|
||||
// This will allow us to do some things
|
||||
|
||||
return factory;
|
||||
}
|
||||
106
backend/node_modules/@babel/helper-define-polyfill-provider/lib/imports-injector.js
generated
vendored
106
backend/node_modules/@babel/helper-define-polyfill-provider/lib/imports-injector.js
generated
vendored
|
|
@ -1,106 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.default = void 0;
|
||||
var _babel = _interopRequireWildcard(require("@babel/core"));
|
||||
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
||||
const {
|
||||
types: t
|
||||
} = _babel.default || _babel;
|
||||
class ImportsCachedInjector {
|
||||
constructor(resolver, getPreferredIndex) {
|
||||
this._imports = new WeakMap();
|
||||
this._anonymousImports = new WeakMap();
|
||||
this._lastImports = new WeakMap();
|
||||
this._resolver = resolver;
|
||||
this._getPreferredIndex = getPreferredIndex;
|
||||
}
|
||||
storeAnonymous(programPath, url, moduleName, getVal) {
|
||||
const key = this._normalizeKey(programPath, url);
|
||||
const imports = this._ensure(this._anonymousImports, programPath, Set);
|
||||
if (imports.has(key)) return;
|
||||
const node = getVal(programPath.node.sourceType === "script", t.stringLiteral(this._resolver(url)));
|
||||
imports.add(key);
|
||||
this._injectImport(programPath, node, moduleName);
|
||||
}
|
||||
storeNamed(programPath, url, name, moduleName, getVal) {
|
||||
const key = this._normalizeKey(programPath, url, name);
|
||||
const imports = this._ensure(this._imports, programPath, Map);
|
||||
if (!imports.has(key)) {
|
||||
const {
|
||||
node,
|
||||
name: id
|
||||
} = getVal(programPath.node.sourceType === "script", t.stringLiteral(this._resolver(url)), t.identifier(name));
|
||||
imports.set(key, id);
|
||||
this._injectImport(programPath, node, moduleName);
|
||||
}
|
||||
return t.identifier(imports.get(key));
|
||||
}
|
||||
_injectImport(programPath, node, moduleName) {
|
||||
var _this$_lastImports$ge;
|
||||
const newIndex = this._getPreferredIndex(moduleName);
|
||||
const lastImports = (_this$_lastImports$ge = this._lastImports.get(programPath)) != null ? _this$_lastImports$ge : [];
|
||||
const isPathStillValid = path => path.node &&
|
||||
// Sometimes the AST is modified and the "last import"
|
||||
// we have has been replaced
|
||||
path.parent === programPath.node && path.container === programPath.node.body;
|
||||
let last;
|
||||
if (newIndex === Infinity) {
|
||||
// Fast path: we can always just insert at the end if newIndex is `Infinity`
|
||||
if (lastImports.length > 0) {
|
||||
last = lastImports[lastImports.length - 1].path;
|
||||
if (!isPathStillValid(last)) last = undefined;
|
||||
}
|
||||
} else {
|
||||
for (const [i, data] of lastImports.entries()) {
|
||||
const {
|
||||
path,
|
||||
index
|
||||
} = data;
|
||||
if (isPathStillValid(path)) {
|
||||
if (newIndex < index) {
|
||||
const [newPath] = path.insertBefore(node);
|
||||
lastImports.splice(i, 0, {
|
||||
path: newPath,
|
||||
index: newIndex
|
||||
});
|
||||
return;
|
||||
}
|
||||
last = path;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (last) {
|
||||
const [newPath] = last.insertAfter(node);
|
||||
lastImports.push({
|
||||
path: newPath,
|
||||
index: newIndex
|
||||
});
|
||||
} else {
|
||||
const [newPath] = programPath.unshiftContainer("body", [node]);
|
||||
this._lastImports.set(programPath, [{
|
||||
path: newPath,
|
||||
index: newIndex
|
||||
}]);
|
||||
}
|
||||
}
|
||||
_ensure(map, programPath, Collection) {
|
||||
let collection = map.get(programPath);
|
||||
if (!collection) {
|
||||
collection = new Collection();
|
||||
map.set(programPath, collection);
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
_normalizeKey(programPath, url, name = "") {
|
||||
const {
|
||||
sourceType
|
||||
} = programPath.node;
|
||||
|
||||
// If we rely on the imported binding (the "name" parameter), we also need to cache
|
||||
// based on the sourceType. This is because the module transforms change the names
|
||||
// of the import variables.
|
||||
return `${name && sourceType}::${url}::${name}`;
|
||||
}
|
||||
}
|
||||
exports.default = ImportsCachedInjector;
|
||||
288
backend/node_modules/@babel/helper-define-polyfill-provider/lib/index.js
generated
vendored
288
backend/node_modules/@babel/helper-define-polyfill-provider/lib/index.js
generated
vendored
|
|
@ -1,288 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.default = definePolyfillProvider;
|
||||
var _helperPluginUtils = require("@babel/helper-plugin-utils");
|
||||
var _helperCompilationTargets = _interopRequireWildcard(require("@babel/helper-compilation-targets"));
|
||||
var _utils = require("./utils");
|
||||
var _importsInjector = _interopRequireDefault(require("./imports-injector"));
|
||||
var _debugUtils = require("./debug-utils");
|
||||
var _normalizeOptions = require("./normalize-options");
|
||||
var v = _interopRequireWildcard(require("./visitors"));
|
||||
var deps = _interopRequireWildcard(require("./node/dependencies"));
|
||||
var _metaResolver = _interopRequireDefault(require("./meta-resolver"));
|
||||
const _excluded = ["method", "targets", "ignoreBrowserslistConfig", "configPath", "debug", "shouldInjectPolyfill", "absoluteImports"];
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
||||
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
||||
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
||||
const getTargets = _helperCompilationTargets.default.default || _helperCompilationTargets.default;
|
||||
function resolveOptions(options, babelApi) {
|
||||
const {
|
||||
method,
|
||||
targets: targetsOption,
|
||||
ignoreBrowserslistConfig,
|
||||
configPath,
|
||||
debug,
|
||||
shouldInjectPolyfill,
|
||||
absoluteImports
|
||||
} = options,
|
||||
providerOptions = _objectWithoutPropertiesLoose(options, _excluded);
|
||||
if (isEmpty(options)) {
|
||||
throw new Error(`\
|
||||
This plugin requires options, for example:
|
||||
{
|
||||
"plugins": [
|
||||
["<plugin name>", { method: "usage-pure" }]
|
||||
]
|
||||
}
|
||||
|
||||
See more options at https://github.com/babel/babel-polyfills/blob/main/docs/usage.md`);
|
||||
}
|
||||
let methodName;
|
||||
if (method === "usage-global") methodName = "usageGlobal";else if (method === "entry-global") methodName = "entryGlobal";else if (method === "usage-pure") methodName = "usagePure";else if (typeof method !== "string") {
|
||||
throw new Error(".method must be a string");
|
||||
} else {
|
||||
throw new Error(`.method must be one of "entry-global", "usage-global"` + ` or "usage-pure" (received ${JSON.stringify(method)})`);
|
||||
}
|
||||
if (typeof shouldInjectPolyfill === "function") {
|
||||
if (options.include || options.exclude) {
|
||||
throw new Error(`.include and .exclude are not supported when using the` + ` .shouldInjectPolyfill function.`);
|
||||
}
|
||||
} else if (shouldInjectPolyfill != null) {
|
||||
throw new Error(`.shouldInjectPolyfill must be a function, or undefined` + ` (received ${JSON.stringify(shouldInjectPolyfill)})`);
|
||||
}
|
||||
if (absoluteImports != null && typeof absoluteImports !== "boolean" && typeof absoluteImports !== "string") {
|
||||
throw new Error(`.absoluteImports must be a boolean, a string, or undefined` + ` (received ${JSON.stringify(absoluteImports)})`);
|
||||
}
|
||||
let targets;
|
||||
if (
|
||||
// If any browserslist-related option is specified, fallback to the old
|
||||
// behavior of not using the targets specified in the top-level options.
|
||||
targetsOption || configPath || ignoreBrowserslistConfig) {
|
||||
const targetsObj = typeof targetsOption === "string" || Array.isArray(targetsOption) ? {
|
||||
browsers: targetsOption
|
||||
} : targetsOption;
|
||||
targets = getTargets(targetsObj, {
|
||||
ignoreBrowserslistConfig,
|
||||
configPath
|
||||
});
|
||||
} else {
|
||||
targets = babelApi.targets();
|
||||
}
|
||||
return {
|
||||
method,
|
||||
methodName,
|
||||
targets,
|
||||
absoluteImports: absoluteImports != null ? absoluteImports : false,
|
||||
shouldInjectPolyfill,
|
||||
debug: !!debug,
|
||||
providerOptions: providerOptions
|
||||
};
|
||||
}
|
||||
function instantiateProvider(factory, options, missingDependencies, dirname, debugLog, babelApi) {
|
||||
const {
|
||||
method,
|
||||
methodName,
|
||||
targets,
|
||||
debug,
|
||||
shouldInjectPolyfill,
|
||||
providerOptions,
|
||||
absoluteImports
|
||||
} = resolveOptions(options, babelApi);
|
||||
|
||||
// eslint-disable-next-line prefer-const
|
||||
let include, exclude;
|
||||
let polyfillsSupport;
|
||||
let polyfillsNames;
|
||||
let filterPolyfills;
|
||||
const getUtils = (0, _utils.createUtilsGetter)(new _importsInjector.default(moduleName => deps.resolve(dirname, moduleName, absoluteImports), name => {
|
||||
var _polyfillsNames$get, _polyfillsNames;
|
||||
return (_polyfillsNames$get = (_polyfillsNames = polyfillsNames) == null ? void 0 : _polyfillsNames.get(name)) != null ? _polyfillsNames$get : Infinity;
|
||||
}));
|
||||
const depsCache = new Map();
|
||||
const api = {
|
||||
babel: babelApi,
|
||||
getUtils,
|
||||
method: options.method,
|
||||
targets,
|
||||
createMetaResolver: _metaResolver.default,
|
||||
shouldInjectPolyfill(name) {
|
||||
if (polyfillsNames === undefined) {
|
||||
throw new Error(`Internal error in the ${factory.name} provider: ` + `shouldInjectPolyfill() can't be called during initialization.`);
|
||||
}
|
||||
if (!polyfillsNames.has(name)) {
|
||||
console.warn(`Internal error in the ${providerName} provider: ` + `unknown polyfill "${name}".`);
|
||||
}
|
||||
if (filterPolyfills && !filterPolyfills(name)) return false;
|
||||
let shouldInject = (0, _helperCompilationTargets.isRequired)(name, targets, {
|
||||
compatData: polyfillsSupport,
|
||||
includes: include,
|
||||
excludes: exclude
|
||||
});
|
||||
if (shouldInjectPolyfill) {
|
||||
shouldInject = shouldInjectPolyfill(name, shouldInject);
|
||||
if (typeof shouldInject !== "boolean") {
|
||||
throw new Error(`.shouldInjectPolyfill must return a boolean.`);
|
||||
}
|
||||
}
|
||||
return shouldInject;
|
||||
},
|
||||
debug(name) {
|
||||
var _debugLog, _debugLog$polyfillsSu;
|
||||
debugLog().found = true;
|
||||
if (!debug || !name) return;
|
||||
if (debugLog().polyfills.has(providerName)) return;
|
||||
debugLog().polyfills.add(name);
|
||||
(_debugLog$polyfillsSu = (_debugLog = debugLog()).polyfillsSupport) != null ? _debugLog$polyfillsSu : _debugLog.polyfillsSupport = polyfillsSupport;
|
||||
},
|
||||
assertDependency(name, version = "*") {
|
||||
if (missingDependencies === false) return;
|
||||
if (absoluteImports) {
|
||||
// If absoluteImports is not false, we will try resolving
|
||||
// the dependency and throw if it's not possible. We can
|
||||
// skip the check here.
|
||||
return;
|
||||
}
|
||||
const dep = version === "*" ? name : `${name}@^${version}`;
|
||||
const found = missingDependencies.all ? false : mapGetOr(depsCache, `${name} :: ${dirname}`, () => deps.has(dirname, name));
|
||||
if (!found) {
|
||||
debugLog().missingDeps.add(dep);
|
||||
}
|
||||
}
|
||||
};
|
||||
const provider = factory(api, providerOptions, dirname);
|
||||
const providerName = provider.name || factory.name;
|
||||
if (typeof provider[methodName] !== "function") {
|
||||
throw new Error(`The "${providerName}" provider doesn't support the "${method}" polyfilling method.`);
|
||||
}
|
||||
if (Array.isArray(provider.polyfills)) {
|
||||
polyfillsNames = new Map(provider.polyfills.map((name, index) => [name, index]));
|
||||
filterPolyfills = provider.filterPolyfills;
|
||||
} else if (provider.polyfills) {
|
||||
polyfillsNames = new Map(Object.keys(provider.polyfills).map((name, index) => [name, index]));
|
||||
polyfillsSupport = provider.polyfills;
|
||||
filterPolyfills = provider.filterPolyfills;
|
||||
} else {
|
||||
polyfillsNames = new Map();
|
||||
}
|
||||
({
|
||||
include,
|
||||
exclude
|
||||
} = (0, _normalizeOptions.validateIncludeExclude)(providerName, polyfillsNames, providerOptions.include || [], providerOptions.exclude || []));
|
||||
let callProvider;
|
||||
if (methodName === "usageGlobal") {
|
||||
callProvider = (payload, path) => {
|
||||
var _ref;
|
||||
const utils = getUtils(path);
|
||||
return (_ref = provider[methodName](payload, utils, path)) != null ? _ref : false;
|
||||
};
|
||||
} else {
|
||||
callProvider = (payload, path) => {
|
||||
const utils = getUtils(path);
|
||||
provider[methodName](payload, utils, path);
|
||||
return false;
|
||||
};
|
||||
}
|
||||
return {
|
||||
debug,
|
||||
method,
|
||||
targets,
|
||||
provider,
|
||||
providerName,
|
||||
callProvider
|
||||
};
|
||||
}
|
||||
function definePolyfillProvider(factory) {
|
||||
return (0, _helperPluginUtils.declare)((babelApi, options, dirname) => {
|
||||
babelApi.assertVersion("^7.0.0 || ^8.0.0-alpha.0");
|
||||
const {
|
||||
traverse
|
||||
} = babelApi;
|
||||
let debugLog;
|
||||
const missingDependencies = (0, _normalizeOptions.applyMissingDependenciesDefaults)(options, babelApi);
|
||||
const {
|
||||
debug,
|
||||
method,
|
||||
targets,
|
||||
provider,
|
||||
providerName,
|
||||
callProvider
|
||||
} = instantiateProvider(factory, options, missingDependencies, dirname, () => debugLog, babelApi);
|
||||
const createVisitor = method === "entry-global" ? v.entry : v.usage;
|
||||
const visitor = provider.visitor ? traverse.visitors.merge([createVisitor(callProvider), provider.visitor]) : createVisitor(callProvider);
|
||||
if (debug && debug !== _debugUtils.presetEnvSilentDebugHeader) {
|
||||
console.log(`${providerName}: \`DEBUG\` option`);
|
||||
console.log(`\nUsing targets: ${(0, _debugUtils.stringifyTargetsMultiline)(targets)}`);
|
||||
console.log(`\nUsing polyfills with \`${method}\` method:`);
|
||||
}
|
||||
const {
|
||||
runtimeName
|
||||
} = provider;
|
||||
return {
|
||||
name: "inject-polyfills",
|
||||
visitor,
|
||||
pre(file) {
|
||||
var _provider$pre;
|
||||
if (runtimeName) {
|
||||
if (file.get("runtimeHelpersModuleName") && file.get("runtimeHelpersModuleName") !== runtimeName) {
|
||||
console.warn(`Two different polyfill providers` + ` (${file.get("runtimeHelpersModuleProvider")}` + ` and ${providerName}) are trying to define two` + ` conflicting @babel/runtime alternatives:` + ` ${file.get("runtimeHelpersModuleName")} and ${runtimeName}.` + ` The second one will be ignored.`);
|
||||
} else {
|
||||
file.set("runtimeHelpersModuleName", runtimeName);
|
||||
file.set("runtimeHelpersModuleProvider", providerName);
|
||||
}
|
||||
}
|
||||
debugLog = {
|
||||
polyfills: new Set(),
|
||||
polyfillsSupport: undefined,
|
||||
found: false,
|
||||
providers: new Set(),
|
||||
missingDeps: new Set()
|
||||
};
|
||||
(_provider$pre = provider.pre) == null || _provider$pre.apply(this, arguments);
|
||||
},
|
||||
post() {
|
||||
var _provider$post;
|
||||
(_provider$post = provider.post) == null || _provider$post.apply(this, arguments);
|
||||
if (missingDependencies !== false) {
|
||||
if (missingDependencies.log === "per-file") {
|
||||
deps.logMissing(debugLog.missingDeps);
|
||||
} else {
|
||||
deps.laterLogMissing(debugLog.missingDeps);
|
||||
}
|
||||
}
|
||||
if (!debug) return;
|
||||
if (this.filename) console.log(`\n[${this.filename}]`);
|
||||
if (debugLog.polyfills.size === 0) {
|
||||
console.log(method === "entry-global" ? debugLog.found ? `Based on your targets, the ${providerName} polyfill did not add any polyfill.` : `The entry point for the ${providerName} polyfill has not been found.` : `Based on your code and targets, the ${providerName} polyfill did not add any polyfill.`);
|
||||
return;
|
||||
}
|
||||
if (method === "entry-global") {
|
||||
console.log(`The ${providerName} polyfill entry has been replaced with ` + `the following polyfills:`);
|
||||
} else {
|
||||
console.log(`The ${providerName} polyfill added the following polyfills:`);
|
||||
}
|
||||
for (const name of debugLog.polyfills) {
|
||||
var _debugLog$polyfillsSu2;
|
||||
if ((_debugLog$polyfillsSu2 = debugLog.polyfillsSupport) != null && _debugLog$polyfillsSu2[name]) {
|
||||
const filteredTargets = (0, _helperCompilationTargets.getInclusionReasons)(name, targets, debugLog.polyfillsSupport);
|
||||
const formattedTargets = JSON.stringify(filteredTargets).replace(/,/g, ", ").replace(/^\{"/, '{ "').replace(/"\}$/, '" }');
|
||||
console.log(` ${name} ${formattedTargets}`);
|
||||
} else {
|
||||
console.log(` ${name}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
function mapGetOr(map, key, getDefault) {
|
||||
let val = map.get(key);
|
||||
if (val === undefined) {
|
||||
val = getDefault();
|
||||
map.set(key, val);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
function isEmpty(obj) {
|
||||
return Object.keys(obj).length === 0;
|
||||
}
|
||||
51
backend/node_modules/@babel/helper-define-polyfill-provider/lib/meta-resolver.js
generated
vendored
51
backend/node_modules/@babel/helper-define-polyfill-provider/lib/meta-resolver.js
generated
vendored
|
|
@ -1,51 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.default = createMetaResolver;
|
||||
var _utils = require("./utils");
|
||||
function createMetaResolver(polyfills) {
|
||||
const {
|
||||
static: staticP,
|
||||
instance: instanceP,
|
||||
global: globalP
|
||||
} = polyfills;
|
||||
return meta => {
|
||||
if (meta.kind === "global" && globalP && (0, _utils.has)(globalP, meta.name)) {
|
||||
return {
|
||||
kind: "global",
|
||||
desc: globalP[meta.name],
|
||||
name: meta.name
|
||||
};
|
||||
}
|
||||
if (meta.kind === "property" || meta.kind === "in") {
|
||||
const {
|
||||
placement,
|
||||
object,
|
||||
key
|
||||
} = meta;
|
||||
if (object && placement === "static") {
|
||||
if (globalP && _utils.PossibleGlobalObjects.has(object) && (0, _utils.has)(globalP, key)) {
|
||||
return {
|
||||
kind: "global",
|
||||
desc: globalP[key],
|
||||
name: key
|
||||
};
|
||||
}
|
||||
if (staticP && (0, _utils.has)(staticP, object) && (0, _utils.has)(staticP[object], key)) {
|
||||
return {
|
||||
kind: "static",
|
||||
desc: staticP[object][key],
|
||||
name: `${object}$${key}`
|
||||
};
|
||||
}
|
||||
}
|
||||
if (instanceP && (0, _utils.has)(instanceP, key)) {
|
||||
return {
|
||||
kind: "instance",
|
||||
desc: instanceP[key],
|
||||
name: `${key}`
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
67
backend/node_modules/@babel/helper-define-polyfill-provider/lib/node/dependencies.js
generated
vendored
67
backend/node_modules/@babel/helper-define-polyfill-provider/lib/node/dependencies.js
generated
vendored
|
|
@ -1,67 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.has = has;
|
||||
exports.laterLogMissing = laterLogMissing;
|
||||
exports.logMissing = logMissing;
|
||||
exports.resolve = resolve;
|
||||
var _path = _interopRequireDefault(require("path"));
|
||||
var _lodash = _interopRequireDefault(require("lodash.debounce"));
|
||||
var _resolve = _interopRequireDefault(require("resolve"));
|
||||
var _module = require("module");
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
||||
const nativeRequireResolve = parseFloat(process.versions.node) >= 8.9;
|
||||
// eslint-disable-line
|
||||
|
||||
function myResolve(name, basedir) {
|
||||
if (nativeRequireResolve) {
|
||||
return require.resolve(name, {
|
||||
paths: [basedir]
|
||||
}).replace(/\\/g, "/");
|
||||
} else {
|
||||
return _resolve.default.sync(name, {
|
||||
basedir
|
||||
}).replace(/\\/g, "/");
|
||||
}
|
||||
}
|
||||
function resolve(dirname, moduleName, absoluteImports) {
|
||||
if (absoluteImports === false) return moduleName;
|
||||
let basedir = dirname;
|
||||
if (typeof absoluteImports === "string") {
|
||||
basedir = _path.default.resolve(basedir, absoluteImports);
|
||||
}
|
||||
try {
|
||||
return myResolve(moduleName, basedir);
|
||||
} catch (err) {
|
||||
if (err.code !== "MODULE_NOT_FOUND") throw err;
|
||||
throw Object.assign(new Error(`Failed to resolve "${moduleName}" relative to "${dirname}"`), {
|
||||
code: "BABEL_POLYFILL_NOT_FOUND",
|
||||
polyfill: moduleName,
|
||||
dirname
|
||||
});
|
||||
}
|
||||
}
|
||||
function has(basedir, name) {
|
||||
try {
|
||||
myResolve(name, basedir);
|
||||
return true;
|
||||
} catch (_unused) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function logMissing(missingDeps) {
|
||||
if (missingDeps.size === 0) return;
|
||||
const deps = Array.from(missingDeps).sort().join(" ");
|
||||
console.warn("\nSome polyfills have been added but are not present in your dependencies.\n" + "Please run one of the following commands:\n" + `\tnpm install --save ${deps}\n` + `\tyarn add ${deps}\n`);
|
||||
process.exitCode = 1;
|
||||
}
|
||||
let allMissingDeps = new Set();
|
||||
const laterLogMissingDependencies = (0, _lodash.default)(() => {
|
||||
logMissing(allMissingDeps);
|
||||
allMissingDeps = new Set();
|
||||
}, 100);
|
||||
function laterLogMissing(missingDeps) {
|
||||
if (missingDeps.size === 0) return;
|
||||
missingDeps.forEach(name => allMissingDeps.add(name));
|
||||
laterLogMissingDependencies();
|
||||
}
|
||||
70
backend/node_modules/@babel/helper-define-polyfill-provider/lib/normalize-options.js
generated
vendored
70
backend/node_modules/@babel/helper-define-polyfill-provider/lib/normalize-options.js
generated
vendored
|
|
@ -1,70 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.applyMissingDependenciesDefaults = applyMissingDependenciesDefaults;
|
||||
exports.validateIncludeExclude = validateIncludeExclude;
|
||||
var _utils = require("./utils");
|
||||
function patternToRegExp(pattern) {
|
||||
if (pattern instanceof RegExp) return pattern;
|
||||
try {
|
||||
return new RegExp(`^${pattern}$`);
|
||||
} catch (_unused) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
function buildUnusedError(label, unused) {
|
||||
if (!unused.length) return "";
|
||||
return ` - The following "${label}" patterns didn't match any polyfill:\n` + unused.map(original => ` ${String(original)}\n`).join("");
|
||||
}
|
||||
function buldDuplicatesError(duplicates) {
|
||||
if (!duplicates.size) return "";
|
||||
return ` - The following polyfills were matched both by "include" and "exclude" patterns:\n` + Array.from(duplicates, name => ` ${name}\n`).join("");
|
||||
}
|
||||
function validateIncludeExclude(provider, polyfills, includePatterns, excludePatterns) {
|
||||
let current;
|
||||
const filter = pattern => {
|
||||
const regexp = patternToRegExp(pattern);
|
||||
if (!regexp) return false;
|
||||
let matched = false;
|
||||
for (const polyfill of polyfills.keys()) {
|
||||
if (regexp.test(polyfill)) {
|
||||
matched = true;
|
||||
current.add(polyfill);
|
||||
}
|
||||
}
|
||||
return !matched;
|
||||
};
|
||||
|
||||
// prettier-ignore
|
||||
const include = current = new Set();
|
||||
const unusedInclude = Array.from(includePatterns).filter(filter);
|
||||
|
||||
// prettier-ignore
|
||||
const exclude = current = new Set();
|
||||
const unusedExclude = Array.from(excludePatterns).filter(filter);
|
||||
const duplicates = (0, _utils.intersection)(include, exclude);
|
||||
if (duplicates.size > 0 || unusedInclude.length > 0 || unusedExclude.length > 0) {
|
||||
throw new Error(`Error while validating the "${provider}" provider options:\n` + buildUnusedError("include", unusedInclude) + buildUnusedError("exclude", unusedExclude) + buldDuplicatesError(duplicates));
|
||||
}
|
||||
return {
|
||||
include,
|
||||
exclude
|
||||
};
|
||||
}
|
||||
function applyMissingDependenciesDefaults(options, babelApi) {
|
||||
const {
|
||||
missingDependencies = {}
|
||||
} = options;
|
||||
if (missingDependencies === false) return false;
|
||||
const caller = babelApi.caller(caller => caller == null ? void 0 : caller.name);
|
||||
const {
|
||||
log = "deferred",
|
||||
inject = caller === "rollup-plugin-babel" ? "throw" : "import",
|
||||
all = false
|
||||
} = missingDependencies;
|
||||
return {
|
||||
log,
|
||||
inject,
|
||||
all
|
||||
};
|
||||
}
|
||||
3
backend/node_modules/@babel/helper-define-polyfill-provider/lib/types.js
generated
vendored
3
backend/node_modules/@babel/helper-define-polyfill-provider/lib/types.js
generated
vendored
|
|
@ -1,3 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
405
backend/node_modules/@babel/helper-define-polyfill-provider/lib/utils.js
generated
vendored
405
backend/node_modules/@babel/helper-define-polyfill-provider/lib/utils.js
generated
vendored
|
|
@ -1,405 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.PossibleGlobalObjects = void 0;
|
||||
exports.createUtilsGetter = createUtilsGetter;
|
||||
exports.getImportSource = getImportSource;
|
||||
exports.getRequireSource = getRequireSource;
|
||||
exports.has = has;
|
||||
exports.intersection = intersection;
|
||||
exports.resolveKey = resolveKey;
|
||||
exports.resolveSource = resolveSource;
|
||||
var _babel = _interopRequireWildcard(require("@babel/core"));
|
||||
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
||||
const {
|
||||
types: t,
|
||||
template: template
|
||||
} = _babel.default || _babel;
|
||||
const PossibleGlobalObjects = exports.PossibleGlobalObjects = new Set(["global", "globalThis", "self", "window"]);
|
||||
function intersection(a, b) {
|
||||
const result = new Set();
|
||||
a.forEach(v => b.has(v) && result.add(v));
|
||||
return result;
|
||||
}
|
||||
function has(object, key) {
|
||||
return Object.prototype.hasOwnProperty.call(object, key);
|
||||
}
|
||||
function resolve(path, seen = new Set()) {
|
||||
if (seen.has(path)) return;
|
||||
seen.add(path);
|
||||
if (path.isVariableDeclarator()) {
|
||||
if (path.get("id").isIdentifier()) {
|
||||
return resolve(path.get("init"), seen);
|
||||
}
|
||||
} else if (path.isReferencedIdentifier()) {
|
||||
const binding = path.scope.getBinding(path.node.name);
|
||||
if (!binding) return path;
|
||||
if (!binding.constant) return;
|
||||
return resolve(binding.path, seen);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
function resolveId(path) {
|
||||
if (path.isIdentifier() && !path.scope.hasBinding(path.node.name, /* noGlobals */true)) {
|
||||
return path.node.name;
|
||||
}
|
||||
|
||||
// globalThis.Object / window.Array / self.Map / global.Set -> resolve to
|
||||
// the property name, because accessing a built-in through a global object
|
||||
// reference is equivalent to accessing it directly.
|
||||
if (path.isMemberExpression() && !path.node.computed) {
|
||||
const object = path.get("object");
|
||||
const property = path.get("property");
|
||||
if (object.isIdentifier() && !object.scope.hasBinding(object.node.name, /* noGlobals */true) && PossibleGlobalObjects.has(object.node.name) && property.isIdentifier()) {
|
||||
return property.node.name;
|
||||
}
|
||||
}
|
||||
const resolved = resolve(path);
|
||||
if (resolved != null && resolved.isIdentifier()) {
|
||||
return resolved.node.name;
|
||||
}
|
||||
}
|
||||
function resolveKey(path, computed = false) {
|
||||
const {
|
||||
scope
|
||||
} = path;
|
||||
if (path.isStringLiteral()) return path.node.value;
|
||||
const isIdentifier = path.isIdentifier();
|
||||
if (isIdentifier && !(computed || path.parent.computed)) {
|
||||
return path.node.name;
|
||||
}
|
||||
if (computed && path.isMemberExpression() && path.get("object").isIdentifier({
|
||||
name: "Symbol"
|
||||
}) && !scope.hasBinding("Symbol", /* noGlobals */true)) {
|
||||
const sym = resolveKey(path.get("property"), path.node.computed);
|
||||
if (sym) return "Symbol." + sym;
|
||||
}
|
||||
if (isIdentifier ? scope.hasBinding(path.node.name, /* noGlobals */true) : path.isPure()) {
|
||||
const {
|
||||
value
|
||||
} = path.evaluate();
|
||||
if (typeof value === "string") return value;
|
||||
}
|
||||
}
|
||||
function resolveInstance(obj, seen) {
|
||||
const source = resolveSource(obj, seen);
|
||||
return source.placement === "prototype" ? source.id : null;
|
||||
}
|
||||
function resolveSource(obj, seen) {
|
||||
if (seen.has(obj)) {
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
seen.add(obj);
|
||||
if (obj.isMemberExpression() && obj.get("property").isIdentifier({
|
||||
name: "prototype"
|
||||
})) {
|
||||
const id = resolveId(obj.get("object"));
|
||||
if (id) {
|
||||
return {
|
||||
id,
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
const id = resolveId(obj);
|
||||
if (id) {
|
||||
return {
|
||||
id,
|
||||
placement: "static"
|
||||
};
|
||||
}
|
||||
const path = resolve(obj);
|
||||
switch (path == null ? void 0 : path.type) {
|
||||
case "NullLiteral":
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
case "RegExpLiteral":
|
||||
return {
|
||||
id: "RegExp",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "StringLiteral":
|
||||
case "TemplateLiteral":
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "NumericLiteral":
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "BooleanLiteral":
|
||||
return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "BigIntLiteral":
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "ObjectExpression":
|
||||
return {
|
||||
id: "Object",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "ArrayExpression":
|
||||
return {
|
||||
id: "Array",
|
||||
placement: "prototype"
|
||||
};
|
||||
case "FunctionExpression":
|
||||
case "ArrowFunctionExpression":
|
||||
case "ClassExpression":
|
||||
return {
|
||||
id: "Function",
|
||||
placement: "prototype"
|
||||
};
|
||||
// new Constructor() -> resolve the constructor name
|
||||
case "NewExpression":
|
||||
{
|
||||
const calleeId = resolveId(path.get("callee"));
|
||||
if (calleeId) return {
|
||||
id: calleeId,
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Unary expressions -> result type depends on operator
|
||||
case "UnaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "typeof") return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (operator === "!" || operator === "delete") return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary + always produces Number (throws on BigInt)
|
||||
if (operator === "+") return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
// Unary - and ~ can produce Number or BigInt depending on operand
|
||||
if (operator === "-" || operator === "~") {
|
||||
const arg = resolveInstance(path.get("argument"), seen);
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// ++i, i++ produce Number or BigInt depending on the argument
|
||||
case "UpdateExpression":
|
||||
{
|
||||
const arg = resolveInstance(path.get("argument"), seen);
|
||||
if (arg === "BigInt") return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
if (arg !== null) return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// Binary expressions -> result type depends on operator
|
||||
case "BinaryExpression":
|
||||
{
|
||||
const {
|
||||
operator
|
||||
} = path.node;
|
||||
if (operator === "==" || operator === "!=" || operator === "===" || operator === "!==" || operator === "<" || operator === ">" || operator === "<=" || operator === ">=" || operator === "instanceof" || operator === "in") {
|
||||
return {
|
||||
id: "Boolean",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// >>> always produces Number
|
||||
if (operator === ">>>") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
// Arithmetic and bitwise operators can produce Number or BigInt
|
||||
if (operator === "-" || operator === "*" || operator === "/" || operator === "%" || operator === "**" || operator === "&" || operator === "|" || operator === "^" || operator === "<<" || operator === ">>") {
|
||||
const left = resolveInstance(path.get("left"), seen);
|
||||
const right = resolveInstance(path.get("right"), seen);
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left !== null && right !== null) {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// + depends on operand types: string wins, otherwise number or bigint
|
||||
if (operator === "+") {
|
||||
const left = resolveInstance(path.get("left"), seen);
|
||||
const right = resolveInstance(path.get("right"), seen);
|
||||
if (left === "String" || right === "String") {
|
||||
return {
|
||||
id: "String",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "Number" && right === "Number") {
|
||||
return {
|
||||
id: "Number",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
if (left === "BigInt" && right === "BigInt") {
|
||||
return {
|
||||
id: "BigInt",
|
||||
placement: "prototype"
|
||||
};
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (a, b, c) -> the result is the last expression
|
||||
case "SequenceExpression":
|
||||
{
|
||||
const expressions = path.get("expressions");
|
||||
return resolveSource(expressions[expressions.length - 1], seen);
|
||||
}
|
||||
// a = b -> the result is the right side
|
||||
case "AssignmentExpression":
|
||||
{
|
||||
if (path.node.operator === "=") {
|
||||
return resolveSource(path.get("right"), seen);
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// a ? b : c -> if both branches resolve to the same type, use it
|
||||
case "ConditionalExpression":
|
||||
{
|
||||
const consequent = resolveSource(path.get("consequent"), seen);
|
||||
const alternate = resolveSource(path.get("alternate"), seen);
|
||||
if (consequent.id && consequent.id === alternate.id) {
|
||||
return consequent;
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
// (expr) -> unwrap parenthesized expressions
|
||||
case "ParenthesizedExpression":
|
||||
return resolveSource(path.get("expression"), seen);
|
||||
// TypeScript / Flow type wrappers -> unwrap to the inner expression
|
||||
case "TSAsExpression":
|
||||
case "TSSatisfiesExpression":
|
||||
case "TSNonNullExpression":
|
||||
case "TSInstantiationExpression":
|
||||
case "TSTypeAssertion":
|
||||
case "TypeCastExpression":
|
||||
return resolveSource(path.get("expression"), seen);
|
||||
}
|
||||
return {
|
||||
id: null,
|
||||
placement: null
|
||||
};
|
||||
}
|
||||
function getImportSource({
|
||||
node
|
||||
}) {
|
||||
if (node.specifiers.length === 0) return node.source.value;
|
||||
}
|
||||
function getRequireSource({
|
||||
node
|
||||
}) {
|
||||
if (!t.isExpressionStatement(node)) return;
|
||||
const {
|
||||
expression
|
||||
} = node;
|
||||
if (t.isCallExpression(expression) && t.isIdentifier(expression.callee) && expression.callee.name === "require" && expression.arguments.length === 1 && t.isStringLiteral(expression.arguments[0])) {
|
||||
return expression.arguments[0].value;
|
||||
}
|
||||
}
|
||||
function hoist(node) {
|
||||
// @ts-expect-error
|
||||
node._blockHoist = 3;
|
||||
return node;
|
||||
}
|
||||
function createUtilsGetter(cache) {
|
||||
return path => {
|
||||
const prog = path.findParent(p => p.isProgram());
|
||||
return {
|
||||
injectGlobalImport(url, moduleName) {
|
||||
cache.storeAnonymous(prog, url, moduleName, (isScript, source) => {
|
||||
return isScript ? template.statement.ast`require(${source})` : t.importDeclaration([], source);
|
||||
});
|
||||
},
|
||||
injectNamedImport(url, name, hint = name, moduleName) {
|
||||
return cache.storeNamed(prog, url, name, moduleName, (isScript, source, name) => {
|
||||
const id = prog.scope.generateUidIdentifier(hint);
|
||||
return {
|
||||
node: isScript ? hoist(template.statement.ast`
|
||||
var ${id} = require(${source}).${name}
|
||||
`) : t.importDeclaration([t.importSpecifier(id, name)], source),
|
||||
name: id.name
|
||||
};
|
||||
});
|
||||
},
|
||||
injectDefaultImport(url, hint = url, moduleName) {
|
||||
return cache.storeNamed(prog, url, "default", moduleName, (isScript, source) => {
|
||||
const id = prog.scope.generateUidIdentifier(hint);
|
||||
return {
|
||||
node: isScript ? hoist(template.statement.ast`var ${id} = require(${source})`) : t.importDeclaration([t.importDefaultSpecifier(id)], source),
|
||||
name: id.name
|
||||
};
|
||||
});
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
26
backend/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/entry.js
generated
vendored
26
backend/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/entry.js
generated
vendored
|
|
@ -1,26 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.default = void 0;
|
||||
var _utils = require("../utils");
|
||||
var _default = callProvider => ({
|
||||
ImportDeclaration(path) {
|
||||
const source = (0, _utils.getImportSource)(path);
|
||||
if (!source) return;
|
||||
callProvider({
|
||||
kind: "import",
|
||||
source
|
||||
}, path);
|
||||
},
|
||||
Program(path) {
|
||||
path.get("body").forEach(bodyPath => {
|
||||
const source = (0, _utils.getRequireSource)(bodyPath);
|
||||
if (!source) return;
|
||||
callProvider({
|
||||
kind: "import",
|
||||
source
|
||||
}, bodyPath);
|
||||
});
|
||||
}
|
||||
});
|
||||
exports.default = _default;
|
||||
9
backend/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/index.js
generated
vendored
9
backend/node_modules/@babel/helper-define-polyfill-provider/lib/visitors/index.js
generated
vendored
|
|
@ -1,9 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
exports.__esModule = true;
|
||||
exports.usage = exports.entry = void 0;
|
||||
var _usage = _interopRequireDefault(require("./usage"));
|
||||
exports.usage = _usage.default;
|
||||
var _entry = _interopRequireDefault(require("./entry"));
|
||||
exports.entry = _entry.default;
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue