diff --git a/app/.sequelizerc b/app/.sequelizerc new file mode 100644 index 000000000..efa9ca282 --- /dev/null +++ b/app/.sequelizerc @@ -0,0 +1,9 @@ +const path = require('path'); + +module.exports = { + 'config': path.resolve('config', 'config.json'), + 'models-path': path.resolve('src', 'models'), + 'seeders-path': path.resolve('seeders'), + 'migrations-path': path.resolve('migrations'), +}; + diff --git a/app/config/config.json b/app/config/config.json index 0f858c669..74a147fc7 100644 --- a/app/config/config.json +++ b/app/config/config.json @@ -1,23 +1,24 @@ { "development": { - "username": "root", + "username": "citycatalyst", "password": null, - "database": "database_development", + "database": "citycatalyst", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres", + "logging": true }, "test": { "username": "root", "password": null, - "database": "database_test", + "database": "citycatalyst_test", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres" }, "production": { "username": "root", "password": null, - "database": "database_production", + "database": "citycatalyst_prod", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres" } } diff --git a/app/migrations/20230728183114-Init.js b/app/migrations/20230728183114-Init.js new file mode 100644 index 000000000..ae5bd985b --- /dev/null +++ b/app/migrations/20230728183114-Init.js @@ -0,0 +1,495 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.query(` + CREATE TABLE "User" ( + "user_id" uuid PRIMARY KEY, + "name" varchar(255), + "picture_url" text, + "is_organization" boolean DEFAULT false, + "email" varchar(255) UNIQUE, + "password_hash" char(60), + "role" text, + "created" timestamp, + "last_updated" timestamp, + "organization_id" uuid, + CONSTRAINT "FK_user.organization_id" + FOREIGN KEY("organization_id") + REFERENCES "User" ("user_id") + ); + + CREATE TABLE "City" ( + "city_id" uuid, + "locode" varchar(255) UNIQUE, + "name" varchar(255), + "shape" jsonb, + "country" varchar(255), + "region" varchar(255), + "area" bigint, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("city_id") + ); + + CREATE TABLE "CityUser" ( + "city_user_id" uuid, + "user_id" uuid, + "city_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("city_user_id"), + CONSTRAINT "FK_CityUser.user_id" + FOREIGN KEY ("user_id") + REFERENCES "User" ("user_id"), + CONSTRAINT "FK_CityUser.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") + ); + + CREATE TABLE "Publisher" ( + "publisher_id" uuid, + "name" varchar(255), + "URL" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("publisher_id") + ); + + CREATE TABLE "ReportingLevel" ( + "reportinglevel_id" uuid, + "reportinglevel_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("reportinglevel_id") + ); + + CREATE TABLE "Scope" ( + "scope_id" uuid, + "scope_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("scope_id") + ); + + CREATE TABLE "Sector" ( + "sector_id" uuid, + "sector_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("sector_id") + ); + + CREATE TABLE "SubSector" ( + "subsector_id" uuid, + "subsector_name" varchar(255), + "sector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("subsector_id"), + CONSTRAINT "FK_SubSector.sector_id" + FOREIGN KEY("sector_id") + REFERENCES "Sector" ("sector_id") + ); + + CREATE TABLE "SubCategory" ( + "subcategory_id" uuid, + "subcategory_name" varchar(255), + "activity_name" varchar(255), + "subsector_id" uuid, + "scope_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("subcategory_id"), + CONSTRAINT "FK_SubCategory.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubCategory.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id"), + CONSTRAINT "FK_SubCategory.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") + ); + + CREATE TABLE "ActivityData" ( + "activitydata_id" uuid, + "activitydata" varchar(255), + "subcategory_id" uuid, + "scope_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("activitydata_id"), + CONSTRAINT "FK_ActivityData.subcategory_id" + FOREIGN KEY("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id"), + CONSTRAINT "FK_ActivityData.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id"), + CONSTRAINT "FK_ActivityData.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") + ); + + CREATE TABLE "EmissionsFactor" ( + "emissions_factor_id" uuid, + "emissions_factor" numeric, + "emissions_factor_url" varchar(255), + "units" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("emissions_factor_id") + ); + + CREATE TABLE "GHGs" ( + "ghg_id" uuid, + "ghg_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("ghg_id") + ); + + CREATE TABLE "DataSource" ( + "datasource_id" uuid, /*Unique identifier for the datasource */ + "name" varchar(255), /* Name of the datasource */ + "URL" varchar(255), /* Link to the datasource */ + "description" TEXT, /* A brief human-readerble description of the datasource */ + "access_type" varchar(255), /* How to access the datasource. Through download, api etc */ + "geographical_location" varchar(255), /* Which regions or countries does the data source focus on */ + "latest_accounting_year" int, /* What's the latest year of the datasource */ + "frequency_of_update" varchar(255), /* How often does the datasource get updated? */ + "spacial_resolution" varchar(255), /* City boundary? Outside city boundary? */ + "language" varchar(255), + "accessibility" varchar(255), /* Is the datasource free or paid? */ + "data_quality" varchar(255), /* Is the datasource third party verified or not? */ + "notes" TEXT, /* Any other information about the datasource */ + "units" varchar(255), + "methodology_url" varchar(255), + "publisher_id" uuid, + "retrieval_method" varchar(255), + "api_endpoint" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id"), + CONSTRAINT "FK_DataSource.publisher_id" + FOREIGN KEY ("publisher_id") + REFERENCES "Publisher" ("publisher_id") + ); + + CREATE TABLE "Methodology" ( + "methodology_id" uuid, /* Unique identifier for the methodology */ + "methodology" varchar(255), /* Description or name of methodology being used */ + "methodology_url" varchar(255), /* Link for human-readable methodology documentation */ + "datasource_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("methodology_id"), + CONSTRAINT "FK_Methodology.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id") + ); + + CREATE TABLE "DataSourceActivityData" ( + "datasource_id" uuid, + "activitydata_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "activitydata_id"), + CONSTRAINT "FK_DataSourceActivityData.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceActivityData.activitydata_id" + FOREIGN KEY("activitydata_id") + REFERENCES "ActivityData" ("activitydata_id") + ); + + CREATE TABLE "DataSourceEmissionsFactor" ( + "datasource_id" uuid, + "emissions_factor_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "emissions_factor_id"), + CONSTRAINT "FK_DataSourceEmissionsFactor.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceEmissionsFactor.emissions_factor_id" + FOREIGN KEY("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id") + ); + + CREATE TABLE "DataSourceGHGs" ( + "datasource_id" uuid, + "ghg_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "ghg_id"), + CONSTRAINT "FK_DataSourceGHGs.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceGHGs.ghg_id" + FOREIGN KEY("ghg_id") + REFERENCES "GHGs" ("ghg_id") + ); + + CREATE TABLE "DataSourceMethodology" ( + "datasource_id" uuid, + "methodology_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "methodology_id"), + CONSTRAINT "FK_DataSourceMethodology.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceMethodology.methodology_id" + FOREIGN KEY("methodology_id") + REFERENCES "Methodology" ("methodology_id") + ); + + CREATE TABLE "DataSourceReportingLevel" ( + "datasource_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","reportinglevel_id"), + CONSTRAINT "FK_DataSourceReportingLevel.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceReportingLevel.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") + ); + + CREATE TABLE "DataSourceScope" ( + "datasource_id" uuid, + "scope_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","scope_id"), + CONSTRAINT "FK_DataSourceScope.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceScope.activitydata_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id") + ); + + CREATE TABLE "DataSourceSector" ( + "datasource_id" uuid, + "sector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "sector_id"), + CONSTRAINT "FK_DataSourceSector_datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSector_sector_id" + FOREIGN KEY("sector_id") + REFERENCES "Sector" ("sector_id") + ); + + CREATE TABLE "DataSourceSubCategory" ( + "datasource_id" uuid, + "subcategory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","subcategory_id"), + CONSTRAINT "FK_DataSourceSubCategory.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSubCategory.subcategory_id" + FOREIGN KEY("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id") + ); + + CREATE TABLE "DataSourceSubSector" ( + "datasource_id" uuid, + "subsector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","subsector_id"), + CONSTRAINT "FK_DataSourceSubSector.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSubSector.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id") + ); + + CREATE TABLE "GDP" ( + "city_id" uuid, /* city ID */ + "gdp" bigint, /* GDP in US dollars */ + "year" int, /* Year of measurement, YYYY */ + "created" timestamp, + "last_updated" timestamp, + "datasource_id" uuid, + PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ + CONSTRAINT "FK_GDP.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_GDP.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") + ); + + CREATE TABLE "Inventory" ( + "inventory_id" uuid, + "inventory_name" varchar(255), + "year" int, + "total_emissions" bigint, + "city_id" uuid, + PRIMARY KEY ("inventory_id"), + CONSTRAINT "FK_Inventory.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") + ); + + CREATE TABLE "Population" ( + "city_id" uuid, /* city ID */ + "population" bigint, /* Population in units; 1000 => 1000 people */ + "year" int, /* Year of measurement, YYYY */ + "created" timestamp, + "last_updated" timestamp, + "datasource_id" uuid, + PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ + CONSTRAINT "FK_Population.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_Population.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") + ); + + CREATE TABLE "SectorValue" ( + "sector_value_id" uuid, + "total_emissions" numeric, + "sector_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("sector_value_id"), + CONSTRAINT "FK_SectorValue.sector_id" + FOREIGN KEY ("sector_id") + REFERENCES "Sector" ("sector_id"), + CONSTRAINT "FK_SectorValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") + ); + + CREATE TABLE "SubCategoryValue" ( + "subcategory_value_id" uuid, + "activity_units" varchar(255), + "activity_value" numeric, + "emission_factor_value" numeric, + "total_emissions" numeric, + "emissions_factor_id" uuid, + "subcategory_id" uuid, + "sector_value_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subcategory_value_id"), + CONSTRAINT "FK_SubCategoryValue.emissions_factor_id" + FOREIGN KEY ("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id"), + CONSTRAINT "FK_SubCategoryValue.subcategory_id" + FOREIGN KEY ("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id"), + CONSTRAINT "FK_SubCategoryValue.sector_value_id" + FOREIGN KEY ("sector_value_id") + REFERENCES "SectorValue" ("sector_value_id"), + CONSTRAINT "FK_SubCategoryValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") + ); + + CREATE TABLE "SubSectorReportingLevel" ( + "subsector_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_id", "reportinglevel_id"), + CONSTRAINT "FK_SubSectorReportingLevel.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorReportingLevel.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") + ); + + CREATE TABLE "SubSectorScope" ( + "subsector_id" uuid, + "scope_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_id", "scope_id"), + CONSTRAINT "FK_SubSectorScope.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorScope.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id") + ); + + CREATE TABLE "SubSectorValue" ( + "subsector_value_id" uuid, + "activity_units" varchar(255), + "activity_value" numeric, + "emission_factor_value" numeric, + "total_emissions" numeric, + "emissions_factor_id" uuid, + "subsector_id" uuid, + "sector_value_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_value_id"), + CONSTRAINT "FK_SubSectorValue.emissions_factor_id" + FOREIGN KEY ("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id"), + CONSTRAINT "FK_SubSectorValue.subsector_id" + FOREIGN KEY ("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorValue.sector_value_id" + FOREIGN KEY ("sector_value_id") + REFERENCES "SectorValue" ("sector_value_id"), + CONSTRAINT "FK_SubSectorValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") + ); + + CREATE TABLE "Version" ( + "version_id" uuid, + "year" int, + "version" varchar(255), + "inventory_id" uuid, + PRIMARY KEY ("version_id"), + CONSTRAINT "FK_Version.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") + ); + `); + }, + + async down(queryInterface) { + const tables = [ + 'User', 'City', 'CityUser', 'Publisher', 'ReportingLevel', 'Scope', + 'Sector', 'SubSector', 'SubCategory', 'ActivityData', 'EmissionsFactor', + 'GHGs', 'DataSource', 'Methodology', 'DataSourceActivityData', + 'DataSourceEmissionsFactor', 'DataSourceGHGs', 'DataSourceMethodology', + 'DataSourceReportingLevel', 'DataSourceScope', 'DataSourceSector', + 'DataSourceSubCategory', 'DataSourceSubSector', 'GDP', 'Inventory', + 'Population', 'SectorValue', 'SubCategoryValue', + 'SubSectorReportingLevel', 'SubSectorScope', 'SubSectorValue', 'Version' + ]; + + return queryInterface.sequelize.transaction(async (transaction) => { + for (const table of tables) { + await transaction.dropTable(table, { cascade: true, transaction }); + } + }); + } +}; + diff --git a/app/models/index.js b/app/models/index.js deleted file mode 100644 index 024200ecd..000000000 --- a/app/models/index.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const Sequelize = require('sequelize'); -const process = require('process'); -const basename = path.basename(__filename); -const env = process.env.NODE_ENV || 'development'; -const config = require(__dirname + '/../config/config.json')[env]; -const db = {}; - -let sequelize; -if (config.use_env_variable) { - sequelize = new Sequelize(process.env[config.use_env_variable], config); -} else { - sequelize = new Sequelize(config.database, config.username, config.password, config); -} - -fs - .readdirSync(__dirname) - .filter(file => { - return ( - file.indexOf('.') !== 0 && - file !== basename && - file.slice(-3) === '.js' && - file.indexOf('.test.js') === -1 - ); - }) - .forEach(file => { - const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); - db[model.name] = model; - }); - -Object.keys(db).forEach(modelName => { - if (db[modelName].associate) { - db[modelName].associate(db); - } -}); - -db.sequelize = sequelize; -db.Sequelize = Sequelize; - -module.exports = db; diff --git a/app/next.config.js b/app/next.config.js index 6ef80aec6..10309b0fe 100644 --- a/app/next.config.js +++ b/app/next.config.js @@ -1,14 +1,5 @@ /** @type {import('next').NextConfig} */ -const nextConfig = { - serverRuntimeConfig: { - dbConfig: { - host: process.env.DATABASE_HOST, - name: process.env.DATABASE_NAME, - user: process.env.DATABASE_USER, - password: process.env.DATABASE_PASSWORD, - }, - }, -}; +const nextConfig = {}; module.exports = nextConfig; diff --git a/app/package-lock.json b/app/package-lock.json index 6d8858755..78f946591 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -36,8 +36,16 @@ "@storybook/addon-links": "^7.0.27", "@storybook/blocks": "^7.0.27", "@storybook/nextjs": "^7.0.27", + "@storybook/react": "^7.0.27", + "@storybook/testing-library": "^0.0.14-next.2", + "@types/glob": "^8.1.0", + "@types/pg": "^8.10.2", + "eslint-plugin-storybook": "^0.6.12", + "glob": "^10.3.3", + "sequelize-auto": "^0.8.8", "sequelize-cli": "^6.6.1", - "storybook": "^7.0.27" + "storybook": "^7.0.27", + "tsx": "^3.12.7" }, "engines": { "node": ">=20.5.0" @@ -66,6 +74,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -90,6 +99,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, "dependencies": { "@babel/highlight": "^7.22.5" }, @@ -101,6 +111,7 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -109,6 +120,7 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -138,6 +150,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -149,6 +162,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -157,6 +171,7 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -195,6 +210,7 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", @@ -213,6 +229,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -221,6 +238,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -228,7 +246,8 @@ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.22.9", @@ -308,6 +327,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -316,6 +336,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, "dependencies": { "@babel/template": "^7.22.5", "@babel/types": "^7.22.5" @@ -328,6 +349,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -351,6 +373,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -362,6 +385,7 @@ "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", @@ -435,6 +459,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -458,6 +483,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -469,6 +495,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -477,6 +504,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -485,6 +513,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -507,6 +536,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, "dependencies": { "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.6", @@ -520,6 +550,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -533,6 +564,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -544,6 +576,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -557,6 +590,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -564,12 +598,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -578,6 +614,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -586,6 +623,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -597,6 +635,7 @@ "version": "7.22.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -2413,6 +2452,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", @@ -2426,6 +2466,7 @@ "version": "7.22.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.7", @@ -2446,6 +2487,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -2454,6 +2496,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -2466,7 +2509,8 @@ "node_modules/@base2/pretty-print-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", - "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", + "dev": true }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", @@ -2502,6 +2546,36 @@ "react": ">=16.8.0" } }, + "node_modules/@esbuild-kit/cjs-loader": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz", + "integrity": "sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.1.0.tgz", + "integrity": "sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==", + "dev": true, + "dependencies": { + "esbuild": "~0.17.6", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz", + "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", @@ -2509,6 +2583,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -2524,6 +2599,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -2539,6 +2615,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -2554,6 +2631,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2569,6 +2647,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -2584,6 +2663,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -2599,6 +2679,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -2614,6 +2695,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2629,6 +2711,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2644,6 +2727,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2659,6 +2743,7 @@ "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2674,6 +2759,7 @@ "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2689,6 +2775,7 @@ "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2704,6 +2791,7 @@ "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2719,6 +2807,7 @@ "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2734,6 +2823,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2749,6 +2839,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -2764,6 +2855,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -2779,6 +2871,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -2794,6 +2887,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2809,6 +2903,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2824,6 +2919,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2920,6 +3016,96 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3194,6 +3380,25 @@ "glob": "7.1.7" } }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@next/swc-darwin-arm64": { "version": "13.4.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", @@ -3376,6 +3581,16 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -4054,6 +4269,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.27.tgz", "integrity": "sha512-ScpiStUHvtgy9RrCFNyzzH9l+zHF80lSwW/BZ1MRETJ9ZaOVPrm03U0Ju01wJC57DYPROwPU/wKMetNqKKEhdA==", + "dev": true, "dependencies": { "@storybook/channels": "7.0.27", "@storybook/client-logger": "7.0.27", @@ -4087,6 +4303,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.27.tgz", "integrity": "sha512-YppvPa1qMyC+oCQJ3tf7Quzpf2NnBlvIRLPJiGAMssUwX5qE0iKe9lTtkNwMaNxEvzz6rDxewSlz+f/MWr4gPw==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -4262,6 +4479,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.27.tgz", "integrity": "sha512-t4F0ByHP4MNiyVI5sgqtxSccr4RmPAqTr/h6CeGLJKWzUYobBV5hwKUd/qlfwdjev2u9C7AdLFPBKVcHX5PteA==", + "dev": true, "dependencies": { "@storybook/global": "^5.0.0" }, @@ -4552,6 +4770,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.27.tgz", "integrity": "sha512-5cyAdOLqMUJfGW2c31U4/Q5TF+8DQnuQ6jKeX3W8ZQVhDn/Kox4qYNxRR0aRUUHTzxRVojQfmDHXy8IxZqYBNA==", + "dev": true, "dependencies": { "@storybook/client-logger": "7.0.27", "@storybook/preview-api": "7.0.27" @@ -4565,6 +4784,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.27.tgz", "integrity": "sha512-nlHXpn3CghCwkeIffZ7/PzcraCDXNZz+cnR4L8vtgJn1n6W7y92mxfF8gkRHuiYHWHbPWRVP9M5vAmVoiNMxjw==", + "dev": true, "dependencies": { "@storybook/node-logger": "7.0.27", "@storybook/types": "7.0.27", @@ -4596,12 +4816,14 @@ "node_modules/@storybook/core-common/node_modules/@types/node": { "version": "16.18.38", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==" + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", + "dev": true }, "node_modules/@storybook/core-common/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -4610,6 +4832,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4628,6 +4851,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.3.tgz", "integrity": "sha512-m+kxywR5j/2Z2V9zvHKfwwL5Gp7gIFEBX+deTB9w2lJB+wSuw9kcS43VfvTAMk8TXL5JCl/cCjsR+tgNVspGyA==", + "dev": true, "dependencies": { "@types/glob": "^8.0.0" }, @@ -4646,6 +4870,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4657,6 +4882,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } @@ -4665,6 +4891,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.27.tgz", "integrity": "sha512-sNnqgO5i5DUIqeQfNbr987KWvAciMN9FmMBuYdKjVFMqWFyr44HTgnhfKwZZKl+VMDYkHA9Do7UGSYZIKy0P4g==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -4797,6 +5024,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.1.tgz", "integrity": "sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==", + "dev": true, "dependencies": { "type-fest": "^2.19.0" } @@ -4911,6 +5139,7 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { "node": ">=12.20" }, @@ -4928,6 +5157,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.27.tgz", "integrity": "sha512-vXlFbwnlJV1ihYbwoP7uJ8JhYXkhaH3WL1yzIJx0kL1Fl1KLQc+x4flBM3pWO2MkrRa2hFLy5GrDwD6GxbMfEQ==", + "dev": true, "dependencies": { "@babel/core": "^7.12.10", "@storybook/core-common": "7.0.27", @@ -4945,12 +5175,14 @@ "node_modules/@storybook/global": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==" + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true }, "node_modules/@storybook/instrumenter": { "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.0.27.tgz", "integrity": "sha512-LR1Dm90lC5nurZQ5ZIbNa/8b+0AsBOQkEgnK/BQkheGMdlmrsh/i3dDqscOPZBPTLxZoYhhYWh27fDKHnT8bhw==", + "dev": true, "dependencies": { "@storybook/channels": "7.0.27", "@storybook/client-logger": "7.0.27", @@ -5123,6 +5355,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.27.tgz", "integrity": "sha512-idoK+sDaTTPuxHcKhxn+l27Omhxvr1TQ0ALw1h8ehyMbW8TZBdWvYLYfmiWeI3+NQtmeudzxhKSVYTmAY4qDJw==", + "dev": true, "dependencies": { "@types/npmlog": "^4.1.2", "chalk": "^4.1.0", @@ -5208,6 +5441,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.27.tgz", "integrity": "sha512-FhauTuLzRsaIaEORQP5lxYrzwRgZPMnfYEPnzduyGgPiY6VZkS6wIiO6pKzat83V1L4J7m5aZhTB3HtvTwPhvg==", + "dev": true, "dependencies": { "@storybook/channel-postmessage": "7.0.27", "@storybook/channels": "7.0.27", @@ -5234,6 +5468,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.0.27.tgz", "integrity": "sha512-NPD6J5okkxiBx8k8TWvn03qG6ThD2rp1+2nFGgo3cInCEmvDgoa3wjq/Gl/2QV4W8XrQ8GiItj0Lzca+CBrkOw==", + "dev": true, "dependencies": { "@storybook/client-logger": "7.0.27", "@storybook/core-client": "7.0.27", @@ -5297,6 +5532,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.27.tgz", "integrity": "sha512-KnyBrs9S8BIWIhNdT6cIpqmSE9CAxL8uGH/ev60OutKeM+rf3SC3AylIBSvMdjy4cykMasg16QiShK+MMbKl9g==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" @@ -5309,12 +5545,14 @@ "node_modules/@storybook/react/node_modules/@types/node": { "version": "16.18.38", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==" + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", + "dev": true }, "node_modules/@storybook/react/node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -5326,6 +5564,7 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { "node": ">=12.20" }, @@ -5391,6 +5630,7 @@ "version": "0.0.14-next.2", "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.0.14-next.2.tgz", "integrity": "sha512-i/SLSGm0o978ELok/SB4Qg1sZ3zr+KuuCkzyFqcCD0r/yf+bG35aQGkFqqxfSAdDxuQom0NO02FE+qys5Eapdg==", + "dev": true, "dependencies": { "@storybook/client-logger": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0", "@storybook/instrumenter": "^7.0.0-beta.0 || ^7.0.0-rc.0 || ^7.0.0", @@ -5423,6 +5663,7 @@ "version": "7.0.27", "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.27.tgz", "integrity": "sha512-pmJuIm+kGaZiDMyl2i5KFS9iGWrpW1jVcp9OMtHeK20LBzY5Hxq/JMc3E+fbVNkAX2hVlVGbbVUNPTvd9AjbrA==", + "dev": true, "dependencies": { "@storybook/channels": "7.0.27", "@types/babel__core": "^7.0.0", @@ -5446,6 +5687,7 @@ "version": "8.20.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -5464,6 +5706,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -5472,6 +5715,7 @@ "version": "13.5.0", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -5486,12 +5730,14 @@ "node_modules/@types/aria-query": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -5504,6 +5750,7 @@ "version": "7.6.4", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -5512,6 +5759,7 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -5521,6 +5769,7 @@ "version": "7.20.1", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -5529,6 +5778,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -5538,6 +5788,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -5559,7 +5810,8 @@ "node_modules/@types/doctrine": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==" + "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", + "dev": true }, "node_modules/@types/ejs": { "version": "3.1.2", @@ -5570,7 +5822,8 @@ "node_modules/@types/escodegen": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz", - "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==" + "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", + "dev": true }, "node_modules/@types/eslint": { "version": "8.44.0", @@ -5595,12 +5848,14 @@ "node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -5612,6 +5867,7 @@ "version": "4.17.35", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -5629,6 +5885,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, "dependencies": { "@types/minimatch": "^5.1.2", "@types/node": "*" @@ -5681,7 +5938,8 @@ "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -5703,7 +5961,8 @@ "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true }, "node_modules/@types/mime-types": { "version": "2.1.1", @@ -5714,7 +5973,8 @@ "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.31", @@ -5730,6 +5990,7 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dev": true, "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -5744,7 +6005,8 @@ "node_modules/@types/npmlog": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.4.tgz", - "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==" + "integrity": "sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==", + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -5752,10 +6014,79 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/pg": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.2.tgz", + "integrity": "sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/pg/node_modules/pg-types": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.1.tgz", + "integrity": "sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==", + "dev": true, + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.0.1", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/pg/node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/pg/node_modules/postgres-date": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.0.1.tgz", + "integrity": "sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@types/pretty-hrtime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz", - "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==" + "integrity": "sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==", + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -5765,12 +6096,14 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, "node_modules/@types/react": { "version": "18.2.15", @@ -5798,12 +6131,14 @@ "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -5813,6 +6148,7 @@ "version": "1.15.2", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -5929,6 +6265,7 @@ "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -5954,6 +6291,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5966,6 +6304,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -6222,6 +6561,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -6416,17 +6756,20 @@ "node_modules/app-root-dir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==" + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", + "dev": true }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -6439,6 +6782,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6618,7 +6962,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", @@ -7787,6 +8132,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, "bin": { "color-support": "bin.js" } @@ -7801,6 +8147,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7963,7 +8310,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "node_modules/constants-browserify": { "version": "1.0.0", @@ -7995,7 +8343,8 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -8265,6 +8614,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -8405,6 +8755,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -8412,7 +8763,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/depd": { "version": "2.0.0", @@ -8626,7 +8978,8 @@ "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true }, "node_modules/dom-converter": { "version": "0.2.0", @@ -8718,6 +9071,7 @@ "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -8729,6 +9083,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, "engines": { "node": ">=12" } @@ -8786,6 +9141,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/editorconfig": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", @@ -9030,6 +9391,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -9146,6 +9508,7 @@ "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -9188,6 +9551,7 @@ "version": "3.4.2", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.4.2.tgz", "integrity": "sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==", + "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -9224,6 +9588,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -9244,6 +9609,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -9595,6 +9961,7 @@ "version": "0.6.12", "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.12.tgz", "integrity": "sha512-XbIvrq6hNVG6rpdBr+eBw63QhOMLpZneQVSooEDow8aQCWGCk/5vqtap1yxpVydNfSxi3S/3mBBRLQqKUqQRww==", + "dev": true, "dependencies": { "@storybook/csf": "^0.0.1", "@typescript-eslint/utils": "^5.45.0", @@ -9612,6 +9979,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", + "dev": true, "dependencies": { "lodash": "^4.17.15" } @@ -9662,6 +10030,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -10008,6 +10377,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", + "dev": true, "dependencies": { "fs-extra": "11.1.1", "ramda": "0.29.0" @@ -10291,6 +10661,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -10340,6 +10711,7 @@ "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -10431,6 +10803,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -10450,6 +10823,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -10569,19 +10943,22 @@ "dev": true }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10595,14 +10972,66 @@ "is-glob": "^4.0.3" }, "engines": { - "node": ">=10.13.0" + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -10707,6 +11136,7 @@ "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -10727,6 +11157,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10808,7 +11239,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/hash-base": { "version": "3.1.0", @@ -10930,6 +11362,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, "engines": { "node": ">=8" }, @@ -11198,6 +11631,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11333,6 +11767,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -11402,6 +11837,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11476,6 +11912,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -11505,6 +11942,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11593,6 +12031,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11612,6 +12051,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -11648,7 +12088,8 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", @@ -11735,6 +12176,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.2.tgz", + "integrity": "sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", @@ -12040,6 +12499,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -12078,6 +12538,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -12143,6 +12604,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", + "dev": true, "dependencies": { "app-root-dir": "^1.0.2", "dotenv": "^16.0.0", @@ -12294,6 +12756,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, "bin": { "lz-string": "bin/bin.js" } @@ -12334,7 +12797,8 @@ "node_modules/map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==" + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true }, "node_modules/markdown-to-jsx": { "version": "7.2.1", @@ -12423,6 +12887,7 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, "dependencies": { "map-or-similar": "^1.5.0" } @@ -12502,6 +12967,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -12510,6 +12976,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -12697,7 +13164,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/next": { "version": "13.4.10", @@ -12810,6 +13278,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12974,6 +13443,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -13021,6 +13491,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -13120,6 +13591,12 @@ "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", "dev": true }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -13394,6 +13871,31 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -13505,6 +14007,15 @@ "node": ">=4.0.0" } }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/pg-pool": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", @@ -13577,6 +14088,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, "dependencies": { "find-up": "^5.0.0" }, @@ -13866,6 +14378,12 @@ "node": ">=0.10.0" } }, + "node_modules/postgres-range": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.3.tgz", + "integrity": "sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13903,6 +14421,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -13916,6 +14435,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -13926,12 +14446,14 @@ "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true }, "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -14097,6 +14619,26 @@ "node": ">= 6.0.0" } }, + "node_modules/puppeteer-core/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/puppeteer-core/node_modules/https-proxy-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", @@ -14147,6 +14689,7 @@ "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -14198,6 +14741,7 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", + "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/ramda" @@ -14322,6 +14866,7 @@ "version": "15.0.0", "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "dev": true, "dependencies": { "@base2/pretty-print-object": "1.0.1", "is-plain-object": "5.0.0", @@ -14335,7 +14880,8 @@ "node_modules/react-element-to-jsx-string/node_modules/react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==" + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true }, "node_modules/react-inspector": { "version": "6.0.2", @@ -14714,10 +15260,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, "engines": { "node": ">=0.10.5" } }, + "node_modules/reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -14866,6 +15419,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -14998,6 +15570,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -15216,6 +15789,39 @@ } } }, + "node_modules/sequelize-auto": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/sequelize-auto/-/sequelize-auto-0.8.8.tgz", + "integrity": "sha512-9o0qi2yMA86oFqcA5Nh14PnQSHP0E9WPEB4hP/NgxqdFE44Nq2u8Di5O3xmvWwXMIV6W+Q0YI/2VTLvlMJAjnQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21", + "mkdirp": "^1.0.4", + "reserved-words": "^0.1.2", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize-auto": "bin/sequelize-auto" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "sequelize": ">3.30.0" + } + }, + "node_modules/sequelize-auto/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sequelize-cli": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.1.tgz", @@ -15324,7 +15930,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setimmediate": { "version": "1.0.5", @@ -15398,6 +16005,26 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -15561,6 +16188,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, "dependencies": { "internal-slot": "^1.0.4" }, @@ -15659,6 +16287,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15667,6 +16296,22 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15676,10 +16321,17 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/string.prototype.matchall": { "version": "4.0.8", @@ -15752,6 +16404,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -15897,7 +16562,8 @@ "node_modules/synchronous-promise": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", - "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==" + "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", + "dev": true }, "node_modules/synckit": { "version": "0.8.5", @@ -16039,6 +16705,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.1.0.tgz", "integrity": "sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==", + "dev": true, "dependencies": { "memoizerific": "^1.11.3" } @@ -16064,6 +16731,26 @@ "node": ">=8" } }, + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -16220,6 +16907,26 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16333,6 +17040,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } @@ -16364,12 +17072,14 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, "engines": { "node": ">=6.10" } @@ -16439,6 +17149,23 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/tsx": { + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.7.tgz", + "integrity": "sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==", + "dev": true, + "dependencies": { + "@esbuild-kit/cjs-loader": "^2.4.2", + "@esbuild-kit/core-utils": "^3.0.0", + "@esbuild-kit/esm-loader": "^2.5.5" + }, + "bin": { + "tsx": "dist/cli.js" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", @@ -16539,6 +17266,7 @@ "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -16679,6 +17407,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -16900,7 +17629,8 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { "version": "5.88.1", @@ -17083,6 +17813,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -17121,6 +17852,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", @@ -17154,6 +17886,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -17169,7 +17902,8 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -17188,6 +17922,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/app/package.json b/app/package.json index 565f01bf1..adb71f3e9 100644 --- a/app/package.json +++ b/app/package.json @@ -7,13 +7,17 @@ "build": "next build", "start": "next start", "lint": "next lint", + "test": "glob -c \"node --loader tsx --no-warnings --test\" \"./tests/**/*.test.ts\"", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "db:migrate": "sequelize-cli db:migrate", + "db:migrate:undo": "sequelize-cli db:migrate:undo", "db:seed": "sequelize-cli db:seed:all", "db:gen-migration": "sequelize-cli migration:generate --name" }, "dependencies": { + "@storybook/react": "^7.0.27", + "@storybook/testing-library": "^0.0.14-next.2", "@types/http-errors": "^2.0.1", "@types/node": "20.4.2", "@types/react": "18.2.15", @@ -21,6 +25,7 @@ "autoprefixer": "10.4.14", "eslint": "8.44.0", "eslint-config-next": "13.4.10", + "eslint-plugin-storybook": "^0.6.12", "http-errors": "^2.0.0", "next": "13.4.10", "pg": "^8.11.1", @@ -31,10 +36,7 @@ "sequelize": "^6.32.1", "tailwindcss": "3.3.3", "typescript": "5.1.6", - "zod": "^3.21.4", - "eslint-plugin-storybook": "^0.6.12", - "@storybook/react": "^7.0.27", - "@storybook/testing-library": "^0.0.14-next.2" + "zod": "^3.21.4" }, "devDependencies": { "@storybook/addon-essentials": "^7.0.27", @@ -42,8 +44,16 @@ "@storybook/addon-links": "^7.0.27", "@storybook/blocks": "^7.0.27", "@storybook/nextjs": "^7.0.27", + "@storybook/react": "^7.0.27", + "@storybook/testing-library": "^0.0.14-next.2", + "@types/glob": "^8.1.0", + "@types/pg": "^8.10.2", + "eslint-plugin-storybook": "^0.6.12", + "glob": "^10.3.3", + "sequelize-auto": "^0.8.8", "sequelize-cli": "^6.6.1", - "storybook": "^7.0.27" + "storybook": "^7.0.27", + "tsx": "^3.12.7" }, "engines": { "node": ">=20.5.0" diff --git a/app/scripts/model-params.json b/app/scripts/model-params.json new file mode 100644 index 000000000..b69bed566 --- /dev/null +++ b/app/scripts/model-params.json @@ -0,0 +1,4 @@ +{ + "createdAt": "created", + "updatedAt": "last_updated" +} diff --git a/app/scripts/sequelize-auto.sh b/app/scripts/sequelize-auto.sh new file mode 100755 index 000000000..7f63ed364 --- /dev/null +++ b/app/scripts/sequelize-auto.sh @@ -0,0 +1,3 @@ +#!/bin/bash +npx sequelize-auto -h localhost -d citycatalyst -u citycatalyst --dialect postgres -o src/models -l ts --caseProp c --additional scripts/model-params.json -T SequelizeMeta + diff --git a/app/src/app/api/v0/city/[city]/inventory/[year]/route.ts b/app/src/app/api/v0/city/[city]/inventory/[year]/route.ts new file mode 100644 index 000000000..7a9a3f671 --- /dev/null +++ b/app/src/app/api/v0/city/[city]/inventory/[year]/route.ts @@ -0,0 +1,54 @@ +import { db } from "@/models"; +import { City } from "@/models/City"; +import { apiHandler } from "@/util/api"; +import { createCityRequest, createInventoryRequest } from "@/util/validation"; +import createHttpError from "http-errors"; +import { NextRequest, NextResponse } from "next/server"; +import { randomUUID } from "node:crypto"; + +export const GET = apiHandler(async (_req: NextRequest, { params }) => { + const city = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + const inventory = await db.models.Inventory.findOne({ where: { cityId: city.cityId, year: params.year } }); + if (!inventory) { + throw new createHttpError.NotFound('Inventory not found'); + } + + return NextResponse.json({ data: city }); +}); + +export const DELETE = apiHandler(async (_req: NextRequest, { params }) => { + const city = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + const inventory = await db.models.Inventory.findOne({ where: { cityId: city.cityId, year: params.year } }); + if (!inventory) { + throw new createHttpError.NotFound('Inventory not found'); + } + + await inventory.destroy(); + return NextResponse.json({ data: city, deleted: true }); +}); + + +export const PATCH = apiHandler(async (req: NextRequest, { params }) => { + const body = createInventoryRequest.parse(await req.json()); + + let city: City = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + let inventory = await db.models.Inventory.findOne({ where: { cityId: city.cityId, year: params.year } }); + if (!inventory) { + throw new createHttpError.NotFound('Inventory not found'); + } + inventory = await inventory.update(body); + return NextResponse.json({ data: inventory }); +}); + diff --git a/app/src/app/api/v0/city/[city]/inventory/route.ts b/app/src/app/api/v0/city/[city]/inventory/route.ts new file mode 100644 index 000000000..cd4ecca77 --- /dev/null +++ b/app/src/app/api/v0/city/[city]/inventory/route.ts @@ -0,0 +1,23 @@ +import { db } from "@/models"; +import { apiHandler } from "@/util/api"; +import { createInventoryRequest } from "@/util/validation"; +import createHttpError from "http-errors"; +import { NextRequest, NextResponse } from "next/server"; +import { randomUUID } from "node:crypto"; + +export const POST = apiHandler(async (req: NextRequest, { params }) => { + const body = createInventoryRequest.parse(await req.json()); + + const city = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + const inventory = await db.models.Inventory.create({ + inventoryId: randomUUID(), + cityId: city.cityId, + ...body, + }); + return NextResponse.json({ data: inventory }); +}); + diff --git a/app/src/app/api/v0/city/[city]/route.ts b/app/src/app/api/v0/city/[city]/route.ts new file mode 100644 index 000000000..bd82f1fc4 --- /dev/null +++ b/app/src/app/api/v0/city/[city]/route.ts @@ -0,0 +1,40 @@ +import { db } from "@/models"; +import { City } from "@/models/City"; +import { apiHandler } from "@/util/api"; +import { createCityRequest } from "@/util/validation"; +import createHttpError from "http-errors"; +import { NextRequest, NextResponse } from "next/server"; +import { randomUUID } from "node:crypto"; + +export const GET = apiHandler(async (_req: NextRequest, { params }) => { + const city = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + return NextResponse.json({ data: city }); +}); + +export const DELETE = apiHandler(async (_req: NextRequest, { params }) => { + const city = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + await city.destroy(); + return NextResponse.json({ data: city, deleted: true }); +}); + + +export const PATCH = apiHandler(async (req: NextRequest, { params }) => { + const body = createCityRequest.parse(await req.json()); + + let city: City = await db.models.City.findOne({ where: { locode: params.city } }); + if (!city) { + throw new createHttpError.NotFound('City not found'); + } + + city = await city.update(body); + return NextResponse.json({ data: city }); +}); + diff --git a/app/src/app/api/v0/city/route.ts b/app/src/app/api/v0/city/route.ts new file mode 100644 index 000000000..77bad4594 --- /dev/null +++ b/app/src/app/api/v0/city/route.ts @@ -0,0 +1,25 @@ +import { db } from "@/models"; +import { apiHandler } from "@/util/api"; +import { createCityRequest } from "@/util/validation"; +import createHttpError from "http-errors"; +import { NextRequest, NextResponse } from "next/server"; +import { randomUUID } from "node:crypto"; +import { ValidationError } from "sequelize"; + +export const POST = apiHandler(async (req: NextRequest) => { + try { + const body = createCityRequest.parse(await req.json()); + const city = await db.models.City.create({ + cityId: randomUUID(), + ...body, + }); + return NextResponse.json({ data: city }); + } catch(error) { + if (error instanceof ValidationError && error.name === 'SequelizeUniqueConstraintError') { + throw new createHttpError.BadRequest('Locode exists already'); + } else { + throw error; + } + } +}); + diff --git a/app/src/app/api/v1/route.ts b/app/src/app/api/v0/route.ts similarity index 100% rename from app/src/app/api/v1/route.ts rename to app/src/app/api/v0/route.ts diff --git a/app/src/models/ActivityData.ts b/app/src/models/ActivityData.ts new file mode 100644 index 000000000..881efad9b --- /dev/null +++ b/app/src/models/ActivityData.ts @@ -0,0 +1,130 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceActivityData, DataSourceActivityDataId } from './DataSourceActivityData'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; +import type { Scope, ScopeId } from './Scope'; +import type { SubCategory, SubCategoryId } from './SubCategory'; + +export interface ActivityDataAttributes { + activitydataId: string; + activitydata?: string; + subcategoryId?: string; + scopeId?: string; + reportinglevelId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type ActivityDataPk = "activitydataId"; +export type ActivityDataId = ActivityData[ActivityDataPk]; +export type ActivityDataOptionalAttributes = "activitydata" | "subcategoryId" | "scopeId" | "reportinglevelId" | "created" | "lastUpdated"; +export type ActivityDataCreationAttributes = Optional; + +export class ActivityData extends Model implements ActivityDataAttributes { + activitydataId!: string; + activitydata?: string; + subcategoryId?: string; + scopeId?: string; + reportinglevelId?: string; + created?: Date; + lastUpdated?: Date; + + // ActivityData belongsToMany DataSource via activitydataId and datasourceId + datasourceIdDataSources!: DataSource[]; + getDatasourceIdDataSources!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSources!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSource!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSources!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSource!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSource!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSources!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSource!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSources!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSources!: Sequelize.BelongsToManyCountAssociationsMixin; + // ActivityData hasMany DataSourceActivityData via activitydataId + dataSourceActivityData!: DataSourceActivityData[]; + getDataSourceActivityData!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceActivityData!: Sequelize.HasManySetAssociationsMixin; + addDataSourceActivityDatum!: Sequelize.HasManyAddAssociationMixin; + addDataSourceActivityData!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceActivityDatum!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceActivityDatum!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceActivityData!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceActivityDatum!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceActivityData!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceActivityData!: Sequelize.HasManyCountAssociationsMixin; + // ActivityData belongsTo ReportingLevel via reportinglevelId + reportinglevel!: ReportingLevel; + getReportinglevel!: Sequelize.BelongsToGetAssociationMixin; + setReportinglevel!: Sequelize.BelongsToSetAssociationMixin; + createReportinglevel!: Sequelize.BelongsToCreateAssociationMixin; + // ActivityData belongsTo Scope via scopeId + scope!: Scope; + getScope!: Sequelize.BelongsToGetAssociationMixin; + setScope!: Sequelize.BelongsToSetAssociationMixin; + createScope!: Sequelize.BelongsToCreateAssociationMixin; + // ActivityData belongsTo SubCategory via subcategoryId + subcategory!: SubCategory; + getSubcategory!: Sequelize.BelongsToGetAssociationMixin; + setSubcategory!: Sequelize.BelongsToSetAssociationMixin; + createSubcategory!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof ActivityData { + return ActivityData.init({ + activitydataId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'activitydata_id' + }, + activitydata: { + type: DataTypes.STRING(255), + allowNull: true + }, + subcategoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SubCategory', + key: 'subcategory_id' + }, + field: 'subcategory_id' + }, + scopeId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Scope', + key: 'scope_id' + }, + field: 'scope_id' + }, + reportinglevelId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'ReportingLevel', + key: 'reportinglevel_id' + }, + field: 'reportinglevel_id' + } + }, { + sequelize, + tableName: 'ActivityData', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "ActivityData_pkey", + unique: true, + fields: [ + { name: "activitydata_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/City.ts b/app/src/models/City.ts new file mode 100644 index 000000000..7ebdc7f65 --- /dev/null +++ b/app/src/models/City.ts @@ -0,0 +1,143 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { CityUser, CityUserId } from './CityUser'; +import type { GDP, GDPId } from './GDP'; +import type { Inventory, InventoryId } from './Inventory'; +import type { Population, PopulationId } from './Population'; + +export interface CityAttributes { + cityId: string; + locode?: string; + name?: string; + shape?: object; + country?: string; + region?: string; + area?: number; + created?: Date; + lastUpdated?: Date; +} + +export type CityPk = "cityId"; +export type CityId = City[CityPk]; +export type CityOptionalAttributes = "locode" | "name" | "shape" | "country" | "region" | "area" | "created" | "lastUpdated"; +export type CityCreationAttributes = Optional; + +export class City extends Model implements CityAttributes { + cityId!: string; + locode?: string; + name?: string; + shape?: object; + country?: string; + region?: string; + area?: number; + created?: Date; + lastUpdated?: Date; + + // City hasMany CityUser via cityId + cityUsers!: CityUser[]; + getCityUsers!: Sequelize.HasManyGetAssociationsMixin; + setCityUsers!: Sequelize.HasManySetAssociationsMixin; + addCityUser!: Sequelize.HasManyAddAssociationMixin; + addCityUsers!: Sequelize.HasManyAddAssociationsMixin; + createCityUser!: Sequelize.HasManyCreateAssociationMixin; + removeCityUser!: Sequelize.HasManyRemoveAssociationMixin; + removeCityUsers!: Sequelize.HasManyRemoveAssociationsMixin; + hasCityUser!: Sequelize.HasManyHasAssociationMixin; + hasCityUsers!: Sequelize.HasManyHasAssociationsMixin; + countCityUsers!: Sequelize.HasManyCountAssociationsMixin; + // City hasMany GDP via cityId + gdps!: GDP[]; + getGdps!: Sequelize.HasManyGetAssociationsMixin; + setGdps!: Sequelize.HasManySetAssociationsMixin; + addGdp!: Sequelize.HasManyAddAssociationMixin; + addGdps!: Sequelize.HasManyAddAssociationsMixin; + createGdp!: Sequelize.HasManyCreateAssociationMixin; + removeGdp!: Sequelize.HasManyRemoveAssociationMixin; + removeGdps!: Sequelize.HasManyRemoveAssociationsMixin; + hasGdp!: Sequelize.HasManyHasAssociationMixin; + hasGdps!: Sequelize.HasManyHasAssociationsMixin; + countGdps!: Sequelize.HasManyCountAssociationsMixin; + // City hasMany Inventory via cityId + inventories!: Inventory[]; + getInventories!: Sequelize.HasManyGetAssociationsMixin; + setInventories!: Sequelize.HasManySetAssociationsMixin; + addInventory!: Sequelize.HasManyAddAssociationMixin; + addInventories!: Sequelize.HasManyAddAssociationsMixin; + createInventory!: Sequelize.HasManyCreateAssociationMixin; + removeInventory!: Sequelize.HasManyRemoveAssociationMixin; + removeInventories!: Sequelize.HasManyRemoveAssociationsMixin; + hasInventory!: Sequelize.HasManyHasAssociationMixin; + hasInventories!: Sequelize.HasManyHasAssociationsMixin; + countInventories!: Sequelize.HasManyCountAssociationsMixin; + // City hasMany Population via cityId + populations!: Population[]; + getPopulations!: Sequelize.HasManyGetAssociationsMixin; + setPopulations!: Sequelize.HasManySetAssociationsMixin; + addPopulation!: Sequelize.HasManyAddAssociationMixin; + addPopulations!: Sequelize.HasManyAddAssociationsMixin; + createPopulation!: Sequelize.HasManyCreateAssociationMixin; + removePopulation!: Sequelize.HasManyRemoveAssociationMixin; + removePopulations!: Sequelize.HasManyRemoveAssociationsMixin; + hasPopulation!: Sequelize.HasManyHasAssociationMixin; + hasPopulations!: Sequelize.HasManyHasAssociationsMixin; + countPopulations!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof City { + return City.init({ + cityId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'city_id' + }, + locode: { + type: DataTypes.STRING(255), + allowNull: true, + unique: "City_locode_key" + }, + name: { + type: DataTypes.STRING(255), + allowNull: true + }, + shape: { + type: DataTypes.JSONB, + allowNull: true + }, + country: { + type: DataTypes.STRING(255), + allowNull: true + }, + region: { + type: DataTypes.STRING(255), + allowNull: true + }, + area: { + type: DataTypes.BIGINT, + allowNull: true + } + }, { + sequelize, + tableName: 'City', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "City_locode_key", + unique: true, + fields: [ + { name: "locode" }, + ] + }, + { + name: "City_pkey", + unique: true, + fields: [ + { name: "city_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/CityUser.ts b/app/src/models/CityUser.ts new file mode 100644 index 000000000..e5cd3670e --- /dev/null +++ b/app/src/models/CityUser.ts @@ -0,0 +1,81 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { City, CityId } from './City'; +import type { User, UserId } from './User'; + +export interface CityUserAttributes { + cityUserId: string; + userId?: string; + cityId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type CityUserPk = "cityUserId"; +export type CityUserId = CityUser[CityUserPk]; +export type CityUserOptionalAttributes = "userId" | "cityId" | "created" | "lastUpdated"; +export type CityUserCreationAttributes = Optional; + +export class CityUser extends Model implements CityUserAttributes { + cityUserId!: string; + userId?: string; + cityId?: string; + created?: Date; + lastUpdated?: Date; + + // CityUser belongsTo City via cityId + city!: City; + getCity!: Sequelize.BelongsToGetAssociationMixin; + setCity!: Sequelize.BelongsToSetAssociationMixin; + createCity!: Sequelize.BelongsToCreateAssociationMixin; + // CityUser belongsTo User via userId + user!: User; + getUser!: Sequelize.BelongsToGetAssociationMixin; + setUser!: Sequelize.BelongsToSetAssociationMixin; + createUser!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof CityUser { + return CityUser.init({ + cityUserId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'city_user_id' + }, + userId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'User', + key: 'user_id' + }, + field: 'user_id' + }, + cityId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'City', + key: 'city_id' + }, + field: 'city_id' + } + }, { + sequelize, + tableName: 'CityUser', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "CityUser_pkey", + unique: true, + fields: [ + { name: "city_user_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSource.ts b/app/src/models/DataSource.ts new file mode 100644 index 000000000..f352fbb30 --- /dev/null +++ b/app/src/models/DataSource.ts @@ -0,0 +1,442 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ActivityData, ActivityDataId } from './ActivityData'; +import type { DataSourceActivityData, DataSourceActivityDataId } from './DataSourceActivityData'; +import type { DataSourceEmissionsFactor, DataSourceEmissionsFactorId } from './DataSourceEmissionsFactor'; +import type { DataSourceGHGs, DataSourceGHGsId } from './DataSourceGHGs'; +import type { DataSourceMethodology, DataSourceMethodologyId } from './DataSourceMethodology'; +import type { DataSourceReportingLevel, DataSourceReportingLevelId } from './DataSourceReportingLevel'; +import type { DataSourceScope, DataSourceScopeId } from './DataSourceScope'; +import type { DataSourceSector, DataSourceSectorId } from './DataSourceSector'; +import type { DataSourceSubCategory, DataSourceSubCategoryId } from './DataSourceSubCategory'; +import type { DataSourceSubSector, DataSourceSubSectorId } from './DataSourceSubSector'; +import type { EmissionsFactor, EmissionsFactorId } from './EmissionsFactor'; +import type { GDP, GDPId } from './GDP'; +import type { GHGs, GHGsId } from './GHGs'; +import type { Methodology, MethodologyId } from './Methodology'; +import type { Population, PopulationId } from './Population'; +import type { Publisher, PublisherId } from './Publisher'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; +import type { Scope, ScopeId } from './Scope'; +import type { Sector, SectorId } from './Sector'; +import type { SubCategory, SubCategoryId } from './SubCategory'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface DataSourceAttributes { + datasourceId: string; + name?: string; + url?: string; + description?: string; + accessType?: string; + geographicalLocation?: string; + latestAccountingYear?: number; + frequencyOfUpdate?: string; + spacialResolution?: string; + language?: string; + accessibility?: string; + dataQuality?: string; + notes?: string; + units?: string; + methodologyUrl?: string; + publisherId?: string; + retrievalMethod?: string; + apiEndpoint?: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourcePk = "datasourceId"; +export type DataSourceId = DataSource[DataSourcePk]; +export type DataSourceOptionalAttributes = "name" | "url" | "description" | "accessType" | "geographicalLocation" | "latestAccountingYear" | "frequencyOfUpdate" | "spacialResolution" | "language" | "accessibility" | "dataQuality" | "notes" | "units" | "methodologyUrl" | "publisherId" | "retrievalMethod" | "apiEndpoint" | "created" | "lastUpdated"; +export type DataSourceCreationAttributes = Optional; + +export class DataSource extends Model implements DataSourceAttributes { + datasourceId!: string; + name?: string; + url?: string; + description?: string; + accessType?: string; + geographicalLocation?: string; + latestAccountingYear?: number; + frequencyOfUpdate?: string; + spacialResolution?: string; + language?: string; + accessibility?: string; + dataQuality?: string; + notes?: string; + units?: string; + methodologyUrl?: string; + publisherId?: string; + retrievalMethod?: string; + apiEndpoint?: string; + created?: Date; + lastUpdated?: Date; + + // DataSource belongsToMany ActivityData via datasourceId and activitydataId + activitydataIdActivityData!: ActivityData[]; + getActivitydataIdActivityData!: Sequelize.BelongsToManyGetAssociationsMixin; + setActivitydataIdActivityData!: Sequelize.BelongsToManySetAssociationsMixin; + addActivitydataIdActivityDatum!: Sequelize.BelongsToManyAddAssociationMixin; + addActivitydataIdActivityData!: Sequelize.BelongsToManyAddAssociationsMixin; + createActivitydataIdActivityDatum!: Sequelize.BelongsToManyCreateAssociationMixin; + removeActivitydataIdActivityDatum!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeActivitydataIdActivityData!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasActivitydataIdActivityDatum!: Sequelize.BelongsToManyHasAssociationMixin; + hasActivitydataIdActivityData!: Sequelize.BelongsToManyHasAssociationsMixin; + countActivitydataIdActivityData!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource hasMany DataSourceActivityData via datasourceId + dataSourceActivityData!: DataSourceActivityData[]; + getDataSourceActivityData!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceActivityData!: Sequelize.HasManySetAssociationsMixin; + addDataSourceActivityDatum!: Sequelize.HasManyAddAssociationMixin; + addDataSourceActivityData!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceActivityDatum!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceActivityDatum!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceActivityData!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceActivityDatum!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceActivityData!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceActivityData!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceEmissionsFactor via datasourceId + dataSourceEmissionsFactors!: DataSourceEmissionsFactor[]; + getDataSourceEmissionsFactors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceEmissionsFactors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceEmissionsFactor!: Sequelize.HasManyAddAssociationMixin; + addDataSourceEmissionsFactors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceEmissionsFactor!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceEmissionsFactor!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceEmissionsFactors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceEmissionsFactor!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceEmissionsFactors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceEmissionsFactors!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceGHGs via datasourceId + dataSourceGhgs!: DataSourceGHGs[]; + getDataSourceGhgs!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceGhgs!: Sequelize.HasManySetAssociationsMixin; + addDataSourceGhg!: Sequelize.HasManyAddAssociationMixin; + addDataSourceGhgs!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceGhg!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceGhg!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceGhgs!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceGhg!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceGhgs!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceGhgs!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceMethodology via datasourceId + dataSourceMethodologies!: DataSourceMethodology[]; + getDataSourceMethodologies!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceMethodologies!: Sequelize.HasManySetAssociationsMixin; + addDataSourceMethodology!: Sequelize.HasManyAddAssociationMixin; + addDataSourceMethodologies!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceMethodology!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceMethodology!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceMethodologies!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceMethodology!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceMethodologies!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceMethodologies!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceReportingLevel via datasourceId + dataSourceReportingLevels!: DataSourceReportingLevel[]; + getDataSourceReportingLevels!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceReportingLevels!: Sequelize.HasManySetAssociationsMixin; + addDataSourceReportingLevel!: Sequelize.HasManyAddAssociationMixin; + addDataSourceReportingLevels!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceReportingLevel!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceReportingLevel!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceReportingLevels!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceReportingLevel!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceReportingLevels!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceReportingLevels!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceScope via datasourceId + dataSourceScopes!: DataSourceScope[]; + getDataSourceScopes!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceScopes!: Sequelize.HasManySetAssociationsMixin; + addDataSourceScope!: Sequelize.HasManyAddAssociationMixin; + addDataSourceScopes!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceScope!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceScope!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceScopes!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceScope!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceScopes!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceScopes!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceSector via datasourceId + dataSourceSectors!: DataSourceSector[]; + getDataSourceSectors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSectors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSector!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSectors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSector!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSector!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSectors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSector!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSectors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSectors!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceSubCategory via datasourceId + dataSourceSubCategories!: DataSourceSubCategory[]; + getDataSourceSubCategories!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSubCategories!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSubCategory!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSubCategories!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSubCategory!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSubCategory!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSubCategories!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSubCategory!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSubCategories!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSubCategories!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany DataSourceSubSector via datasourceId + dataSourceSubSectors!: DataSourceSubSector[]; + getDataSourceSubSectors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSubSectors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSubSector!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSubSectors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSubSector!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSubSector!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSubSectors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSubSector!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSubSectors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSubSectors!: Sequelize.HasManyCountAssociationsMixin; + // DataSource belongsToMany EmissionsFactor via datasourceId and emissionsFactorId + emissionsFactorIdEmissionsFactors!: EmissionsFactor[]; + getEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManyGetAssociationsMixin; + setEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManySetAssociationsMixin; + addEmissionsFactorIdEmissionsFactor!: Sequelize.BelongsToManyAddAssociationMixin; + addEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManyAddAssociationsMixin; + createEmissionsFactorIdEmissionsFactor!: Sequelize.BelongsToManyCreateAssociationMixin; + removeEmissionsFactorIdEmissionsFactor!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasEmissionsFactorIdEmissionsFactor!: Sequelize.BelongsToManyHasAssociationMixin; + hasEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManyHasAssociationsMixin; + countEmissionsFactorIdEmissionsFactors!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource hasMany GDP via datasourceId + gdps!: GDP[]; + getGdps!: Sequelize.HasManyGetAssociationsMixin; + setGdps!: Sequelize.HasManySetAssociationsMixin; + addGdp!: Sequelize.HasManyAddAssociationMixin; + addGdps!: Sequelize.HasManyAddAssociationsMixin; + createGdp!: Sequelize.HasManyCreateAssociationMixin; + removeGdp!: Sequelize.HasManyRemoveAssociationMixin; + removeGdps!: Sequelize.HasManyRemoveAssociationsMixin; + hasGdp!: Sequelize.HasManyHasAssociationMixin; + hasGdps!: Sequelize.HasManyHasAssociationsMixin; + countGdps!: Sequelize.HasManyCountAssociationsMixin; + // DataSource belongsToMany GHGs via datasourceId and ghgId + ghgIdGhgs!: GHGs[]; + getGhgIdGhgs!: Sequelize.BelongsToManyGetAssociationsMixin; + setGhgIdGhgs!: Sequelize.BelongsToManySetAssociationsMixin; + addGhgIdGhg!: Sequelize.BelongsToManyAddAssociationMixin; + addGhgIdGhgs!: Sequelize.BelongsToManyAddAssociationsMixin; + createGhgIdGhg!: Sequelize.BelongsToManyCreateAssociationMixin; + removeGhgIdGhg!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeGhgIdGhgs!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasGhgIdGhg!: Sequelize.BelongsToManyHasAssociationMixin; + hasGhgIdGhgs!: Sequelize.BelongsToManyHasAssociationsMixin; + countGhgIdGhgs!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsToMany Methodology via datasourceId and methodologyId + methodologyIdMethodologies!: Methodology[]; + getMethodologyIdMethodologies!: Sequelize.BelongsToManyGetAssociationsMixin; + setMethodologyIdMethodologies!: Sequelize.BelongsToManySetAssociationsMixin; + addMethodologyIdMethodology!: Sequelize.BelongsToManyAddAssociationMixin; + addMethodologyIdMethodologies!: Sequelize.BelongsToManyAddAssociationsMixin; + createMethodologyIdMethodology!: Sequelize.BelongsToManyCreateAssociationMixin; + removeMethodologyIdMethodology!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeMethodologyIdMethodologies!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasMethodologyIdMethodology!: Sequelize.BelongsToManyHasAssociationMixin; + hasMethodologyIdMethodologies!: Sequelize.BelongsToManyHasAssociationsMixin; + countMethodologyIdMethodologies!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource hasMany Methodology via datasourceId + methodologies!: Methodology[]; + getMethodologies!: Sequelize.HasManyGetAssociationsMixin; + setMethodologies!: Sequelize.HasManySetAssociationsMixin; + addMethodology!: Sequelize.HasManyAddAssociationMixin; + addMethodologies!: Sequelize.HasManyAddAssociationsMixin; + createMethodology!: Sequelize.HasManyCreateAssociationMixin; + removeMethodology!: Sequelize.HasManyRemoveAssociationMixin; + removeMethodologies!: Sequelize.HasManyRemoveAssociationsMixin; + hasMethodology!: Sequelize.HasManyHasAssociationMixin; + hasMethodologies!: Sequelize.HasManyHasAssociationsMixin; + countMethodologies!: Sequelize.HasManyCountAssociationsMixin; + // DataSource hasMany Population via datasourceId + populations!: Population[]; + getPopulations!: Sequelize.HasManyGetAssociationsMixin; + setPopulations!: Sequelize.HasManySetAssociationsMixin; + addPopulation!: Sequelize.HasManyAddAssociationMixin; + addPopulations!: Sequelize.HasManyAddAssociationsMixin; + createPopulation!: Sequelize.HasManyCreateAssociationMixin; + removePopulation!: Sequelize.HasManyRemoveAssociationMixin; + removePopulations!: Sequelize.HasManyRemoveAssociationsMixin; + hasPopulation!: Sequelize.HasManyHasAssociationMixin; + hasPopulations!: Sequelize.HasManyHasAssociationsMixin; + countPopulations!: Sequelize.HasManyCountAssociationsMixin; + // DataSource belongsToMany ReportingLevel via datasourceId and reportinglevelId + reportinglevelIdReportingLevels!: ReportingLevel[]; + getReportinglevelIdReportingLevels!: Sequelize.BelongsToManyGetAssociationsMixin; + setReportinglevelIdReportingLevels!: Sequelize.BelongsToManySetAssociationsMixin; + addReportinglevelIdReportingLevel!: Sequelize.BelongsToManyAddAssociationMixin; + addReportinglevelIdReportingLevels!: Sequelize.BelongsToManyAddAssociationsMixin; + createReportinglevelIdReportingLevel!: Sequelize.BelongsToManyCreateAssociationMixin; + removeReportinglevelIdReportingLevel!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeReportinglevelIdReportingLevels!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasReportinglevelIdReportingLevel!: Sequelize.BelongsToManyHasAssociationMixin; + hasReportinglevelIdReportingLevels!: Sequelize.BelongsToManyHasAssociationsMixin; + countReportinglevelIdReportingLevels!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsToMany Scope via datasourceId and scopeId + scopeIdScopes!: Scope[]; + getScopeIdScopes!: Sequelize.BelongsToManyGetAssociationsMixin; + setScopeIdScopes!: Sequelize.BelongsToManySetAssociationsMixin; + addScopeIdScope!: Sequelize.BelongsToManyAddAssociationMixin; + addScopeIdScopes!: Sequelize.BelongsToManyAddAssociationsMixin; + createScopeIdScope!: Sequelize.BelongsToManyCreateAssociationMixin; + removeScopeIdScope!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeScopeIdScopes!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasScopeIdScope!: Sequelize.BelongsToManyHasAssociationMixin; + hasScopeIdScopes!: Sequelize.BelongsToManyHasAssociationsMixin; + countScopeIdScopes!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsToMany Sector via datasourceId and sectorId + sectorIdSectors!: Sector[]; + getSectorIdSectors!: Sequelize.BelongsToManyGetAssociationsMixin; + setSectorIdSectors!: Sequelize.BelongsToManySetAssociationsMixin; + addSectorIdSector!: Sequelize.BelongsToManyAddAssociationMixin; + addSectorIdSectors!: Sequelize.BelongsToManyAddAssociationsMixin; + createSectorIdSector!: Sequelize.BelongsToManyCreateAssociationMixin; + removeSectorIdSector!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeSectorIdSectors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasSectorIdSector!: Sequelize.BelongsToManyHasAssociationMixin; + hasSectorIdSectors!: Sequelize.BelongsToManyHasAssociationsMixin; + countSectorIdSectors!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsToMany SubCategory via datasourceId and subcategoryId + subcategoryIdSubCategories!: SubCategory[]; + getSubcategoryIdSubCategories!: Sequelize.BelongsToManyGetAssociationsMixin; + setSubcategoryIdSubCategories!: Sequelize.BelongsToManySetAssociationsMixin; + addSubcategoryIdSubCategory!: Sequelize.BelongsToManyAddAssociationMixin; + addSubcategoryIdSubCategories!: Sequelize.BelongsToManyAddAssociationsMixin; + createSubcategoryIdSubCategory!: Sequelize.BelongsToManyCreateAssociationMixin; + removeSubcategoryIdSubCategory!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeSubcategoryIdSubCategories!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasSubcategoryIdSubCategory!: Sequelize.BelongsToManyHasAssociationMixin; + hasSubcategoryIdSubCategories!: Sequelize.BelongsToManyHasAssociationsMixin; + countSubcategoryIdSubCategories!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsToMany SubSector via datasourceId and subsectorId + subsectorIdSubSectors!: SubSector[]; + getSubsectorIdSubSectors!: Sequelize.BelongsToManyGetAssociationsMixin; + setSubsectorIdSubSectors!: Sequelize.BelongsToManySetAssociationsMixin; + addSubsectorIdSubSector!: Sequelize.BelongsToManyAddAssociationMixin; + addSubsectorIdSubSectors!: Sequelize.BelongsToManyAddAssociationsMixin; + createSubsectorIdSubSector!: Sequelize.BelongsToManyCreateAssociationMixin; + removeSubsectorIdSubSector!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeSubsectorIdSubSectors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasSubsectorIdSubSector!: Sequelize.BelongsToManyHasAssociationMixin; + hasSubsectorIdSubSectors!: Sequelize.BelongsToManyHasAssociationsMixin; + countSubsectorIdSubSectors!: Sequelize.BelongsToManyCountAssociationsMixin; + // DataSource belongsTo Publisher via publisherId + publisher!: Publisher; + getPublisher!: Sequelize.BelongsToGetAssociationMixin; + setPublisher!: Sequelize.BelongsToSetAssociationMixin; + createPublisher!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSource { + return DataSource.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'datasource_id' + }, + name: { + type: DataTypes.STRING(255), + allowNull: true + }, + url: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'URL' + }, + description: { + type: DataTypes.TEXT, + allowNull: true + }, + accessType: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'access_type' + }, + geographicalLocation: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'geographical_location' + }, + latestAccountingYear: { + type: DataTypes.INTEGER, + allowNull: true, + field: 'latest_accounting_year' + }, + frequencyOfUpdate: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'frequency_of_update' + }, + spacialResolution: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'spacial_resolution' + }, + language: { + type: DataTypes.STRING(255), + allowNull: true + }, + accessibility: { + type: DataTypes.STRING(255), + allowNull: true + }, + dataQuality: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'data_quality' + }, + notes: { + type: DataTypes.TEXT, + allowNull: true + }, + units: { + type: DataTypes.STRING(255), + allowNull: true + }, + methodologyUrl: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'methodology_url' + }, + publisherId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Publisher', + key: 'publisher_id' + }, + field: 'publisher_id' + }, + retrievalMethod: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'retrieval_method' + }, + apiEndpoint: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'api_endpoint' + } + }, { + sequelize, + tableName: 'DataSource', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSource_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceActivityData.ts b/app/src/models/DataSourceActivityData.ts new file mode 100644 index 000000000..82533b1b3 --- /dev/null +++ b/app/src/models/DataSourceActivityData.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ActivityData, ActivityDataId } from './ActivityData'; +import type { DataSource, DataSourceId } from './DataSource'; + +export interface DataSourceActivityDataAttributes { + datasourceId: string; + activitydataId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceActivityDataPk = "datasourceId" | "activitydataId"; +export type DataSourceActivityDataId = DataSourceActivityData[DataSourceActivityDataPk]; +export type DataSourceActivityDataOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceActivityDataCreationAttributes = Optional; + +export class DataSourceActivityData extends Model implements DataSourceActivityDataAttributes { + datasourceId!: string; + activitydataId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceActivityData belongsTo ActivityData via activitydataId + activitydatum!: ActivityData; + getActivitydatum!: Sequelize.BelongsToGetAssociationMixin; + setActivitydatum!: Sequelize.BelongsToSetAssociationMixin; + createActivitydatum!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceActivityData belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceActivityData { + return DataSourceActivityData.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + activitydataId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'ActivityData', + key: 'activitydata_id' + }, + field: 'activitydata_id' + } + }, { + sequelize, + tableName: 'DataSourceActivityData', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceActivityData_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "activitydata_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceEmissionsFactor.ts b/app/src/models/DataSourceEmissionsFactor.ts new file mode 100644 index 000000000..74619c1fb --- /dev/null +++ b/app/src/models/DataSourceEmissionsFactor.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { EmissionsFactor, EmissionsFactorId } from './EmissionsFactor'; + +export interface DataSourceEmissionsFactorAttributes { + datasourceId: string; + emissionsFactorId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceEmissionsFactorPk = "datasourceId" | "emissionsFactorId"; +export type DataSourceEmissionsFactorId = DataSourceEmissionsFactor[DataSourceEmissionsFactorPk]; +export type DataSourceEmissionsFactorOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceEmissionsFactorCreationAttributes = Optional; + +export class DataSourceEmissionsFactor extends Model implements DataSourceEmissionsFactorAttributes { + datasourceId!: string; + emissionsFactorId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceEmissionsFactor belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceEmissionsFactor belongsTo EmissionsFactor via emissionsFactorId + emissionsFactor!: EmissionsFactor; + getEmissionsFactor!: Sequelize.BelongsToGetAssociationMixin; + setEmissionsFactor!: Sequelize.BelongsToSetAssociationMixin; + createEmissionsFactor!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceEmissionsFactor { + return DataSourceEmissionsFactor.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + emissionsFactorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'EmissionsFactor', + key: 'emissions_factor_id' + }, + field: 'emissions_factor_id' + } + }, { + sequelize, + tableName: 'DataSourceEmissionsFactor', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceEmissionsFactor_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "emissions_factor_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceGHGs.ts b/app/src/models/DataSourceGHGs.ts new file mode 100644 index 000000000..b433f5a64 --- /dev/null +++ b/app/src/models/DataSourceGHGs.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { GHGs, GHGsId } from './GHGs'; + +export interface DataSourceGHGsAttributes { + datasourceId: string; + ghgId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceGHGsPk = "datasourceId" | "ghgId"; +export type DataSourceGHGsId = DataSourceGHGs[DataSourceGHGsPk]; +export type DataSourceGHGsOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceGHGsCreationAttributes = Optional; + +export class DataSourceGHGs extends Model implements DataSourceGHGsAttributes { + datasourceId!: string; + ghgId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceGHGs belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceGHGs belongsTo GHGs via ghgId + ghg!: GHGs; + getGhg!: Sequelize.BelongsToGetAssociationMixin; + setGhg!: Sequelize.BelongsToSetAssociationMixin; + createGhg!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceGHGs { + return DataSourceGHGs.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + ghgId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'GHGs', + key: 'ghg_id' + }, + field: 'ghg_id' + } + }, { + sequelize, + tableName: 'DataSourceGHGs', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceGHGs_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "ghg_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceMethodology.ts b/app/src/models/DataSourceMethodology.ts new file mode 100644 index 000000000..a587883c9 --- /dev/null +++ b/app/src/models/DataSourceMethodology.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { Methodology, MethodologyId } from './Methodology'; + +export interface DataSourceMethodologyAttributes { + datasourceId: string; + methodologyId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceMethodologyPk = "datasourceId" | "methodologyId"; +export type DataSourceMethodologyId = DataSourceMethodology[DataSourceMethodologyPk]; +export type DataSourceMethodologyOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceMethodologyCreationAttributes = Optional; + +export class DataSourceMethodology extends Model implements DataSourceMethodologyAttributes { + datasourceId!: string; + methodologyId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceMethodology belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceMethodology belongsTo Methodology via methodologyId + methodology!: Methodology; + getMethodology!: Sequelize.BelongsToGetAssociationMixin; + setMethodology!: Sequelize.BelongsToSetAssociationMixin; + createMethodology!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceMethodology { + return DataSourceMethodology.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + methodologyId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'Methodology', + key: 'methodology_id' + }, + field: 'methodology_id' + } + }, { + sequelize, + tableName: 'DataSourceMethodology', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceMethodology_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "methodology_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceReportingLevel.ts b/app/src/models/DataSourceReportingLevel.ts new file mode 100644 index 000000000..a48413edd --- /dev/null +++ b/app/src/models/DataSourceReportingLevel.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; + +export interface DataSourceReportingLevelAttributes { + datasourceId: string; + reportinglevelId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceReportingLevelPk = "datasourceId" | "reportinglevelId"; +export type DataSourceReportingLevelId = DataSourceReportingLevel[DataSourceReportingLevelPk]; +export type DataSourceReportingLevelOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceReportingLevelCreationAttributes = Optional; + +export class DataSourceReportingLevel extends Model implements DataSourceReportingLevelAttributes { + datasourceId!: string; + reportinglevelId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceReportingLevel belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceReportingLevel belongsTo ReportingLevel via reportinglevelId + reportinglevel!: ReportingLevel; + getReportinglevel!: Sequelize.BelongsToGetAssociationMixin; + setReportinglevel!: Sequelize.BelongsToSetAssociationMixin; + createReportinglevel!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceReportingLevel { + return DataSourceReportingLevel.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + reportinglevelId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'ReportingLevel', + key: 'reportinglevel_id' + }, + field: 'reportinglevel_id' + } + }, { + sequelize, + tableName: 'DataSourceReportingLevel', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceReportingLevel_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "reportinglevel_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceScope.ts b/app/src/models/DataSourceScope.ts new file mode 100644 index 000000000..b1472f4e1 --- /dev/null +++ b/app/src/models/DataSourceScope.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { Scope, ScopeId } from './Scope'; + +export interface DataSourceScopeAttributes { + datasourceId: string; + scopeId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceScopePk = "datasourceId" | "scopeId"; +export type DataSourceScopeId = DataSourceScope[DataSourceScopePk]; +export type DataSourceScopeOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceScopeCreationAttributes = Optional; + +export class DataSourceScope extends Model implements DataSourceScopeAttributes { + datasourceId!: string; + scopeId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceScope belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceScope belongsTo Scope via scopeId + scope!: Scope; + getScope!: Sequelize.BelongsToGetAssociationMixin; + setScope!: Sequelize.BelongsToSetAssociationMixin; + createScope!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceScope { + return DataSourceScope.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + scopeId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'Scope', + key: 'scope_id' + }, + field: 'scope_id' + } + }, { + sequelize, + tableName: 'DataSourceScope', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceScope_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "scope_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceSector.ts b/app/src/models/DataSourceSector.ts new file mode 100644 index 000000000..95f1a7dfa --- /dev/null +++ b/app/src/models/DataSourceSector.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { Sector, SectorId } from './Sector'; + +export interface DataSourceSectorAttributes { + datasourceId: string; + sectorId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceSectorPk = "datasourceId" | "sectorId"; +export type DataSourceSectorId = DataSourceSector[DataSourceSectorPk]; +export type DataSourceSectorOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceSectorCreationAttributes = Optional; + +export class DataSourceSector extends Model implements DataSourceSectorAttributes { + datasourceId!: string; + sectorId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceSector belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceSector belongsTo Sector via sectorId + sector!: Sector; + getSector!: Sequelize.BelongsToGetAssociationMixin; + setSector!: Sequelize.BelongsToSetAssociationMixin; + createSector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceSector { + return DataSourceSector.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + sectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'Sector', + key: 'sector_id' + }, + field: 'sector_id' + } + }, { + sequelize, + tableName: 'DataSourceSector', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceSector_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "sector_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceSubCategory.ts b/app/src/models/DataSourceSubCategory.ts new file mode 100644 index 000000000..818e736b1 --- /dev/null +++ b/app/src/models/DataSourceSubCategory.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { SubCategory, SubCategoryId } from './SubCategory'; + +export interface DataSourceSubCategoryAttributes { + datasourceId: string; + subcategoryId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceSubCategoryPk = "datasourceId" | "subcategoryId"; +export type DataSourceSubCategoryId = DataSourceSubCategory[DataSourceSubCategoryPk]; +export type DataSourceSubCategoryOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceSubCategoryCreationAttributes = Optional; + +export class DataSourceSubCategory extends Model implements DataSourceSubCategoryAttributes { + datasourceId!: string; + subcategoryId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceSubCategory belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceSubCategory belongsTo SubCategory via subcategoryId + subcategory!: SubCategory; + getSubcategory!: Sequelize.BelongsToGetAssociationMixin; + setSubcategory!: Sequelize.BelongsToSetAssociationMixin; + createSubcategory!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceSubCategory { + return DataSourceSubCategory.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + subcategoryId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'SubCategory', + key: 'subcategory_id' + }, + field: 'subcategory_id' + } + }, { + sequelize, + tableName: 'DataSourceSubCategory', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceSubCategory_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "subcategory_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/DataSourceSubSector.ts b/app/src/models/DataSourceSubSector.ts new file mode 100644 index 000000000..7185d0e83 --- /dev/null +++ b/app/src/models/DataSourceSubSector.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface DataSourceSubSectorAttributes { + datasourceId: string; + subsectorId: string; + created?: Date; + lastUpdated?: Date; +} + +export type DataSourceSubSectorPk = "datasourceId" | "subsectorId"; +export type DataSourceSubSectorId = DataSourceSubSector[DataSourceSubSectorPk]; +export type DataSourceSubSectorOptionalAttributes = "created" | "lastUpdated"; +export type DataSourceSubSectorCreationAttributes = Optional; + +export class DataSourceSubSector extends Model implements DataSourceSubSectorAttributes { + datasourceId!: string; + subsectorId!: string; + created?: Date; + lastUpdated?: Date; + + // DataSourceSubSector belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // DataSourceSubSector belongsTo SubSector via subsectorId + subsector!: SubSector; + getSubsector!: Sequelize.BelongsToGetAssociationMixin; + setSubsector!: Sequelize.BelongsToSetAssociationMixin; + createSubsector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof DataSourceSubSector { + return DataSourceSubSector.init({ + datasourceId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + }, + subsectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'SubSector', + key: 'subsector_id' + }, + field: 'subsector_id' + } + }, { + sequelize, + tableName: 'DataSourceSubSector', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "DataSourceSubSector_pkey", + unique: true, + fields: [ + { name: "datasource_id" }, + { name: "subsector_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/EmissionsFactor.ts b/app/src/models/EmissionsFactor.ts new file mode 100644 index 000000000..4fb635ec2 --- /dev/null +++ b/app/src/models/EmissionsFactor.ts @@ -0,0 +1,119 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceEmissionsFactor, DataSourceEmissionsFactorId } from './DataSourceEmissionsFactor'; +import type { SubCategoryValue, SubCategoryValueId } from './SubCategoryValue'; +import type { SubSectorValue, SubSectorValueId } from './SubSectorValue'; + +export interface EmissionsFactorAttributes { + emissionsFactorId: string; + emissionsFactor?: number; + emissionsFactorUrl?: string; + units?: string; + created?: Date; + lastUpdated?: Date; +} + +export type EmissionsFactorPk = "emissionsFactorId"; +export type EmissionsFactorId = EmissionsFactor[EmissionsFactorPk]; +export type EmissionsFactorOptionalAttributes = "emissionsFactor" | "emissionsFactorUrl" | "units" | "created" | "lastUpdated"; +export type EmissionsFactorCreationAttributes = Optional; + +export class EmissionsFactor extends Model implements EmissionsFactorAttributes { + emissionsFactorId!: string; + emissionsFactor?: number; + emissionsFactorUrl?: string; + units?: string; + created?: Date; + lastUpdated?: Date; + + // EmissionsFactor belongsToMany DataSource via emissionsFactorId and datasourceId + datasourceIdDataSourceDataSourceEmissionsFactors!: DataSource[]; + getDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceEmissionsFactor!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceEmissionsFactor!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceEmissionsFactor!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceEmissionsFactor!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceEmissionsFactors!: Sequelize.BelongsToManyCountAssociationsMixin; + // EmissionsFactor hasMany DataSourceEmissionsFactor via emissionsFactorId + dataSourceEmissionsFactors!: DataSourceEmissionsFactor[]; + getDataSourceEmissionsFactors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceEmissionsFactors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceEmissionsFactor!: Sequelize.HasManyAddAssociationMixin; + addDataSourceEmissionsFactors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceEmissionsFactor!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceEmissionsFactor!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceEmissionsFactors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceEmissionsFactor!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceEmissionsFactors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceEmissionsFactors!: Sequelize.HasManyCountAssociationsMixin; + // EmissionsFactor hasMany SubCategoryValue via emissionsFactorId + subCategoryValues!: SubCategoryValue[]; + getSubCategoryValues!: Sequelize.HasManyGetAssociationsMixin; + setSubCategoryValues!: Sequelize.HasManySetAssociationsMixin; + addSubCategoryValue!: Sequelize.HasManyAddAssociationMixin; + addSubCategoryValues!: Sequelize.HasManyAddAssociationsMixin; + createSubCategoryValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategoryValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategoryValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategoryValue!: Sequelize.HasManyHasAssociationMixin; + hasSubCategoryValues!: Sequelize.HasManyHasAssociationsMixin; + countSubCategoryValues!: Sequelize.HasManyCountAssociationsMixin; + // EmissionsFactor hasMany SubSectorValue via emissionsFactorId + subSectorValues!: SubSectorValue[]; + getSubSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSubSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSubSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorValues!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof EmissionsFactor { + return EmissionsFactor.init({ + emissionsFactorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'emissions_factor_id' + }, + emissionsFactor: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'emissions_factor' + }, + emissionsFactorUrl: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'emissions_factor_url' + }, + units: { + type: DataTypes.STRING(255), + allowNull: true + } + }, { + sequelize, + tableName: 'EmissionsFactor', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "EmissionsFactor_pkey", + unique: true, + fields: [ + { name: "emissions_factor_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/GDP.ts b/app/src/models/GDP.ts new file mode 100644 index 000000000..23df8b032 --- /dev/null +++ b/app/src/models/GDP.ts @@ -0,0 +1,88 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { City, CityId } from './City'; +import type { DataSource, DataSourceId } from './DataSource'; + +export interface GDPAttributes { + cityId: string; + gdp?: number; + year: number; + created?: Date; + lastUpdated?: Date; + datasourceId?: string; +} + +export type GDPPk = "cityId" | "year"; +export type GDPId = GDP[GDPPk]; +export type GDPOptionalAttributes = "gdp" | "created" | "lastUpdated" | "datasourceId"; +export type GDPCreationAttributes = Optional; + +export class GDP extends Model implements GDPAttributes { + cityId!: string; + gdp?: number; + year!: number; + created?: Date; + lastUpdated?: Date; + datasourceId?: string; + + // GDP belongsTo City via cityId + city!: City; + getCity!: Sequelize.BelongsToGetAssociationMixin; + setCity!: Sequelize.BelongsToSetAssociationMixin; + createCity!: Sequelize.BelongsToCreateAssociationMixin; + // GDP belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof GDP { + return GDP.init({ + cityId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'City', + key: 'city_id' + }, + field: 'city_id' + }, + gdp: { + type: DataTypes.BIGINT, + allowNull: true + }, + year: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + datasourceId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + } + }, { + sequelize, + tableName: 'GDP', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "GDP_pkey", + unique: true, + fields: [ + { name: "city_id" }, + { name: "year" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/GHGs.ts b/app/src/models/GHGs.ts new file mode 100644 index 000000000..56911de4b --- /dev/null +++ b/app/src/models/GHGs.ts @@ -0,0 +1,80 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceGHGs, DataSourceGHGsId } from './DataSourceGHGs'; + +export interface GHGsAttributes { + ghgId: string; + ghgName?: string; + created?: Date; + lastUpdated?: Date; +} + +export type GHGsPk = "ghgId"; +export type GHGsId = GHGs[GHGsPk]; +export type GHGsOptionalAttributes = "ghgName" | "created" | "lastUpdated"; +export type GHGsCreationAttributes = Optional; + +export class GHGs extends Model implements GHGsAttributes { + ghgId!: string; + ghgName?: string; + created?: Date; + lastUpdated?: Date; + + // GHGs belongsToMany DataSource via ghgId and datasourceId + datasourceIdDataSourceDataSourceGhgs!: DataSource[]; + getDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceGhg!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceGhg!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceGhg!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceGhg!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceGhgs!: Sequelize.BelongsToManyCountAssociationsMixin; + // GHGs hasMany DataSourceGHGs via ghgId + dataSourceGhgs!: DataSourceGHGs[]; + getDataSourceGhgs!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceGhgs!: Sequelize.HasManySetAssociationsMixin; + addDataSourceGhg!: Sequelize.HasManyAddAssociationMixin; + addDataSourceGhgs!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceGhg!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceGhg!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceGhgs!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceGhg!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceGhgs!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceGhgs!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof GHGs { + return GHGs.init({ + ghgId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'ghg_id' + }, + ghgName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'ghg_name' + } + }, { + sequelize, + tableName: 'GHGs', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "GHGs_pkey", + unique: true, + fields: [ + { name: "ghg_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Inventory.ts b/app/src/models/Inventory.ts new file mode 100644 index 000000000..bc90c1f61 --- /dev/null +++ b/app/src/models/Inventory.ts @@ -0,0 +1,132 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { City, CityId } from './City'; +import type { SectorValue, SectorValueId } from './SectorValue'; +import type { SubCategoryValue, SubCategoryValueId } from './SubCategoryValue'; +import type { SubSectorValue, SubSectorValueId } from './SubSectorValue'; +import type { Version, VersionId } from './Version'; + +export interface InventoryAttributes { + inventoryId: string; + inventoryName?: string; + year?: number; + totalEmissions?: number; + cityId?: string; +} + +export type InventoryPk = "inventoryId"; +export type InventoryId = Inventory[InventoryPk]; +export type InventoryOptionalAttributes = "inventoryName" | "year" | "totalEmissions" | "cityId"; +export type InventoryCreationAttributes = Optional; + +export class Inventory extends Model implements InventoryAttributes { + inventoryId!: string; + inventoryName?: string; + year?: number; + totalEmissions?: number; + cityId?: string; + + // Inventory belongsTo City via cityId + city!: City; + getCity!: Sequelize.BelongsToGetAssociationMixin; + setCity!: Sequelize.BelongsToSetAssociationMixin; + createCity!: Sequelize.BelongsToCreateAssociationMixin; + // Inventory hasMany SectorValue via inventoryId + sectorValues!: SectorValue[]; + getSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSectorValues!: Sequelize.HasManyCountAssociationsMixin; + // Inventory hasMany SubCategoryValue via inventoryId + subCategoryValues!: SubCategoryValue[]; + getSubCategoryValues!: Sequelize.HasManyGetAssociationsMixin; + setSubCategoryValues!: Sequelize.HasManySetAssociationsMixin; + addSubCategoryValue!: Sequelize.HasManyAddAssociationMixin; + addSubCategoryValues!: Sequelize.HasManyAddAssociationsMixin; + createSubCategoryValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategoryValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategoryValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategoryValue!: Sequelize.HasManyHasAssociationMixin; + hasSubCategoryValues!: Sequelize.HasManyHasAssociationsMixin; + countSubCategoryValues!: Sequelize.HasManyCountAssociationsMixin; + // Inventory hasMany SubSectorValue via inventoryId + subSectorValues!: SubSectorValue[]; + getSubSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSubSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSubSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorValues!: Sequelize.HasManyCountAssociationsMixin; + // Inventory hasMany Version via inventoryId + versions!: Version[]; + getVersions!: Sequelize.HasManyGetAssociationsMixin; + setVersions!: Sequelize.HasManySetAssociationsMixin; + addVersion!: Sequelize.HasManyAddAssociationMixin; + addVersions!: Sequelize.HasManyAddAssociationsMixin; + createVersion!: Sequelize.HasManyCreateAssociationMixin; + removeVersion!: Sequelize.HasManyRemoveAssociationMixin; + removeVersions!: Sequelize.HasManyRemoveAssociationsMixin; + hasVersion!: Sequelize.HasManyHasAssociationMixin; + hasVersions!: Sequelize.HasManyHasAssociationsMixin; + countVersions!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Inventory { + return Inventory.init({ + inventoryId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'inventory_id' + }, + inventoryName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'inventory_name' + }, + year: { + type: DataTypes.INTEGER, + allowNull: true + }, + totalEmissions: { + type: DataTypes.BIGINT, + allowNull: true, + field: 'total_emissions' + }, + cityId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'City', + key: 'city_id' + }, + field: 'city_id' + } + }, { + sequelize, + tableName: 'Inventory', + schema: 'public', + timestamps: false, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Inventory_pkey", + unique: true, + fields: [ + { name: "inventory_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Methodology.ts b/app/src/models/Methodology.ts new file mode 100644 index 000000000..c4e813f75 --- /dev/null +++ b/app/src/models/Methodology.ts @@ -0,0 +1,102 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceMethodology, DataSourceMethodologyId } from './DataSourceMethodology'; + +export interface MethodologyAttributes { + methodologyId: string; + methodology?: string; + methodologyUrl?: string; + datasourceId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type MethodologyPk = "methodologyId"; +export type MethodologyId = Methodology[MethodologyPk]; +export type MethodologyOptionalAttributes = "methodology" | "methodologyUrl" | "datasourceId" | "created" | "lastUpdated"; +export type MethodologyCreationAttributes = Optional; + +export class Methodology extends Model implements MethodologyAttributes { + methodologyId!: string; + methodology?: string; + methodologyUrl?: string; + datasourceId?: string; + created?: Date; + lastUpdated?: Date; + + // Methodology belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + // Methodology belongsToMany DataSource via methodologyId and datasourceId + datasourceIdDataSourceDataSourceMethodologies!: DataSource[]; + getDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceMethodology!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceMethodology!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceMethodology!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceMethodology!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceMethodologies!: Sequelize.BelongsToManyCountAssociationsMixin; + // Methodology hasMany DataSourceMethodology via methodologyId + dataSourceMethodologies!: DataSourceMethodology[]; + getDataSourceMethodologies!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceMethodologies!: Sequelize.HasManySetAssociationsMixin; + addDataSourceMethodology!: Sequelize.HasManyAddAssociationMixin; + addDataSourceMethodologies!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceMethodology!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceMethodology!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceMethodologies!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceMethodology!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceMethodologies!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceMethodologies!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Methodology { + return Methodology.init({ + methodologyId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'methodology_id' + }, + methodology: { + type: DataTypes.STRING(255), + allowNull: true + }, + methodologyUrl: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'methodology_url' + }, + datasourceId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + } + }, { + sequelize, + tableName: 'Methodology', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Methodology_pkey", + unique: true, + fields: [ + { name: "methodology_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Population.ts b/app/src/models/Population.ts new file mode 100644 index 000000000..2a3bc1de0 --- /dev/null +++ b/app/src/models/Population.ts @@ -0,0 +1,88 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { City, CityId } from './City'; +import type { DataSource, DataSourceId } from './DataSource'; + +export interface PopulationAttributes { + cityId: string; + population?: number; + year: number; + created?: Date; + lastUpdated?: Date; + datasourceId?: string; +} + +export type PopulationPk = "cityId" | "year"; +export type PopulationId = Population[PopulationPk]; +export type PopulationOptionalAttributes = "population" | "created" | "lastUpdated" | "datasourceId"; +export type PopulationCreationAttributes = Optional; + +export class Population extends Model implements PopulationAttributes { + cityId!: string; + population?: number; + year!: number; + created?: Date; + lastUpdated?: Date; + datasourceId?: string; + + // Population belongsTo City via cityId + city!: City; + getCity!: Sequelize.BelongsToGetAssociationMixin; + setCity!: Sequelize.BelongsToSetAssociationMixin; + createCity!: Sequelize.BelongsToCreateAssociationMixin; + // Population belongsTo DataSource via datasourceId + datasource!: DataSource; + getDatasource!: Sequelize.BelongsToGetAssociationMixin; + setDatasource!: Sequelize.BelongsToSetAssociationMixin; + createDatasource!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Population { + return Population.init({ + cityId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'City', + key: 'city_id' + }, + field: 'city_id' + }, + population: { + type: DataTypes.BIGINT, + allowNull: true + }, + year: { + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + datasourceId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'DataSource', + key: 'datasource_id' + }, + field: 'datasource_id' + } + }, { + sequelize, + tableName: 'Population', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Population_pkey", + unique: true, + fields: [ + { name: "city_id" }, + { name: "year" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Publisher.ts b/app/src/models/Publisher.ts new file mode 100644 index 000000000..2c2d6bfee --- /dev/null +++ b/app/src/models/Publisher.ts @@ -0,0 +1,73 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; + +export interface PublisherAttributes { + publisherId: string; + name?: string; + url?: string; + created?: Date; + lastUpdated?: Date; +} + +export type PublisherPk = "publisherId"; +export type PublisherId = Publisher[PublisherPk]; +export type PublisherOptionalAttributes = "name" | "url" | "created" | "lastUpdated"; +export type PublisherCreationAttributes = Optional; + +export class Publisher extends Model implements PublisherAttributes { + publisherId!: string; + name?: string; + url?: string; + created?: Date; + lastUpdated?: Date; + + // Publisher hasMany DataSource via publisherId + dataSources!: DataSource[]; + getDataSources!: Sequelize.HasManyGetAssociationsMixin; + setDataSources!: Sequelize.HasManySetAssociationsMixin; + addDataSource!: Sequelize.HasManyAddAssociationMixin; + addDataSources!: Sequelize.HasManyAddAssociationsMixin; + createDataSource!: Sequelize.HasManyCreateAssociationMixin; + removeDataSource!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSources!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSource!: Sequelize.HasManyHasAssociationMixin; + hasDataSources!: Sequelize.HasManyHasAssociationsMixin; + countDataSources!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Publisher { + return Publisher.init({ + publisherId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'publisher_id' + }, + name: { + type: DataTypes.STRING(255), + allowNull: true + }, + url: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'URL' + } + }, { + sequelize, + tableName: 'Publisher', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Publisher_pkey", + unique: true, + fields: [ + { name: "publisher_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/ReportingLevel.ts b/app/src/models/ReportingLevel.ts new file mode 100644 index 000000000..36c904a85 --- /dev/null +++ b/app/src/models/ReportingLevel.ts @@ -0,0 +1,132 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ActivityData, ActivityDataId } from './ActivityData'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceReportingLevel, DataSourceReportingLevelId } from './DataSourceReportingLevel'; +import type { SubCategory, SubCategoryId } from './SubCategory'; +import type { SubSector, SubSectorId } from './SubSector'; +import type { SubSectorReportingLevel, SubSectorReportingLevelId } from './SubSectorReportingLevel'; + +export interface ReportingLevelAttributes { + reportinglevelId: string; + reportinglevelName?: string; + created?: Date; + lastUpdated?: Date; +} + +export type ReportingLevelPk = "reportinglevelId"; +export type ReportingLevelId = ReportingLevel[ReportingLevelPk]; +export type ReportingLevelOptionalAttributes = "reportinglevelName" | "created" | "lastUpdated"; +export type ReportingLevelCreationAttributes = Optional; + +export class ReportingLevel extends Model implements ReportingLevelAttributes { + reportinglevelId!: string; + reportinglevelName?: string; + created?: Date; + lastUpdated?: Date; + + // ReportingLevel hasMany ActivityData via reportinglevelId + activityData!: ActivityData[]; + getActivityData!: Sequelize.HasManyGetAssociationsMixin; + setActivityData!: Sequelize.HasManySetAssociationsMixin; + addActivityDatum!: Sequelize.HasManyAddAssociationMixin; + addActivityData!: Sequelize.HasManyAddAssociationsMixin; + createActivityDatum!: Sequelize.HasManyCreateAssociationMixin; + removeActivityDatum!: Sequelize.HasManyRemoveAssociationMixin; + removeActivityData!: Sequelize.HasManyRemoveAssociationsMixin; + hasActivityDatum!: Sequelize.HasManyHasAssociationMixin; + hasActivityData!: Sequelize.HasManyHasAssociationsMixin; + countActivityData!: Sequelize.HasManyCountAssociationsMixin; + // ReportingLevel belongsToMany DataSource via reportinglevelId and datasourceId + datasourceIdDataSourceDataSourceReportingLevels!: DataSource[]; + getDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceReportingLevel!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceReportingLevel!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceReportingLevel!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceReportingLevel!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceReportingLevels!: Sequelize.BelongsToManyCountAssociationsMixin; + // ReportingLevel hasMany DataSourceReportingLevel via reportinglevelId + dataSourceReportingLevels!: DataSourceReportingLevel[]; + getDataSourceReportingLevels!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceReportingLevels!: Sequelize.HasManySetAssociationsMixin; + addDataSourceReportingLevel!: Sequelize.HasManyAddAssociationMixin; + addDataSourceReportingLevels!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceReportingLevel!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceReportingLevel!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceReportingLevels!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceReportingLevel!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceReportingLevels!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceReportingLevels!: Sequelize.HasManyCountAssociationsMixin; + // ReportingLevel hasMany SubCategory via reportinglevelId + subCategories!: SubCategory[]; + getSubCategories!: Sequelize.HasManyGetAssociationsMixin; + setSubCategories!: Sequelize.HasManySetAssociationsMixin; + addSubCategory!: Sequelize.HasManyAddAssociationMixin; + addSubCategories!: Sequelize.HasManyAddAssociationsMixin; + createSubCategory!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategory!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategories!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategory!: Sequelize.HasManyHasAssociationMixin; + hasSubCategories!: Sequelize.HasManyHasAssociationsMixin; + countSubCategories!: Sequelize.HasManyCountAssociationsMixin; + // ReportingLevel belongsToMany SubSector via reportinglevelId and subsectorId + subsectorIdSubSectorSubSectorReportingLevels!: SubSector[]; + getSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManyGetAssociationsMixin; + setSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManySetAssociationsMixin; + addSubsectorIdSubSectorSubSectorReportingLevel!: Sequelize.BelongsToManyAddAssociationMixin; + addSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManyAddAssociationsMixin; + createSubsectorIdSubSectorSubSectorReportingLevel!: Sequelize.BelongsToManyCreateAssociationMixin; + removeSubsectorIdSubSectorSubSectorReportingLevel!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasSubsectorIdSubSectorSubSectorReportingLevel!: Sequelize.BelongsToManyHasAssociationMixin; + hasSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManyHasAssociationsMixin; + countSubsectorIdSubSectorSubSectorReportingLevels!: Sequelize.BelongsToManyCountAssociationsMixin; + // ReportingLevel hasMany SubSectorReportingLevel via reportinglevelId + subSectorReportingLevels!: SubSectorReportingLevel[]; + getSubSectorReportingLevels!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorReportingLevels!: Sequelize.HasManySetAssociationsMixin; + addSubSectorReportingLevel!: Sequelize.HasManyAddAssociationMixin; + addSubSectorReportingLevels!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorReportingLevel!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorReportingLevel!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorReportingLevels!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorReportingLevel!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorReportingLevels!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorReportingLevels!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof ReportingLevel { + return ReportingLevel.init({ + reportinglevelId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'reportinglevel_id' + }, + reportinglevelName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'reportinglevel_name' + } + }, { + sequelize, + tableName: 'ReportingLevel', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "ReportingLevel_pkey", + unique: true, + fields: [ + { name: "reportinglevel_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Scope.ts b/app/src/models/Scope.ts new file mode 100644 index 000000000..c46984cbb --- /dev/null +++ b/app/src/models/Scope.ts @@ -0,0 +1,132 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ActivityData, ActivityDataId } from './ActivityData'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceScope, DataSourceScopeId } from './DataSourceScope'; +import type { SubCategory, SubCategoryId } from './SubCategory'; +import type { SubSector, SubSectorId } from './SubSector'; +import type { SubSectorScope, SubSectorScopeId } from './SubSectorScope'; + +export interface ScopeAttributes { + scopeId: string; + scopeName?: string; + created?: Date; + lastUpdated?: Date; +} + +export type ScopePk = "scopeId"; +export type ScopeId = Scope[ScopePk]; +export type ScopeOptionalAttributes = "scopeName" | "created" | "lastUpdated"; +export type ScopeCreationAttributes = Optional; + +export class Scope extends Model implements ScopeAttributes { + scopeId!: string; + scopeName?: string; + created?: Date; + lastUpdated?: Date; + + // Scope hasMany ActivityData via scopeId + activityData!: ActivityData[]; + getActivityData!: Sequelize.HasManyGetAssociationsMixin; + setActivityData!: Sequelize.HasManySetAssociationsMixin; + addActivityDatum!: Sequelize.HasManyAddAssociationMixin; + addActivityData!: Sequelize.HasManyAddAssociationsMixin; + createActivityDatum!: Sequelize.HasManyCreateAssociationMixin; + removeActivityDatum!: Sequelize.HasManyRemoveAssociationMixin; + removeActivityData!: Sequelize.HasManyRemoveAssociationsMixin; + hasActivityDatum!: Sequelize.HasManyHasAssociationMixin; + hasActivityData!: Sequelize.HasManyHasAssociationsMixin; + countActivityData!: Sequelize.HasManyCountAssociationsMixin; + // Scope belongsToMany DataSource via scopeId and datasourceId + datasourceIdDataSourceDataSourceScopes!: DataSource[]; + getDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceScope!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceScope!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceScope!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceScope!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceScopes!: Sequelize.BelongsToManyCountAssociationsMixin; + // Scope hasMany DataSourceScope via scopeId + dataSourceScopes!: DataSourceScope[]; + getDataSourceScopes!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceScopes!: Sequelize.HasManySetAssociationsMixin; + addDataSourceScope!: Sequelize.HasManyAddAssociationMixin; + addDataSourceScopes!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceScope!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceScope!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceScopes!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceScope!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceScopes!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceScopes!: Sequelize.HasManyCountAssociationsMixin; + // Scope hasMany SubCategory via scopeId + subCategories!: SubCategory[]; + getSubCategories!: Sequelize.HasManyGetAssociationsMixin; + setSubCategories!: Sequelize.HasManySetAssociationsMixin; + addSubCategory!: Sequelize.HasManyAddAssociationMixin; + addSubCategories!: Sequelize.HasManyAddAssociationsMixin; + createSubCategory!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategory!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategories!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategory!: Sequelize.HasManyHasAssociationMixin; + hasSubCategories!: Sequelize.HasManyHasAssociationsMixin; + countSubCategories!: Sequelize.HasManyCountAssociationsMixin; + // Scope belongsToMany SubSector via scopeId and subsectorId + subsectorIdSubSectorSubSectorScopes!: SubSector[]; + getSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManyGetAssociationsMixin; + setSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManySetAssociationsMixin; + addSubsectorIdSubSectorSubSectorScope!: Sequelize.BelongsToManyAddAssociationMixin; + addSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManyAddAssociationsMixin; + createSubsectorIdSubSectorSubSectorScope!: Sequelize.BelongsToManyCreateAssociationMixin; + removeSubsectorIdSubSectorSubSectorScope!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasSubsectorIdSubSectorSubSectorScope!: Sequelize.BelongsToManyHasAssociationMixin; + hasSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManyHasAssociationsMixin; + countSubsectorIdSubSectorSubSectorScopes!: Sequelize.BelongsToManyCountAssociationsMixin; + // Scope hasMany SubSectorScope via scopeId + subSectorScopes!: SubSectorScope[]; + getSubSectorScopes!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorScopes!: Sequelize.HasManySetAssociationsMixin; + addSubSectorScope!: Sequelize.HasManyAddAssociationMixin; + addSubSectorScopes!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorScope!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorScope!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorScopes!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorScope!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorScopes!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorScopes!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Scope { + return Scope.init({ + scopeId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'scope_id' + }, + scopeName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'scope_name' + } + }, { + sequelize, + tableName: 'Scope', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Scope_pkey", + unique: true, + fields: [ + { name: "scope_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Sector.ts b/app/src/models/Sector.ts new file mode 100644 index 000000000..ca8b31176 --- /dev/null +++ b/app/src/models/Sector.ts @@ -0,0 +1,106 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceSector, DataSourceSectorId } from './DataSourceSector'; +import type { SectorValue, SectorValueId } from './SectorValue'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface SectorAttributes { + sectorId: string; + sectorName?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SectorPk = "sectorId"; +export type SectorId = Sector[SectorPk]; +export type SectorOptionalAttributes = "sectorName" | "created" | "lastUpdated"; +export type SectorCreationAttributes = Optional; + +export class Sector extends Model implements SectorAttributes { + sectorId!: string; + sectorName?: string; + created?: Date; + lastUpdated?: Date; + + // Sector belongsToMany DataSource via sectorId and datasourceId + datasourceIdDataSourceDataSourceSectors!: DataSource[]; + getDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceSector!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceSector!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceSector!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceSector!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceSectors!: Sequelize.BelongsToManyCountAssociationsMixin; + // Sector hasMany DataSourceSector via sectorId + dataSourceSectors!: DataSourceSector[]; + getDataSourceSectors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSectors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSector!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSectors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSector!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSector!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSectors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSector!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSectors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSectors!: Sequelize.HasManyCountAssociationsMixin; + // Sector hasMany SectorValue via sectorId + sectorValues!: SectorValue[]; + getSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSectorValues!: Sequelize.HasManyCountAssociationsMixin; + // Sector hasMany SubSector via sectorId + subSectors!: SubSector[]; + getSubSectors!: Sequelize.HasManyGetAssociationsMixin; + setSubSectors!: Sequelize.HasManySetAssociationsMixin; + addSubSector!: Sequelize.HasManyAddAssociationMixin; + addSubSectors!: Sequelize.HasManyAddAssociationsMixin; + createSubSector!: Sequelize.HasManyCreateAssociationMixin; + removeSubSector!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectors!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSector!: Sequelize.HasManyHasAssociationMixin; + hasSubSectors!: Sequelize.HasManyHasAssociationsMixin; + countSubSectors!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Sector { + return Sector.init({ + sectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'sector_id' + }, + sectorName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'sector_name' + } + }, { + sequelize, + tableName: 'Sector', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Sector_pkey", + unique: true, + fields: [ + { name: "sector_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SectorValue.ts b/app/src/models/SectorValue.ts new file mode 100644 index 000000000..99915cc6a --- /dev/null +++ b/app/src/models/SectorValue.ts @@ -0,0 +1,114 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { Inventory, InventoryId } from './Inventory'; +import type { Sector, SectorId } from './Sector'; +import type { SubCategoryValue, SubCategoryValueId } from './SubCategoryValue'; +import type { SubSectorValue, SubSectorValueId } from './SubSectorValue'; + +export interface SectorValueAttributes { + sectorValueId: string; + totalEmissions?: number; + sectorId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SectorValuePk = "sectorValueId"; +export type SectorValueId = SectorValue[SectorValuePk]; +export type SectorValueOptionalAttributes = "totalEmissions" | "sectorId" | "inventoryId" | "created" | "lastUpdated"; +export type SectorValueCreationAttributes = Optional; + +export class SectorValue extends Model implements SectorValueAttributes { + sectorValueId!: string; + totalEmissions?: number; + sectorId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; + + // SectorValue belongsTo Inventory via inventoryId + inventory!: Inventory; + getInventory!: Sequelize.BelongsToGetAssociationMixin; + setInventory!: Sequelize.BelongsToSetAssociationMixin; + createInventory!: Sequelize.BelongsToCreateAssociationMixin; + // SectorValue belongsTo Sector via sectorId + sector!: Sector; + getSector!: Sequelize.BelongsToGetAssociationMixin; + setSector!: Sequelize.BelongsToSetAssociationMixin; + createSector!: Sequelize.BelongsToCreateAssociationMixin; + // SectorValue hasMany SubCategoryValue via sectorValueId + subCategoryValues!: SubCategoryValue[]; + getSubCategoryValues!: Sequelize.HasManyGetAssociationsMixin; + setSubCategoryValues!: Sequelize.HasManySetAssociationsMixin; + addSubCategoryValue!: Sequelize.HasManyAddAssociationMixin; + addSubCategoryValues!: Sequelize.HasManyAddAssociationsMixin; + createSubCategoryValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategoryValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategoryValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategoryValue!: Sequelize.HasManyHasAssociationMixin; + hasSubCategoryValues!: Sequelize.HasManyHasAssociationsMixin; + countSubCategoryValues!: Sequelize.HasManyCountAssociationsMixin; + // SectorValue hasMany SubSectorValue via sectorValueId + subSectorValues!: SubSectorValue[]; + getSubSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSubSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSubSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorValues!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SectorValue { + return SectorValue.init({ + sectorValueId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'sector_value_id' + }, + totalEmissions: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'total_emissions' + }, + sectorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Sector', + key: 'sector_id' + }, + field: 'sector_id' + }, + inventoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Inventory', + key: 'inventory_id' + }, + field: 'inventory_id' + } + }, { + sequelize, + tableName: 'SectorValue', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SectorValue_pkey", + unique: true, + fields: [ + { name: "sector_value_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubCategory.ts b/app/src/models/SubCategory.ts new file mode 100644 index 000000000..bc3476f06 --- /dev/null +++ b/app/src/models/SubCategory.ts @@ -0,0 +1,164 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ActivityData, ActivityDataId } from './ActivityData'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceSubCategory, DataSourceSubCategoryId } from './DataSourceSubCategory'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; +import type { Scope, ScopeId } from './Scope'; +import type { SubCategoryValue, SubCategoryValueId } from './SubCategoryValue'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface SubCategoryAttributes { + subcategoryId: string; + subcategoryName?: string; + activityName?: string; + subsectorId?: string; + scopeId?: string; + reportinglevelId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubCategoryPk = "subcategoryId"; +export type SubCategoryId = SubCategory[SubCategoryPk]; +export type SubCategoryOptionalAttributes = "subcategoryName" | "activityName" | "subsectorId" | "scopeId" | "reportinglevelId" | "created" | "lastUpdated"; +export type SubCategoryCreationAttributes = Optional; + +export class SubCategory extends Model implements SubCategoryAttributes { + subcategoryId!: string; + subcategoryName?: string; + activityName?: string; + subsectorId?: string; + scopeId?: string; + reportinglevelId?: string; + created?: Date; + lastUpdated?: Date; + + // SubCategory belongsTo ReportingLevel via reportinglevelId + reportinglevel!: ReportingLevel; + getReportinglevel!: Sequelize.BelongsToGetAssociationMixin; + setReportinglevel!: Sequelize.BelongsToSetAssociationMixin; + createReportinglevel!: Sequelize.BelongsToCreateAssociationMixin; + // SubCategory belongsTo Scope via scopeId + scope!: Scope; + getScope!: Sequelize.BelongsToGetAssociationMixin; + setScope!: Sequelize.BelongsToSetAssociationMixin; + createScope!: Sequelize.BelongsToCreateAssociationMixin; + // SubCategory hasMany ActivityData via subcategoryId + activityData!: ActivityData[]; + getActivityData!: Sequelize.HasManyGetAssociationsMixin; + setActivityData!: Sequelize.HasManySetAssociationsMixin; + addActivityDatum!: Sequelize.HasManyAddAssociationMixin; + addActivityData!: Sequelize.HasManyAddAssociationsMixin; + createActivityDatum!: Sequelize.HasManyCreateAssociationMixin; + removeActivityDatum!: Sequelize.HasManyRemoveAssociationMixin; + removeActivityData!: Sequelize.HasManyRemoveAssociationsMixin; + hasActivityDatum!: Sequelize.HasManyHasAssociationMixin; + hasActivityData!: Sequelize.HasManyHasAssociationsMixin; + countActivityData!: Sequelize.HasManyCountAssociationsMixin; + // SubCategory belongsToMany DataSource via subcategoryId and datasourceId + datasourceIdDataSourceDataSourceSubCategories!: DataSource[]; + getDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceSubCategory!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceSubCategory!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceSubCategory!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceSubCategory!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceSubCategories!: Sequelize.BelongsToManyCountAssociationsMixin; + // SubCategory hasMany DataSourceSubCategory via subcategoryId + dataSourceSubCategories!: DataSourceSubCategory[]; + getDataSourceSubCategories!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSubCategories!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSubCategory!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSubCategories!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSubCategory!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSubCategory!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSubCategories!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSubCategory!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSubCategories!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSubCategories!: Sequelize.HasManyCountAssociationsMixin; + // SubCategory hasMany SubCategoryValue via subcategoryId + subCategoryValues!: SubCategoryValue[]; + getSubCategoryValues!: Sequelize.HasManyGetAssociationsMixin; + setSubCategoryValues!: Sequelize.HasManySetAssociationsMixin; + addSubCategoryValue!: Sequelize.HasManyAddAssociationMixin; + addSubCategoryValues!: Sequelize.HasManyAddAssociationsMixin; + createSubCategoryValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategoryValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategoryValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategoryValue!: Sequelize.HasManyHasAssociationMixin; + hasSubCategoryValues!: Sequelize.HasManyHasAssociationsMixin; + countSubCategoryValues!: Sequelize.HasManyCountAssociationsMixin; + // SubCategory belongsTo SubSector via subsectorId + subsector!: SubSector; + getSubsector!: Sequelize.BelongsToGetAssociationMixin; + setSubsector!: Sequelize.BelongsToSetAssociationMixin; + createSubsector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubCategory { + return SubCategory.init({ + subcategoryId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'subcategory_id' + }, + subcategoryName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'subcategory_name' + }, + activityName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'activity_name' + }, + subsectorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SubSector', + key: 'subsector_id' + }, + field: 'subsector_id' + }, + scopeId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Scope', + key: 'scope_id' + }, + field: 'scope_id' + }, + reportinglevelId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'ReportingLevel', + key: 'reportinglevel_id' + }, + field: 'reportinglevel_id' + } + }, { + sequelize, + tableName: 'SubCategory', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubCategory_pkey", + unique: true, + fields: [ + { name: "subcategory_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubCategoryValue.ts b/app/src/models/SubCategoryValue.ts new file mode 100644 index 000000000..02cd8981a --- /dev/null +++ b/app/src/models/SubCategoryValue.ts @@ -0,0 +1,143 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { EmissionsFactor, EmissionsFactorId } from './EmissionsFactor'; +import type { Inventory, InventoryId } from './Inventory'; +import type { SectorValue, SectorValueId } from './SectorValue'; +import type { SubCategory, SubCategoryId } from './SubCategory'; + +export interface SubCategoryValueAttributes { + subcategoryValueId: string; + activityUnits?: string; + activityValue?: number; + emissionFactorValue?: number; + totalEmissions?: number; + emissionsFactorId?: string; + subcategoryId?: string; + sectorValueId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubCategoryValuePk = "subcategoryValueId"; +export type SubCategoryValueId = SubCategoryValue[SubCategoryValuePk]; +export type SubCategoryValueOptionalAttributes = "activityUnits" | "activityValue" | "emissionFactorValue" | "totalEmissions" | "emissionsFactorId" | "subcategoryId" | "sectorValueId" | "inventoryId" | "created" | "lastUpdated"; +export type SubCategoryValueCreationAttributes = Optional; + +export class SubCategoryValue extends Model implements SubCategoryValueAttributes { + subcategoryValueId!: string; + activityUnits?: string; + activityValue?: number; + emissionFactorValue?: number; + totalEmissions?: number; + emissionsFactorId?: string; + subcategoryId?: string; + sectorValueId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; + + // SubCategoryValue belongsTo EmissionsFactor via emissionsFactorId + emissionsFactor!: EmissionsFactor; + getEmissionsFactor!: Sequelize.BelongsToGetAssociationMixin; + setEmissionsFactor!: Sequelize.BelongsToSetAssociationMixin; + createEmissionsFactor!: Sequelize.BelongsToCreateAssociationMixin; + // SubCategoryValue belongsTo Inventory via inventoryId + inventory!: Inventory; + getInventory!: Sequelize.BelongsToGetAssociationMixin; + setInventory!: Sequelize.BelongsToSetAssociationMixin; + createInventory!: Sequelize.BelongsToCreateAssociationMixin; + // SubCategoryValue belongsTo SectorValue via sectorValueId + sectorValue!: SectorValue; + getSectorValue!: Sequelize.BelongsToGetAssociationMixin; + setSectorValue!: Sequelize.BelongsToSetAssociationMixin; + createSectorValue!: Sequelize.BelongsToCreateAssociationMixin; + // SubCategoryValue belongsTo SubCategory via subcategoryId + subcategory!: SubCategory; + getSubcategory!: Sequelize.BelongsToGetAssociationMixin; + setSubcategory!: Sequelize.BelongsToSetAssociationMixin; + createSubcategory!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubCategoryValue { + return SubCategoryValue.init({ + subcategoryValueId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'subcategory_value_id' + }, + activityUnits: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'activity_units' + }, + activityValue: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'activity_value' + }, + emissionFactorValue: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'emission_factor_value' + }, + totalEmissions: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'total_emissions' + }, + emissionsFactorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'EmissionsFactor', + key: 'emissions_factor_id' + }, + field: 'emissions_factor_id' + }, + subcategoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SubCategory', + key: 'subcategory_id' + }, + field: 'subcategory_id' + }, + sectorValueId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SectorValue', + key: 'sector_value_id' + }, + field: 'sector_value_id' + }, + inventoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Inventory', + key: 'inventory_id' + }, + field: 'inventory_id' + } + }, { + sequelize, + tableName: 'SubCategoryValue', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubCategoryValue_pkey", + unique: true, + fields: [ + { name: "subcategory_value_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubSector.ts b/app/src/models/SubSector.ts new file mode 100644 index 000000000..990d908db --- /dev/null +++ b/app/src/models/SubSector.ts @@ -0,0 +1,175 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { DataSource, DataSourceId } from './DataSource'; +import type { DataSourceSubSector, DataSourceSubSectorId } from './DataSourceSubSector'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; +import type { Scope, ScopeId } from './Scope'; +import type { Sector, SectorId } from './Sector'; +import type { SubCategory, SubCategoryId } from './SubCategory'; +import type { SubSectorReportingLevel, SubSectorReportingLevelId } from './SubSectorReportingLevel'; +import type { SubSectorScope, SubSectorScopeId } from './SubSectorScope'; +import type { SubSectorValue, SubSectorValueId } from './SubSectorValue'; + +export interface SubSectorAttributes { + subsectorId: string; + subsectorName?: string; + sectorId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubSectorPk = "subsectorId"; +export type SubSectorId = SubSector[SubSectorPk]; +export type SubSectorOptionalAttributes = "subsectorName" | "sectorId" | "created" | "lastUpdated"; +export type SubSectorCreationAttributes = Optional; + +export class SubSector extends Model implements SubSectorAttributes { + subsectorId!: string; + subsectorName?: string; + sectorId?: string; + created?: Date; + lastUpdated?: Date; + + // SubSector belongsTo Sector via sectorId + sector!: Sector; + getSector!: Sequelize.BelongsToGetAssociationMixin; + setSector!: Sequelize.BelongsToSetAssociationMixin; + createSector!: Sequelize.BelongsToCreateAssociationMixin; + // SubSector belongsToMany DataSource via subsectorId and datasourceId + datasourceIdDataSourceDataSourceSubSectors!: DataSource[]; + getDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManyGetAssociationsMixin; + setDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManySetAssociationsMixin; + addDatasourceIdDataSourceDataSourceSubSector!: Sequelize.BelongsToManyAddAssociationMixin; + addDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManyAddAssociationsMixin; + createDatasourceIdDataSourceDataSourceSubSector!: Sequelize.BelongsToManyCreateAssociationMixin; + removeDatasourceIdDataSourceDataSourceSubSector!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasDatasourceIdDataSourceDataSourceSubSector!: Sequelize.BelongsToManyHasAssociationMixin; + hasDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManyHasAssociationsMixin; + countDatasourceIdDataSourceDataSourceSubSectors!: Sequelize.BelongsToManyCountAssociationsMixin; + // SubSector hasMany DataSourceSubSector via subsectorId + dataSourceSubSectors!: DataSourceSubSector[]; + getDataSourceSubSectors!: Sequelize.HasManyGetAssociationsMixin; + setDataSourceSubSectors!: Sequelize.HasManySetAssociationsMixin; + addDataSourceSubSector!: Sequelize.HasManyAddAssociationMixin; + addDataSourceSubSectors!: Sequelize.HasManyAddAssociationsMixin; + createDataSourceSubSector!: Sequelize.HasManyCreateAssociationMixin; + removeDataSourceSubSector!: Sequelize.HasManyRemoveAssociationMixin; + removeDataSourceSubSectors!: Sequelize.HasManyRemoveAssociationsMixin; + hasDataSourceSubSector!: Sequelize.HasManyHasAssociationMixin; + hasDataSourceSubSectors!: Sequelize.HasManyHasAssociationsMixin; + countDataSourceSubSectors!: Sequelize.HasManyCountAssociationsMixin; + // SubSector belongsToMany ReportingLevel via subsectorId and reportinglevelId + reportinglevelIdReportingLevelSubSectorReportingLevels!: ReportingLevel[]; + getReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManyGetAssociationsMixin; + setReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManySetAssociationsMixin; + addReportinglevelIdReportingLevelSubSectorReportingLevel!: Sequelize.BelongsToManyAddAssociationMixin; + addReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManyAddAssociationsMixin; + createReportinglevelIdReportingLevelSubSectorReportingLevel!: Sequelize.BelongsToManyCreateAssociationMixin; + removeReportinglevelIdReportingLevelSubSectorReportingLevel!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasReportinglevelIdReportingLevelSubSectorReportingLevel!: Sequelize.BelongsToManyHasAssociationMixin; + hasReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManyHasAssociationsMixin; + countReportinglevelIdReportingLevelSubSectorReportingLevels!: Sequelize.BelongsToManyCountAssociationsMixin; + // SubSector belongsToMany Scope via subsectorId and scopeId + scopeIdScopeSubSectorScopes!: Scope[]; + getScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManyGetAssociationsMixin; + setScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManySetAssociationsMixin; + addScopeIdScopeSubSectorScope!: Sequelize.BelongsToManyAddAssociationMixin; + addScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManyAddAssociationsMixin; + createScopeIdScopeSubSectorScope!: Sequelize.BelongsToManyCreateAssociationMixin; + removeScopeIdScopeSubSectorScope!: Sequelize.BelongsToManyRemoveAssociationMixin; + removeScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManyRemoveAssociationsMixin; + hasScopeIdScopeSubSectorScope!: Sequelize.BelongsToManyHasAssociationMixin; + hasScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManyHasAssociationsMixin; + countScopeIdScopeSubSectorScopes!: Sequelize.BelongsToManyCountAssociationsMixin; + // SubSector hasMany SubCategory via subsectorId + subCategories!: SubCategory[]; + getSubCategories!: Sequelize.HasManyGetAssociationsMixin; + setSubCategories!: Sequelize.HasManySetAssociationsMixin; + addSubCategory!: Sequelize.HasManyAddAssociationMixin; + addSubCategories!: Sequelize.HasManyAddAssociationsMixin; + createSubCategory!: Sequelize.HasManyCreateAssociationMixin; + removeSubCategory!: Sequelize.HasManyRemoveAssociationMixin; + removeSubCategories!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubCategory!: Sequelize.HasManyHasAssociationMixin; + hasSubCategories!: Sequelize.HasManyHasAssociationsMixin; + countSubCategories!: Sequelize.HasManyCountAssociationsMixin; + // SubSector hasMany SubSectorReportingLevel via subsectorId + subSectorReportingLevels!: SubSectorReportingLevel[]; + getSubSectorReportingLevels!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorReportingLevels!: Sequelize.HasManySetAssociationsMixin; + addSubSectorReportingLevel!: Sequelize.HasManyAddAssociationMixin; + addSubSectorReportingLevels!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorReportingLevel!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorReportingLevel!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorReportingLevels!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorReportingLevel!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorReportingLevels!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorReportingLevels!: Sequelize.HasManyCountAssociationsMixin; + // SubSector hasMany SubSectorScope via subsectorId + subSectorScopes!: SubSectorScope[]; + getSubSectorScopes!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorScopes!: Sequelize.HasManySetAssociationsMixin; + addSubSectorScope!: Sequelize.HasManyAddAssociationMixin; + addSubSectorScopes!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorScope!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorScope!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorScopes!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorScope!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorScopes!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorScopes!: Sequelize.HasManyCountAssociationsMixin; + // SubSector hasMany SubSectorValue via subsectorId + subSectorValues!: SubSectorValue[]; + getSubSectorValues!: Sequelize.HasManyGetAssociationsMixin; + setSubSectorValues!: Sequelize.HasManySetAssociationsMixin; + addSubSectorValue!: Sequelize.HasManyAddAssociationMixin; + addSubSectorValues!: Sequelize.HasManyAddAssociationsMixin; + createSubSectorValue!: Sequelize.HasManyCreateAssociationMixin; + removeSubSectorValue!: Sequelize.HasManyRemoveAssociationMixin; + removeSubSectorValues!: Sequelize.HasManyRemoveAssociationsMixin; + hasSubSectorValue!: Sequelize.HasManyHasAssociationMixin; + hasSubSectorValues!: Sequelize.HasManyHasAssociationsMixin; + countSubSectorValues!: Sequelize.HasManyCountAssociationsMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubSector { + return SubSector.init({ + subsectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'subsector_id' + }, + subsectorName: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'subsector_name' + }, + sectorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Sector', + key: 'sector_id' + }, + field: 'sector_id' + } + }, { + sequelize, + tableName: 'SubSector', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubSector_pkey", + unique: true, + fields: [ + { name: "subsector_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubSectorReportingLevel.ts b/app/src/models/SubSectorReportingLevel.ts new file mode 100644 index 000000000..de0096bc3 --- /dev/null +++ b/app/src/models/SubSectorReportingLevel.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { ReportingLevel, ReportingLevelId } from './ReportingLevel'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface SubSectorReportingLevelAttributes { + subsectorId: string; + reportinglevelId: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubSectorReportingLevelPk = "subsectorId" | "reportinglevelId"; +export type SubSectorReportingLevelId = SubSectorReportingLevel[SubSectorReportingLevelPk]; +export type SubSectorReportingLevelOptionalAttributes = "created" | "lastUpdated"; +export type SubSectorReportingLevelCreationAttributes = Optional; + +export class SubSectorReportingLevel extends Model implements SubSectorReportingLevelAttributes { + subsectorId!: string; + reportinglevelId!: string; + created?: Date; + lastUpdated?: Date; + + // SubSectorReportingLevel belongsTo ReportingLevel via reportinglevelId + reportinglevel!: ReportingLevel; + getReportinglevel!: Sequelize.BelongsToGetAssociationMixin; + setReportinglevel!: Sequelize.BelongsToSetAssociationMixin; + createReportinglevel!: Sequelize.BelongsToCreateAssociationMixin; + // SubSectorReportingLevel belongsTo SubSector via subsectorId + subsector!: SubSector; + getSubsector!: Sequelize.BelongsToGetAssociationMixin; + setSubsector!: Sequelize.BelongsToSetAssociationMixin; + createSubsector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubSectorReportingLevel { + return SubSectorReportingLevel.init({ + subsectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'SubSector', + key: 'subsector_id' + }, + field: 'subsector_id' + }, + reportinglevelId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'ReportingLevel', + key: 'reportinglevel_id' + }, + field: 'reportinglevel_id' + } + }, { + sequelize, + tableName: 'SubSectorReportingLevel', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubSectorReportingLevel_pkey", + unique: true, + fields: [ + { name: "subsector_id" }, + { name: "reportinglevel_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubSectorScope.ts b/app/src/models/SubSectorScope.ts new file mode 100644 index 000000000..4947b3aa4 --- /dev/null +++ b/app/src/models/SubSectorScope.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { Scope, ScopeId } from './Scope'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface SubSectorScopeAttributes { + subsectorId: string; + scopeId: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubSectorScopePk = "subsectorId" | "scopeId"; +export type SubSectorScopeId = SubSectorScope[SubSectorScopePk]; +export type SubSectorScopeOptionalAttributes = "created" | "lastUpdated"; +export type SubSectorScopeCreationAttributes = Optional; + +export class SubSectorScope extends Model implements SubSectorScopeAttributes { + subsectorId!: string; + scopeId!: string; + created?: Date; + lastUpdated?: Date; + + // SubSectorScope belongsTo Scope via scopeId + scope!: Scope; + getScope!: Sequelize.BelongsToGetAssociationMixin; + setScope!: Sequelize.BelongsToSetAssociationMixin; + createScope!: Sequelize.BelongsToCreateAssociationMixin; + // SubSectorScope belongsTo SubSector via subsectorId + subsector!: SubSector; + getSubsector!: Sequelize.BelongsToGetAssociationMixin; + setSubsector!: Sequelize.BelongsToSetAssociationMixin; + createSubsector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubSectorScope { + return SubSectorScope.init({ + subsectorId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'SubSector', + key: 'subsector_id' + }, + field: 'subsector_id' + }, + scopeId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + references: { + model: 'Scope', + key: 'scope_id' + }, + field: 'scope_id' + } + }, { + sequelize, + tableName: 'SubSectorScope', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubSectorScope_pkey", + unique: true, + fields: [ + { name: "subsector_id" }, + { name: "scope_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/SubSectorValue.ts b/app/src/models/SubSectorValue.ts new file mode 100644 index 000000000..bc3b77a4c --- /dev/null +++ b/app/src/models/SubSectorValue.ts @@ -0,0 +1,143 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { EmissionsFactor, EmissionsFactorId } from './EmissionsFactor'; +import type { Inventory, InventoryId } from './Inventory'; +import type { SectorValue, SectorValueId } from './SectorValue'; +import type { SubSector, SubSectorId } from './SubSector'; + +export interface SubSectorValueAttributes { + subsectorValueId: string; + activityUnits?: string; + activityValue?: number; + emissionFactorValue?: number; + totalEmissions?: number; + emissionsFactorId?: string; + subsectorId?: string; + sectorValueId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type SubSectorValuePk = "subsectorValueId"; +export type SubSectorValueId = SubSectorValue[SubSectorValuePk]; +export type SubSectorValueOptionalAttributes = "activityUnits" | "activityValue" | "emissionFactorValue" | "totalEmissions" | "emissionsFactorId" | "subsectorId" | "sectorValueId" | "inventoryId" | "created" | "lastUpdated"; +export type SubSectorValueCreationAttributes = Optional; + +export class SubSectorValue extends Model implements SubSectorValueAttributes { + subsectorValueId!: string; + activityUnits?: string; + activityValue?: number; + emissionFactorValue?: number; + totalEmissions?: number; + emissionsFactorId?: string; + subsectorId?: string; + sectorValueId?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; + + // SubSectorValue belongsTo EmissionsFactor via emissionsFactorId + emissionsFactor!: EmissionsFactor; + getEmissionsFactor!: Sequelize.BelongsToGetAssociationMixin; + setEmissionsFactor!: Sequelize.BelongsToSetAssociationMixin; + createEmissionsFactor!: Sequelize.BelongsToCreateAssociationMixin; + // SubSectorValue belongsTo Inventory via inventoryId + inventory!: Inventory; + getInventory!: Sequelize.BelongsToGetAssociationMixin; + setInventory!: Sequelize.BelongsToSetAssociationMixin; + createInventory!: Sequelize.BelongsToCreateAssociationMixin; + // SubSectorValue belongsTo SectorValue via sectorValueId + sectorValue!: SectorValue; + getSectorValue!: Sequelize.BelongsToGetAssociationMixin; + setSectorValue!: Sequelize.BelongsToSetAssociationMixin; + createSectorValue!: Sequelize.BelongsToCreateAssociationMixin; + // SubSectorValue belongsTo SubSector via subsectorId + subsector!: SubSector; + getSubsector!: Sequelize.BelongsToGetAssociationMixin; + setSubsector!: Sequelize.BelongsToSetAssociationMixin; + createSubsector!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof SubSectorValue { + return SubSectorValue.init({ + subsectorValueId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'subsector_value_id' + }, + activityUnits: { + type: DataTypes.STRING(255), + allowNull: true, + field: 'activity_units' + }, + activityValue: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'activity_value' + }, + emissionFactorValue: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'emission_factor_value' + }, + totalEmissions: { + type: DataTypes.DECIMAL, + allowNull: true, + field: 'total_emissions' + }, + emissionsFactorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'EmissionsFactor', + key: 'emissions_factor_id' + }, + field: 'emissions_factor_id' + }, + subsectorId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SubSector', + key: 'subsector_id' + }, + field: 'subsector_id' + }, + sectorValueId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'SectorValue', + key: 'sector_value_id' + }, + field: 'sector_value_id' + }, + inventoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Inventory', + key: 'inventory_id' + }, + field: 'inventory_id' + } + }, { + sequelize, + tableName: 'SubSectorValue', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "SubSectorValue_pkey", + unique: true, + fields: [ + { name: "subsector_value_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/User.ts b/app/src/models/User.ts new file mode 100644 index 000000000..c41511f06 --- /dev/null +++ b/app/src/models/User.ts @@ -0,0 +1,124 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { CityUser, CityUserId } from './CityUser'; + +export interface UserAttributes { + userId: string; + name?: string; + pictureUrl?: string; + isOrganization?: boolean; + email?: string; + passwordHash?: string; + role?: string; + created?: Date; + lastUpdated?: Date; + organizationId?: string; +} + +export type UserPk = "userId"; +export type UserId = User[UserPk]; +export type UserOptionalAttributes = "name" | "pictureUrl" | "isOrganization" | "email" | "passwordHash" | "role" | "created" | "lastUpdated" | "organizationId"; +export type UserCreationAttributes = Optional; + +export class User extends Model implements UserAttributes { + userId!: string; + name?: string; + pictureUrl?: string; + isOrganization?: boolean; + email?: string; + passwordHash?: string; + role?: string; + created?: Date; + lastUpdated?: Date; + organizationId?: string; + + // User hasMany CityUser via userId + cityUsers!: CityUser[]; + getCityUsers!: Sequelize.HasManyGetAssociationsMixin; + setCityUsers!: Sequelize.HasManySetAssociationsMixin; + addCityUser!: Sequelize.HasManyAddAssociationMixin; + addCityUsers!: Sequelize.HasManyAddAssociationsMixin; + createCityUser!: Sequelize.HasManyCreateAssociationMixin; + removeCityUser!: Sequelize.HasManyRemoveAssociationMixin; + removeCityUsers!: Sequelize.HasManyRemoveAssociationsMixin; + hasCityUser!: Sequelize.HasManyHasAssociationMixin; + hasCityUsers!: Sequelize.HasManyHasAssociationsMixin; + countCityUsers!: Sequelize.HasManyCountAssociationsMixin; + // User belongsTo User via organizationId + organization!: User; + getOrganization!: Sequelize.BelongsToGetAssociationMixin; + setOrganization!: Sequelize.BelongsToSetAssociationMixin; + createOrganization!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof User { + return User.init({ + userId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'user_id' + }, + name: { + type: DataTypes.STRING(255), + allowNull: true + }, + pictureUrl: { + type: DataTypes.TEXT, + allowNull: true, + field: 'picture_url' + }, + isOrganization: { + type: DataTypes.BOOLEAN, + allowNull: true, + defaultValue: false, + field: 'is_organization' + }, + email: { + type: DataTypes.STRING(255), + allowNull: true, + unique: "User_email_key" + }, + passwordHash: { + type: DataTypes.CHAR(60), + allowNull: true, + field: 'password_hash' + }, + role: { + type: DataTypes.TEXT, + allowNull: true + }, + organizationId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'User', + key: 'user_id' + }, + field: 'organization_id' + } + }, { + sequelize, + tableName: 'User', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "User_email_key", + unique: true, + fields: [ + { name: "email" }, + ] + }, + { + name: "User_pkey", + unique: true, + fields: [ + { name: "user_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/Version.ts b/app/src/models/Version.ts new file mode 100644 index 000000000..0167cb612 --- /dev/null +++ b/app/src/models/Version.ts @@ -0,0 +1,76 @@ +import * as Sequelize from 'sequelize'; +import { DataTypes, Model, Optional } from 'sequelize'; +import type { Inventory, InventoryId } from './Inventory'; + +export interface VersionAttributes { + versionId: string; + year?: number; + version?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; +} + +export type VersionPk = "versionId"; +export type VersionId = Version[VersionPk]; +export type VersionOptionalAttributes = "year" | "version" | "inventoryId" | "created" | "lastUpdated"; +export type VersionCreationAttributes = Optional; + +export class Version extends Model implements VersionAttributes { + versionId!: string; + year?: number; + version?: string; + inventoryId?: string; + created?: Date; + lastUpdated?: Date; + + // Version belongsTo Inventory via inventoryId + inventory!: Inventory; + getInventory!: Sequelize.BelongsToGetAssociationMixin; + setInventory!: Sequelize.BelongsToSetAssociationMixin; + createInventory!: Sequelize.BelongsToCreateAssociationMixin; + + static initModel(sequelize: Sequelize.Sequelize): typeof Version { + return Version.init({ + versionId: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + field: 'version_id' + }, + year: { + type: DataTypes.INTEGER, + allowNull: true + }, + version: { + type: DataTypes.STRING(255), + allowNull: true + }, + inventoryId: { + type: DataTypes.UUID, + allowNull: true, + references: { + model: 'Inventory', + key: 'inventory_id' + }, + field: 'inventory_id' + } + }, { + sequelize, + tableName: 'Version', + schema: 'public', + timestamps: true, + createdAt: 'created', + updatedAt: 'last_updated', + indexes: [ + { + name: "Version_pkey", + unique: true, + fields: [ + { name: "version_id" }, + ] + }, + ] + }); + } +} diff --git a/app/src/models/index.ts b/app/src/models/index.ts index 09b65ba57..466019f69 100644 --- a/app/src/models/index.ts +++ b/app/src/models/index.ts @@ -1,32 +1,31 @@ import { Sequelize } from 'sequelize'; +import pg from 'pg'; +import { initModels } from './init-models'; export const db: { initialized: boolean, initialize: () => Promise, - sequelize?: Sequelize | null + sequelize?: Sequelize | null, + models: Record, } = { initialized: false, sequelize: null, initialize, + models: {}, }; -const config = { - host: process.env.DATABASE_HOST, - name: process.env.DATABASE_NAME, - username: process.env.DATABASE_USER, - password: process.env.DATABASE_PASSWORD, -} - async function initialize() { - const sequelize = new Sequelize({ - host: config.host, - database: config.name, + host: process.env.DATABASE_HOST, + username: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_NAME, dialect: 'postgres', - username: config.username, - password: config.password, + dialectModule: pg, }); + db.models = initModels(sequelize); + db.sequelize = sequelize; db.initialized = true; } diff --git a/app/src/models/init-models.ts b/app/src/models/init-models.ts new file mode 100644 index 000000000..5b098a222 --- /dev/null +++ b/app/src/models/init-models.ts @@ -0,0 +1,360 @@ +import type { Sequelize } from "sequelize"; +import { ActivityData as _ActivityData } from "./ActivityData"; +import type { ActivityDataAttributes, ActivityDataCreationAttributes } from "./ActivityData"; +import { City as _City } from "./City"; +import type { CityAttributes, CityCreationAttributes } from "./City"; +import { CityUser as _CityUser } from "./CityUser"; +import type { CityUserAttributes, CityUserCreationAttributes } from "./CityUser"; +import { DataSource as _DataSource } from "./DataSource"; +import type { DataSourceAttributes, DataSourceCreationAttributes } from "./DataSource"; +import { DataSourceActivityData as _DataSourceActivityData } from "./DataSourceActivityData"; +import type { DataSourceActivityDataAttributes, DataSourceActivityDataCreationAttributes } from "./DataSourceActivityData"; +import { DataSourceEmissionsFactor as _DataSourceEmissionsFactor } from "./DataSourceEmissionsFactor"; +import type { DataSourceEmissionsFactorAttributes, DataSourceEmissionsFactorCreationAttributes } from "./DataSourceEmissionsFactor"; +import { DataSourceGHGs as _DataSourceGHGs } from "./DataSourceGHGs"; +import type { DataSourceGHGsAttributes, DataSourceGHGsCreationAttributes } from "./DataSourceGHGs"; +import { DataSourceMethodology as _DataSourceMethodology } from "./DataSourceMethodology"; +import type { DataSourceMethodologyAttributes, DataSourceMethodologyCreationAttributes } from "./DataSourceMethodology"; +import { DataSourceReportingLevel as _DataSourceReportingLevel } from "./DataSourceReportingLevel"; +import type { DataSourceReportingLevelAttributes, DataSourceReportingLevelCreationAttributes } from "./DataSourceReportingLevel"; +import { DataSourceScope as _DataSourceScope } from "./DataSourceScope"; +import type { DataSourceScopeAttributes, DataSourceScopeCreationAttributes } from "./DataSourceScope"; +import { DataSourceSector as _DataSourceSector } from "./DataSourceSector"; +import type { DataSourceSectorAttributes, DataSourceSectorCreationAttributes } from "./DataSourceSector"; +import { DataSourceSubCategory as _DataSourceSubCategory } from "./DataSourceSubCategory"; +import type { DataSourceSubCategoryAttributes, DataSourceSubCategoryCreationAttributes } from "./DataSourceSubCategory"; +import { DataSourceSubSector as _DataSourceSubSector } from "./DataSourceSubSector"; +import type { DataSourceSubSectorAttributes, DataSourceSubSectorCreationAttributes } from "./DataSourceSubSector"; +import { EmissionsFactor as _EmissionsFactor } from "./EmissionsFactor"; +import type { EmissionsFactorAttributes, EmissionsFactorCreationAttributes } from "./EmissionsFactor"; +import { GDP as _GDP } from "./GDP"; +import type { GDPAttributes, GDPCreationAttributes } from "./GDP"; +import { GHGs as _GHGs } from "./GHGs"; +import type { GHGsAttributes, GHGsCreationAttributes } from "./GHGs"; +import { Inventory as _Inventory } from "./Inventory"; +import type { InventoryAttributes, InventoryCreationAttributes } from "./Inventory"; +import { Methodology as _Methodology } from "./Methodology"; +import type { MethodologyAttributes, MethodologyCreationAttributes } from "./Methodology"; +import { Population as _Population } from "./Population"; +import type { PopulationAttributes, PopulationCreationAttributes } from "./Population"; +import { Publisher as _Publisher } from "./Publisher"; +import type { PublisherAttributes, PublisherCreationAttributes } from "./Publisher"; +import { ReportingLevel as _ReportingLevel } from "./ReportingLevel"; +import type { ReportingLevelAttributes, ReportingLevelCreationAttributes } from "./ReportingLevel"; +import { Scope as _Scope } from "./Scope"; +import type { ScopeAttributes, ScopeCreationAttributes } from "./Scope"; +import { Sector as _Sector } from "./Sector"; +import type { SectorAttributes, SectorCreationAttributes } from "./Sector"; +import { SectorValue as _SectorValue } from "./SectorValue"; +import type { SectorValueAttributes, SectorValueCreationAttributes } from "./SectorValue"; +import { SubCategory as _SubCategory } from "./SubCategory"; +import type { SubCategoryAttributes, SubCategoryCreationAttributes } from "./SubCategory"; +import { SubCategoryValue as _SubCategoryValue } from "./SubCategoryValue"; +import type { SubCategoryValueAttributes, SubCategoryValueCreationAttributes } from "./SubCategoryValue"; +import { SubSector as _SubSector } from "./SubSector"; +import type { SubSectorAttributes, SubSectorCreationAttributes } from "./SubSector"; +import { SubSectorReportingLevel as _SubSectorReportingLevel } from "./SubSectorReportingLevel"; +import type { SubSectorReportingLevelAttributes, SubSectorReportingLevelCreationAttributes } from "./SubSectorReportingLevel"; +import { SubSectorScope as _SubSectorScope } from "./SubSectorScope"; +import type { SubSectorScopeAttributes, SubSectorScopeCreationAttributes } from "./SubSectorScope"; +import { SubSectorValue as _SubSectorValue } from "./SubSectorValue"; +import type { SubSectorValueAttributes, SubSectorValueCreationAttributes } from "./SubSectorValue"; +import { User as _User } from "./User"; +import type { UserAttributes, UserCreationAttributes } from "./User"; +import { Version as _Version } from "./Version"; +import type { VersionAttributes, VersionCreationAttributes } from "./Version"; + +export { + _ActivityData as ActivityData, + _City as City, + _CityUser as CityUser, + _DataSource as DataSource, + _DataSourceActivityData as DataSourceActivityData, + _DataSourceEmissionsFactor as DataSourceEmissionsFactor, + _DataSourceGHGs as DataSourceGHGs, + _DataSourceMethodology as DataSourceMethodology, + _DataSourceReportingLevel as DataSourceReportingLevel, + _DataSourceScope as DataSourceScope, + _DataSourceSector as DataSourceSector, + _DataSourceSubCategory as DataSourceSubCategory, + _DataSourceSubSector as DataSourceSubSector, + _EmissionsFactor as EmissionsFactor, + _GDP as GDP, + _GHGs as GHGs, + _Inventory as Inventory, + _Methodology as Methodology, + _Population as Population, + _Publisher as Publisher, + _ReportingLevel as ReportingLevel, + _Scope as Scope, + _Sector as Sector, + _SectorValue as SectorValue, + _SubCategory as SubCategory, + _SubCategoryValue as SubCategoryValue, + _SubSector as SubSector, + _SubSectorReportingLevel as SubSectorReportingLevel, + _SubSectorScope as SubSectorScope, + _SubSectorValue as SubSectorValue, + _User as User, + _Version as Version, +}; + +export type { + ActivityDataAttributes, + ActivityDataCreationAttributes, + CityAttributes, + CityCreationAttributes, + CityUserAttributes, + CityUserCreationAttributes, + DataSourceAttributes, + DataSourceCreationAttributes, + DataSourceActivityDataAttributes, + DataSourceActivityDataCreationAttributes, + DataSourceEmissionsFactorAttributes, + DataSourceEmissionsFactorCreationAttributes, + DataSourceGHGsAttributes, + DataSourceGHGsCreationAttributes, + DataSourceMethodologyAttributes, + DataSourceMethodologyCreationAttributes, + DataSourceReportingLevelAttributes, + DataSourceReportingLevelCreationAttributes, + DataSourceScopeAttributes, + DataSourceScopeCreationAttributes, + DataSourceSectorAttributes, + DataSourceSectorCreationAttributes, + DataSourceSubCategoryAttributes, + DataSourceSubCategoryCreationAttributes, + DataSourceSubSectorAttributes, + DataSourceSubSectorCreationAttributes, + EmissionsFactorAttributes, + EmissionsFactorCreationAttributes, + GDPAttributes, + GDPCreationAttributes, + GHGsAttributes, + GHGsCreationAttributes, + InventoryAttributes, + InventoryCreationAttributes, + MethodologyAttributes, + MethodologyCreationAttributes, + PopulationAttributes, + PopulationCreationAttributes, + PublisherAttributes, + PublisherCreationAttributes, + ReportingLevelAttributes, + ReportingLevelCreationAttributes, + ScopeAttributes, + ScopeCreationAttributes, + SectorAttributes, + SectorCreationAttributes, + SectorValueAttributes, + SectorValueCreationAttributes, + SubCategoryAttributes, + SubCategoryCreationAttributes, + SubCategoryValueAttributes, + SubCategoryValueCreationAttributes, + SubSectorAttributes, + SubSectorCreationAttributes, + SubSectorReportingLevelAttributes, + SubSectorReportingLevelCreationAttributes, + SubSectorScopeAttributes, + SubSectorScopeCreationAttributes, + SubSectorValueAttributes, + SubSectorValueCreationAttributes, + UserAttributes, + UserCreationAttributes, + VersionAttributes, + VersionCreationAttributes, +}; + +export function initModels(sequelize: Sequelize) { + const ActivityData = _ActivityData.initModel(sequelize); + const City = _City.initModel(sequelize); + const CityUser = _CityUser.initModel(sequelize); + const DataSource = _DataSource.initModel(sequelize); + const DataSourceActivityData = _DataSourceActivityData.initModel(sequelize); + const DataSourceEmissionsFactor = _DataSourceEmissionsFactor.initModel(sequelize); + const DataSourceGHGs = _DataSourceGHGs.initModel(sequelize); + const DataSourceMethodology = _DataSourceMethodology.initModel(sequelize); + const DataSourceReportingLevel = _DataSourceReportingLevel.initModel(sequelize); + const DataSourceScope = _DataSourceScope.initModel(sequelize); + const DataSourceSector = _DataSourceSector.initModel(sequelize); + const DataSourceSubCategory = _DataSourceSubCategory.initModel(sequelize); + const DataSourceSubSector = _DataSourceSubSector.initModel(sequelize); + const EmissionsFactor = _EmissionsFactor.initModel(sequelize); + const GDP = _GDP.initModel(sequelize); + const GHGs = _GHGs.initModel(sequelize); + const Inventory = _Inventory.initModel(sequelize); + const Methodology = _Methodology.initModel(sequelize); + const Population = _Population.initModel(sequelize); + const Publisher = _Publisher.initModel(sequelize); + const ReportingLevel = _ReportingLevel.initModel(sequelize); + const Scope = _Scope.initModel(sequelize); + const Sector = _Sector.initModel(sequelize); + const SectorValue = _SectorValue.initModel(sequelize); + const SubCategory = _SubCategory.initModel(sequelize); + const SubCategoryValue = _SubCategoryValue.initModel(sequelize); + const SubSector = _SubSector.initModel(sequelize); + const SubSectorReportingLevel = _SubSectorReportingLevel.initModel(sequelize); + const SubSectorScope = _SubSectorScope.initModel(sequelize); + const SubSectorValue = _SubSectorValue.initModel(sequelize); + const User = _User.initModel(sequelize); + const Version = _Version.initModel(sequelize); + + ActivityData.belongsToMany(DataSource, { as: 'datasourceIdDataSources', through: DataSourceActivityData, foreignKey: "activitydataId", otherKey: "datasourceId" }); + DataSource.belongsToMany(ActivityData, { as: 'activitydataIdActivityData', through: DataSourceActivityData, foreignKey: "datasourceId", otherKey: "activitydataId" }); + DataSource.belongsToMany(EmissionsFactor, { as: 'emissionsFactorIdEmissionsFactors', through: DataSourceEmissionsFactor, foreignKey: "datasourceId", otherKey: "emissionsFactorId" }); + DataSource.belongsToMany(GHGs, { as: 'ghgIdGhgs', through: DataSourceGHGs, foreignKey: "datasourceId", otherKey: "ghgId" }); + DataSource.belongsToMany(Methodology, { as: 'methodologyIdMethodologies', through: DataSourceMethodology, foreignKey: "datasourceId", otherKey: "methodologyId" }); + DataSource.belongsToMany(ReportingLevel, { as: 'reportinglevelIdReportingLevels', through: DataSourceReportingLevel, foreignKey: "datasourceId", otherKey: "reportinglevelId" }); + DataSource.belongsToMany(Scope, { as: 'scopeIdScopes', through: DataSourceScope, foreignKey: "datasourceId", otherKey: "scopeId" }); + DataSource.belongsToMany(Sector, { as: 'sectorIdSectors', through: DataSourceSector, foreignKey: "datasourceId", otherKey: "sectorId" }); + DataSource.belongsToMany(SubCategory, { as: 'subcategoryIdSubCategories', through: DataSourceSubCategory, foreignKey: "datasourceId", otherKey: "subcategoryId" }); + DataSource.belongsToMany(SubSector, { as: 'subsectorIdSubSectors', through: DataSourceSubSector, foreignKey: "datasourceId", otherKey: "subsectorId" }); + EmissionsFactor.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceEmissionsFactors', through: DataSourceEmissionsFactor, foreignKey: "emissionsFactorId", otherKey: "datasourceId" }); + GHGs.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceGhgs', through: DataSourceGHGs, foreignKey: "ghgId", otherKey: "datasourceId" }); + Methodology.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceMethodologies', through: DataSourceMethodology, foreignKey: "methodologyId", otherKey: "datasourceId" }); + ReportingLevel.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceReportingLevels', through: DataSourceReportingLevel, foreignKey: "reportinglevelId", otherKey: "datasourceId" }); + ReportingLevel.belongsToMany(SubSector, { as: 'subsectorIdSubSectorSubSectorReportingLevels', through: SubSectorReportingLevel, foreignKey: "reportinglevelId", otherKey: "subsectorId" }); + Scope.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceScopes', through: DataSourceScope, foreignKey: "scopeId", otherKey: "datasourceId" }); + Scope.belongsToMany(SubSector, { as: 'subsectorIdSubSectorSubSectorScopes', through: SubSectorScope, foreignKey: "scopeId", otherKey: "subsectorId" }); + Sector.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceSectors', through: DataSourceSector, foreignKey: "sectorId", otherKey: "datasourceId" }); + SubCategory.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceSubCategories', through: DataSourceSubCategory, foreignKey: "subcategoryId", otherKey: "datasourceId" }); + SubSector.belongsToMany(DataSource, { as: 'datasourceIdDataSourceDataSourceSubSectors', through: DataSourceSubSector, foreignKey: "subsectorId", otherKey: "datasourceId" }); + SubSector.belongsToMany(ReportingLevel, { as: 'reportinglevelIdReportingLevelSubSectorReportingLevels', through: SubSectorReportingLevel, foreignKey: "subsectorId", otherKey: "reportinglevelId" }); + SubSector.belongsToMany(Scope, { as: 'scopeIdScopeSubSectorScopes', through: SubSectorScope, foreignKey: "subsectorId", otherKey: "scopeId" }); + DataSourceActivityData.belongsTo(ActivityData, { as: "activitydatum", foreignKey: "activitydataId"}); + ActivityData.hasMany(DataSourceActivityData, { as: "dataSourceActivityData", foreignKey: "activitydataId"}); + CityUser.belongsTo(City, { as: "city", foreignKey: "cityId"}); + City.hasMany(CityUser, { as: "cityUsers", foreignKey: "cityId"}); + GDP.belongsTo(City, { as: "city", foreignKey: "cityId"}); + City.hasMany(GDP, { as: "gdps", foreignKey: "cityId"}); + Inventory.belongsTo(City, { as: "city", foreignKey: "cityId"}); + City.hasMany(Inventory, { as: "inventories", foreignKey: "cityId"}); + Population.belongsTo(City, { as: "city", foreignKey: "cityId"}); + City.hasMany(Population, { as: "populations", foreignKey: "cityId"}); + DataSourceActivityData.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceActivityData, { as: "dataSourceActivityData", foreignKey: "datasourceId"}); + DataSourceEmissionsFactor.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceEmissionsFactor, { as: "dataSourceEmissionsFactors", foreignKey: "datasourceId"}); + DataSourceGHGs.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceGHGs, { as: "dataSourceGhgs", foreignKey: "datasourceId"}); + DataSourceMethodology.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceMethodology, { as: "dataSourceMethodologies", foreignKey: "datasourceId"}); + DataSourceReportingLevel.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceReportingLevel, { as: "dataSourceReportingLevels", foreignKey: "datasourceId"}); + DataSourceScope.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceScope, { as: "dataSourceScopes", foreignKey: "datasourceId"}); + DataSourceSector.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceSector, { as: "dataSourceSectors", foreignKey: "datasourceId"}); + DataSourceSubCategory.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceSubCategory, { as: "dataSourceSubCategories", foreignKey: "datasourceId"}); + DataSourceSubSector.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(DataSourceSubSector, { as: "dataSourceSubSectors", foreignKey: "datasourceId"}); + GDP.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(GDP, { as: "gdps", foreignKey: "datasourceId"}); + Methodology.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(Methodology, { as: "methodologies", foreignKey: "datasourceId"}); + Population.belongsTo(DataSource, { as: "datasource", foreignKey: "datasourceId"}); + DataSource.hasMany(Population, { as: "populations", foreignKey: "datasourceId"}); + DataSourceEmissionsFactor.belongsTo(EmissionsFactor, { as: "emissionsFactor", foreignKey: "emissionsFactorId"}); + EmissionsFactor.hasMany(DataSourceEmissionsFactor, { as: "dataSourceEmissionsFactors", foreignKey: "emissionsFactorId"}); + SubCategoryValue.belongsTo(EmissionsFactor, { as: "emissionsFactor", foreignKey: "emissionsFactorId"}); + EmissionsFactor.hasMany(SubCategoryValue, { as: "subCategoryValues", foreignKey: "emissionsFactorId"}); + SubSectorValue.belongsTo(EmissionsFactor, { as: "emissionsFactor", foreignKey: "emissionsFactorId"}); + EmissionsFactor.hasMany(SubSectorValue, { as: "subSectorValues", foreignKey: "emissionsFactorId"}); + DataSourceGHGs.belongsTo(GHGs, { as: "ghg", foreignKey: "ghgId"}); + GHGs.hasMany(DataSourceGHGs, { as: "dataSourceGhgs", foreignKey: "ghgId"}); + SectorValue.belongsTo(Inventory, { as: "inventory", foreignKey: "inventoryId"}); + Inventory.hasMany(SectorValue, { as: "sectorValues", foreignKey: "inventoryId"}); + SubCategoryValue.belongsTo(Inventory, { as: "inventory", foreignKey: "inventoryId"}); + Inventory.hasMany(SubCategoryValue, { as: "subCategoryValues", foreignKey: "inventoryId"}); + SubSectorValue.belongsTo(Inventory, { as: "inventory", foreignKey: "inventoryId"}); + Inventory.hasMany(SubSectorValue, { as: "subSectorValues", foreignKey: "inventoryId"}); + Version.belongsTo(Inventory, { as: "inventory", foreignKey: "inventoryId"}); + Inventory.hasMany(Version, { as: "versions", foreignKey: "inventoryId"}); + DataSourceMethodology.belongsTo(Methodology, { as: "methodology", foreignKey: "methodologyId"}); + Methodology.hasMany(DataSourceMethodology, { as: "dataSourceMethodologies", foreignKey: "methodologyId"}); + DataSource.belongsTo(Publisher, { as: "publisher", foreignKey: "publisherId"}); + Publisher.hasMany(DataSource, { as: "dataSources", foreignKey: "publisherId"}); + ActivityData.belongsTo(ReportingLevel, { as: "reportinglevel", foreignKey: "reportinglevelId"}); + ReportingLevel.hasMany(ActivityData, { as: "activityData", foreignKey: "reportinglevelId"}); + DataSourceReportingLevel.belongsTo(ReportingLevel, { as: "reportinglevel", foreignKey: "reportinglevelId"}); + ReportingLevel.hasMany(DataSourceReportingLevel, { as: "dataSourceReportingLevels", foreignKey: "reportinglevelId"}); + SubCategory.belongsTo(ReportingLevel, { as: "reportinglevel", foreignKey: "reportinglevelId"}); + ReportingLevel.hasMany(SubCategory, { as: "subCategories", foreignKey: "reportinglevelId"}); + SubSectorReportingLevel.belongsTo(ReportingLevel, { as: "reportinglevel", foreignKey: "reportinglevelId"}); + ReportingLevel.hasMany(SubSectorReportingLevel, { as: "subSectorReportingLevels", foreignKey: "reportinglevelId"}); + ActivityData.belongsTo(Scope, { as: "scope", foreignKey: "scopeId"}); + Scope.hasMany(ActivityData, { as: "activityData", foreignKey: "scopeId"}); + DataSourceScope.belongsTo(Scope, { as: "scope", foreignKey: "scopeId"}); + Scope.hasMany(DataSourceScope, { as: "dataSourceScopes", foreignKey: "scopeId"}); + SubCategory.belongsTo(Scope, { as: "scope", foreignKey: "scopeId"}); + Scope.hasMany(SubCategory, { as: "subCategories", foreignKey: "scopeId"}); + SubSectorScope.belongsTo(Scope, { as: "scope", foreignKey: "scopeId"}); + Scope.hasMany(SubSectorScope, { as: "subSectorScopes", foreignKey: "scopeId"}); + DataSourceSector.belongsTo(Sector, { as: "sector", foreignKey: "sectorId"}); + Sector.hasMany(DataSourceSector, { as: "dataSourceSectors", foreignKey: "sectorId"}); + SectorValue.belongsTo(Sector, { as: "sector", foreignKey: "sectorId"}); + Sector.hasMany(SectorValue, { as: "sectorValues", foreignKey: "sectorId"}); + SubSector.belongsTo(Sector, { as: "sector", foreignKey: "sectorId"}); + Sector.hasMany(SubSector, { as: "subSectors", foreignKey: "sectorId"}); + SubCategoryValue.belongsTo(SectorValue, { as: "sectorValue", foreignKey: "sectorValueId"}); + SectorValue.hasMany(SubCategoryValue, { as: "subCategoryValues", foreignKey: "sectorValueId"}); + SubSectorValue.belongsTo(SectorValue, { as: "sectorValue", foreignKey: "sectorValueId"}); + SectorValue.hasMany(SubSectorValue, { as: "subSectorValues", foreignKey: "sectorValueId"}); + ActivityData.belongsTo(SubCategory, { as: "subcategory", foreignKey: "subcategoryId"}); + SubCategory.hasMany(ActivityData, { as: "activityData", foreignKey: "subcategoryId"}); + DataSourceSubCategory.belongsTo(SubCategory, { as: "subcategory", foreignKey: "subcategoryId"}); + SubCategory.hasMany(DataSourceSubCategory, { as: "dataSourceSubCategories", foreignKey: "subcategoryId"}); + SubCategoryValue.belongsTo(SubCategory, { as: "subcategory", foreignKey: "subcategoryId"}); + SubCategory.hasMany(SubCategoryValue, { as: "subCategoryValues", foreignKey: "subcategoryId"}); + DataSourceSubSector.belongsTo(SubSector, { as: "subsector", foreignKey: "subsectorId"}); + SubSector.hasMany(DataSourceSubSector, { as: "dataSourceSubSectors", foreignKey: "subsectorId"}); + SubCategory.belongsTo(SubSector, { as: "subsector", foreignKey: "subsectorId"}); + SubSector.hasMany(SubCategory, { as: "subCategories", foreignKey: "subsectorId"}); + SubSectorReportingLevel.belongsTo(SubSector, { as: "subsector", foreignKey: "subsectorId"}); + SubSector.hasMany(SubSectorReportingLevel, { as: "subSectorReportingLevels", foreignKey: "subsectorId"}); + SubSectorScope.belongsTo(SubSector, { as: "subsector", foreignKey: "subsectorId"}); + SubSector.hasMany(SubSectorScope, { as: "subSectorScopes", foreignKey: "subsectorId"}); + SubSectorValue.belongsTo(SubSector, { as: "subsector", foreignKey: "subsectorId"}); + SubSector.hasMany(SubSectorValue, { as: "subSectorValues", foreignKey: "subsectorId"}); + CityUser.belongsTo(User, { as: "user", foreignKey: "userId"}); + User.hasMany(CityUser, { as: "cityUsers", foreignKey: "userId"}); + User.belongsTo(User, { as: "organization", foreignKey: "organizationId"}); + User.hasMany(User, { as: "users", foreignKey: "organizationId"}); + + return { + ActivityData: ActivityData, + City: City, + CityUser: CityUser, + DataSource: DataSource, + DataSourceActivityData: DataSourceActivityData, + DataSourceEmissionsFactor: DataSourceEmissionsFactor, + DataSourceGHGs: DataSourceGHGs, + DataSourceMethodology: DataSourceMethodology, + DataSourceReportingLevel: DataSourceReportingLevel, + DataSourceScope: DataSourceScope, + DataSourceSector: DataSourceSector, + DataSourceSubCategory: DataSourceSubCategory, + DataSourceSubSector: DataSourceSubSector, + EmissionsFactor: EmissionsFactor, + GDP: GDP, + GHGs: GHGs, + Inventory: Inventory, + Methodology: Methodology, + Population: Population, + Publisher: Publisher, + ReportingLevel: ReportingLevel, + Scope: Scope, + Sector: Sector, + SectorValue: SectorValue, + SubCategory: SubCategory, + SubCategoryValue: SubCategoryValue, + SubSector: SubSector, + SubSectorReportingLevel: SubSectorReportingLevel, + SubSectorScope: SubSectorScope, + SubSectorValue: SubSectorValue, + User: User, + Version: Version, + }; +} diff --git a/app/src/util/api.ts b/app/src/util/api.ts index fb64ec436..3baf61026 100644 --- a/app/src/util/api.ts +++ b/app/src/util/api.ts @@ -1,11 +1,12 @@ import createHttpError from "http-errors"; -import { NextResponse } from "next/server"; +import { NextRequest, NextResponse } from "next/server"; import { ZodError } from "zod"; import { db } from "@/models"; +import { ValidationError } from "sequelize"; -export function apiHandler(handler: (req: Request) => Promise) { - return async (req: Request) => { +export function apiHandler(handler: (req: NextRequest, props: { params: Record }) => Promise) { + return async (req: NextRequest, props: { params: Record }) => { try { if (!db.initialized) { await db.initialize(); @@ -14,18 +15,21 @@ export function apiHandler(handler: (req: Request) => Promise) { // TODO JWT authentication logic here // await jwtMiddleware(req); - return await handler(req); + return await handler(req, props); } catch (err) { return errorHandler(err, req); } }; } -function errorHandler(err: unknown, req: Request) { +function errorHandler(err: unknown, req: NextRequest) { + console.error(err); if (createHttpError.isHttpError(err) && err.expose) { return NextResponse.json({ error: { message: err.message } }, { status: err.statusCode }); } else if (err instanceof ZodError) { return NextResponse.json({ error: { message: 'Invalid request', issues: err.issues } }, { status: 400 }); + } else if (err instanceof ValidationError && err.name === 'SequelizeUniqueConstraintError') { + return NextResponse.json({ error: { message: 'Entity exists already.', issues: err.errors } }, { status: 400 }); } else { return NextResponse.json({ error: { nessage: 'Internal server error', error: err } }, { status: 500 }); } diff --git a/app/src/util/validation.ts b/app/src/util/validation.ts new file mode 100644 index 000000000..475e2adc2 --- /dev/null +++ b/app/src/util/validation.ts @@ -0,0 +1,30 @@ +import { z } from "zod"; + +export const geoJSON = z.object({ + title: z.string(), + description: z.string(), + geometry: z.object({ + type: z.literal('Feature'), + properties: z.object({}), + geometry: z.object({ + coordinates: z.number().array(), + type: z.literal('Point'), + }), + }), +}); + +export const createCityRequest = z.object({ + locode: z.string().min(4), + name: z.string().min(1), + shape: geoJSON.optional(), + country: z.string().optional(), + region: z.string().optional(), + area: z.number().int().optional(), +}); + +export const createInventoryRequest = z.object({ + inventoryName: z.string().min(1), + year: z.number().int().min(2000), + totalEmissions: z.number().int().optional(), +}); + diff --git a/app/tests/models.test.ts b/app/tests/models.test.ts new file mode 100644 index 000000000..439b4179a --- /dev/null +++ b/app/tests/models.test.ts @@ -0,0 +1,38 @@ +import { before, describe, it } from 'node:test'; +import assert from 'node:assert/strict'; +import { randomUUID } from 'node:crypto'; +import 'dotenv/config'; + +import { db } from '@/models'; + +const email = 'test@openearth.org'; +const locode = 'XX_XYZ'; + +describe('Models', () => { + before(async () => { + await db.initialize(); + await db.models.User.destroy({ where: { email } }); + await db.models.City.destroy({ where: { locode } }); + }); + + describe('User model', () => { + it('should have unique emails', async () => { + const user = await db.models.User.create({ userId: randomUUID(), email }); + assert.equal(user.email, email); + await assert.rejects(() => { + return db.models.User.create({ userId: randomUUID(), email }); + }); + }); + }); + + describe('City model', () => { + it('should have unique UN locodes', async () => { + const city = await db.models.City.create({ cityId: randomUUID(), locode }); + assert.equal(city.locode, locode); + await assert.rejects(() => { + return db.models.City.create({ cityId: randomUUID(), locode }); + }); + }); + }); +}); + diff --git a/schema/ActivityData.sql b/schema/ActivityData.sql deleted file mode 100644 index 323c3264e..000000000 --- a/schema/ActivityData.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE "ActivityData"( - "activitydata_id" uuid, - "activitydata" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("activitydata_id"), - CONSTRAINT "FK_ActivityData.subcategory_id" - FOREIGN KEY("subcategory_id") - REFERENCES "SubCategory" ("subcategory_id"), - CONSTRAINT "FK_ActivityData.scope_id" - FOREIGN KEY("scope_id") - REFERENCES "Scope" ("scope_id"), - CONSTRAINT "FK_ActivityData.reportinglevel_id" - FOREIGN KEY("reportinglevel_id") - REFERENCES "ReportingLevel" ("reportinglevel_id") -); \ No newline at end of file diff --git a/schema/City.sql b/schema/City.sql deleted file mode 100644 index a23b1d92b..000000000 --- a/schema/City.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE "City" ( - "city_id" uuid, /* city ID */ - "name" varchar(255), - "shape" json, - "country" varchar(255), - "region" varchar(255), - "area" bigint, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("city_id") -); \ No newline at end of file diff --git a/schema/CityUser.sql b/schema/CityUser.sql deleted file mode 100644 index 3cf0108c9..000000000 --- a/schema/CityUser.sql +++ /dev/null @@ -1,19 +0,0 @@ -/* linking users to cities -* -* users and cities can be a many-to-many relationship -*/ - -CREATE TABLE "CityUser" ( - "city_user_id" uuid, - "user_id" uuid, - "city_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("city_user_id"), - CONSTRAINT "FK_CityUser.user_id" - FOREIGN KEY ("user_id") - REFERENCES "User.user_id", - CONSTRAINT "FK_CityUser.city_id" - FOREIGN KEY ("city_id") - REFERENCES "City.city_id" -); \ No newline at end of file diff --git a/schema/DataSource.sql b/schema/DataSource.sql deleted file mode 100644 index 4dae3cdab..000000000 --- a/schema/DataSource.sql +++ /dev/null @@ -1,26 +0,0 @@ -CREATE TABLE "DataSource"( - "datasource_id" uuid, /*Unique identifier for the datasource */ - "name" varchar(255), /* Name of the datasource */ - "URL" varchar(255), /* Link to the datasource */ - "description" TEXT, /* A brief human-readerble description of the datasource */ - "access_type" varchar(255), /* How to access the datasource. Through download, api etc */ - "geographical_location" varchar(255), /* Which regions or countries does the data source focus on */ - "latest_accounting_year" int, /* What's the latest year of the datasource */ - "frequency_of_update" varchar(255), /* How often does the datasource get updated? */ - "spacial_resolution" varchar(255), /* City boundary? Outside city boundary? */ - "language" varchar(255), - "accessibility" varchar(255), /* Is the datasource free or paid? */ - "data_quality" varchar(255), /* Is the datasource third party verified or not? */ - "notes" TEXT, /* Any other information about the datasource */ - "units" varchar(255), - "methodology_url" varchar(255), - "publisher_id" uuid, - "retrieval_method" varchar(255), - "api_endpoint" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id"), - CONSTRAINT "FK_DataSource.publisher_id" - FOREIGN KEY ("publisher_id") - REFERENCES "Publisher"("publisher_id") -); \ No newline at end of file diff --git a/schema/DataSourceActivityData.sql b/schema/DataSourceActivityData.sql deleted file mode 100644 index caf857e74..000000000 --- a/schema/DataSourceActivityData.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceActivityData"( - "datasource_id" uuid, - "activitydata_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id","activitydata_id") - CONSTRAINT "FK_DataSourceActivityData.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceActivityData.activitydata_id" - FOREIGN KEY("activitydata_id") - REFERENCES "ActivityData" ("activitydata_id"), -); \ No newline at end of file diff --git a/schema/DataSourceEmissionsFactor.sql b/schema/DataSourceEmissionsFactor.sql deleted file mode 100644 index ea01e60b8..000000000 --- a/schema/DataSourceEmissionsFactor.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceEmissionsFactor"( - "datasource_id" uuid, - "emissions_factor_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id", "emissions_factor_id"), - CONSTRAINT "FK_DataSourceEmissionsFactor.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceEmissionsFactor.emissions_factor_id" - FOREIGN KEY("emissions_factor_id") - REFERENCES "EmissionsFactor" ("emissions_factor_id") -); \ No newline at end of file diff --git a/schema/DataSourceGHGs.sql b/schema/DataSourceGHGs.sql deleted file mode 100644 index b1ea24e0a..000000000 --- a/schema/DataSourceGHGs.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceGHGs"( - "datasource_id" uuid, - "ghg_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id", "ghg_id"), - CONSTRAINT "FK_DataSourceGHGs.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id") - CONSTRAINT "FK_DataSourceGHGs.ghg_id" - FOREIGN KEY("ghg_id") - REFERENCES "GHGs" ("ghg_id") -); \ No newline at end of file diff --git a/schema/DataSourceMethodology.sql b/schema/DataSourceMethodology.sql deleted file mode 100644 index 853175a16..000000000 --- a/schema/DataSourceMethodology.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceMethodology"( - "datasource_id" uuid, - "methodology_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id", "methodology_id"), - CONSTRAINT "FK_DataSourceMethodology.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceMethodology.methodology_id" - FOREIGN KEY("methodology_id") - REFERENCES "Methodology" ("methodology_id") -); \ No newline at end of file diff --git a/schema/DataSourceReportingLevel.sql b/schema/DataSourceReportingLevel.sql deleted file mode 100644 index c9296a758..000000000 --- a/schema/DataSourceReportingLevel.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceReportingLevel"( - "datasource_id" uuid, - "reportinglevel_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id","reportinglevel_id") - CONSTRAINT "FK_DataSourceReportingLevel.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceReportingLevel.reportinglevel_id" - FOREIGN KEY("reportinglevel_id") - REFERENCES "ReportingLevel" ("reportinglevel_id") -); \ No newline at end of file diff --git a/schema/DataSourceScope.sql b/schema/DataSourceScope.sql deleted file mode 100644 index 345f9cad2..000000000 --- a/schema/DataSourceScope.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceScope"( - "datasource_id" uuid, - "scope_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id","scope_id") - CONSTRAINT "FK_DataSourceScope.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceScope.activitydata_id" - FOREIGN KEY("scope_id") - REFERENCES "Scope" ("scope_id"), -); \ No newline at end of file diff --git a/schema/DataSourceSector.sql b/schema/DataSourceSector.sql deleted file mode 100644 index c47e6e57c..000000000 --- a/schema/DataSourceSector.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceSector"( - "datasource_id" uuid, - "sector_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id", "sector_id"), - CONSTRAINT "FK_DataSourceSector_datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceSector_sector_id" - FOREIGN KEY("sector_id") - REFERENCES "Sector" ("sector_id") -); \ No newline at end of file diff --git a/schema/DataSourceSubCategory.sql b/schema/DataSourceSubCategory.sql deleted file mode 100644 index 2a488f26d..000000000 --- a/schema/DataSourceSubCategory.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceSubCategory"( - "datasource_id" uuid, - "subcategory_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id","subcategory_id"), - CONSTRAINT "FK_DataSourceSubCategory.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceSubCategory.subcategory_id" - FOREIGN KEY("subcategory_id") - REFERENCES "SubCategory" ("subcategory_id") -); \ No newline at end of file diff --git a/schema/DataSourceSubSector.sql b/schema/DataSourceSubSector.sql deleted file mode 100644 index 4dcc9d6a8..000000000 --- a/schema/DataSourceSubSector.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "DataSourceSubSector"( - "datasource_id" uuid, - "subsector_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("datasource_id","subsector_id"), - CONSTRAINT "FK_DataSourceSubSector.datasource_id" - FOREIGN KEY("datasource_id") - REFERENCES "DataSource" ("datasource_id"), - CONSTRAINT "FK_DataSourceSubSector.subsector_id" - FOREIGN KEY("subsector_id") - REFERENCES "SubSector" ("subsector_id") -); \ No newline at end of file diff --git a/schema/EmissionsFactor.sql b/schema/EmissionsFactor.sql deleted file mode 100644 index dd970c036..000000000 --- a/schema/EmissionsFactor.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE "EmissionsFactor"( - "emissions_factor_id" uuid, - "emissions_factor" numeric, - "emissions_factor_url" varchar(255), - "units" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("emissions_factor_id") -); \ No newline at end of file diff --git a/schema/GDP.sql b/schema/GDP.sql deleted file mode 100644 index 61ad63c42..000000000 --- a/schema/GDP.sql +++ /dev/null @@ -1,15 +0,0 @@ -CREATE TABLE "GDP" ( - "city_id" uuid, /* city ID */ - "gdp" bigint, /* GDP in US dollars */ - "year" int, /* Year of measurement, YYYY */ - "created" timestamp, - "last_updated" timestamp, - "datasource_id" uuid, - PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ - CONSTRAINT "FK_GDP.datasource_id" - FOREIGN KEY ("datasource_id") - REFERENCES "DataSource"("datasource_id"), - CONSTRAINT "FK_GDP.city_id" - FOREIGN KEY ("city_id") - REFERENCES "City"("city_id") -); \ No newline at end of file diff --git a/schema/GHGs.sql b/schema/GHGs.sql deleted file mode 100644 index 53521cbe1..000000000 --- a/schema/GHGs.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE "GHGs"( - "ghg_id" uuid, - "ghg_name" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("ghg_id") -); \ No newline at end of file diff --git a/schema/Inventory.sql b/schema/Inventory.sql deleted file mode 100644 index d9e92a1ab..000000000 --- a/schema/Inventory.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE "Inventory"( - "inventory_id" uuid, - "inventory_name" varchar(255), - "year" int, - "total_emissions" bigint, - "city_id" uuid, - PRIMARY KEY ("inventory_id"), - CONSTRAINT "FK_Inventory.city_id" - FOREIGN KEY ("city_id") - REFERENCES "City" ("city_id") -); \ No newline at end of file diff --git a/schema/Methodology.sql b/schema/Methodology.sql deleted file mode 100644 index 8d007d5fa..000000000 --- a/schema/Methodology.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE TABLE "Methodology"( - "methodology_id" uuid, /* Unique identifier for the methodology */ - "methodology" varchar(255), /* Description or name of methodology being used */ - "methodology_url" varchar(255), /* Link for human-readable methodology documentation */ - "datasource_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("methodology_id"), - CONSTRAINT "FK_Methodology.datasource_id" - FOREIGN KEY ("datasource_id") - REFERENCES "DataSource"("datasource_id") -); \ No newline at end of file diff --git a/schema/Population.sql b/schema/Population.sql deleted file mode 100644 index 9f88d07d2..000000000 --- a/schema/Population.sql +++ /dev/null @@ -1,15 +0,0 @@ -CREATE TABLE "Population" ( - "city_id" uuid, /* city ID */ - "population" bigint, /* Population in units; 1000 => 1000 people */ - "year" int, /* Year of measurement, YYYY */ - "created" timestamp, - "last_updated" timestamp, - "datasource_id" uuid, - PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ - CONSTRAINT "FK_Population.datasource_id" - FOREIGN KEY ("datasource_id") - REFERENCES "DataSource"("datasource_id"), - CONSTRAINT "FK_Population.city_id" - FOREIGN KEY ("city_id") - REFERENCES "City"("city_id") -); \ No newline at end of file diff --git a/schema/Publisher.sql b/schema/Publisher.sql deleted file mode 100644 index 6331ab290..000000000 --- a/schema/Publisher.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE "Publisher" ( - "publisher_id" uuid, - "name" varchar(255), - "URL" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("publisher_id") -); \ No newline at end of file diff --git a/schema/ReportingLevel.sql b/schema/ReportingLevel.sql deleted file mode 100644 index f4667667f..000000000 --- a/schema/ReportingLevel.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE "ReportingLevel"( - "reportinglevel_id" uuid, - "reportinglevel_name" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("reportinglevel_id") -); \ No newline at end of file diff --git a/schema/Scope.sql b/schema/Scope.sql deleted file mode 100644 index b37a4b4a7..000000000 --- a/schema/Scope.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE "Scope"( - "scope_id" uuid, - "scope_name" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("scope_id") -); \ No newline at end of file diff --git a/schema/Sector.sql b/schema/Sector.sql deleted file mode 100644 index 8d2630fdc..000000000 --- a/schema/Sector.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE "Sector"( - "sector_id" uuid, - "sector_name" varchar(255), - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("sector_id") -); \ No newline at end of file diff --git a/schema/SectorValue.sql b/schema/SectorValue.sql deleted file mode 100644 index c47460cfe..000000000 --- a/schema/SectorValue.sql +++ /dev/null @@ -1,15 +0,0 @@ -CREATE TABLE "SectorValue" ( - "sector_value_id" uuid, - "total_emissions" numeric, - "sector_id" uuid, - "inventory_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("sector_value_id"), - CONSTRAINT "FK_SectorValue.sector_id" - FOREIGN KEY ("sector_id") - REFERENCES "Sector"("sector_id"), - CONSTRAINT "FK_SectorValue.inventory_id" - FOREIGN KEY ("inventory_id") - REFERENCES "Inventory"("inventory_id") -); \ No newline at end of file diff --git a/schema/SubCategory.sql b/schema/SubCategory.sql deleted file mode 100644 index bd326e272..000000000 --- a/schema/SubCategory.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE TABLE "SubCategory"( - "subcategory_id" uuid, - "subcategory_name" varchar(255), - "activity_name" varchar(255), - "subsector_id" uuid, - "scope_id" uuid, - "reportinglevel_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("subcategory_id"), - CONSTRAINT "FK_SubCategory.subsector_id" - FOREIGN KEY("subsector_id") - REFERENCES "SubSector" ("subsector_id"), - CONSTRAINT "FK_SubCategory.scope_id" - FOREIGN KEY("scope_id") - REFERENCES "Scope" ("scope_id"), - CONSTRAINT "FK_SubCategory.reportinglevel_id" - FOREIGN KEY("reportinglevel_id") - REFERENCES "ReportingLevel" ("reportinglevel_id") -); \ No newline at end of file diff --git a/schema/SubCategoryValue.sql b/schema/SubCategoryValue.sql deleted file mode 100644 index 13230855e..000000000 --- a/schema/SubCategoryValue.sql +++ /dev/null @@ -1,26 +0,0 @@ -CREATE TABLE "SubCategoryValue" ( - "subcategory_value_id" uuid, - "activity_units" varchar(255), - "activity_value" numeric, - "emission_factor_value" numeric, - "total_emissions" numeric, - "emissions_factor_id" uuid, - "subcategory_id" uuid, - "sector_value_id" uuid, - "inventory_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("subcategory_value_id"), - CONSTRAINT "FK_SubCategoryValue.emissions_factor_id" - FOREIGN KEY ("emissions_factor_id") - REFERENCES "EmissionsFactor"("emissions_factor_id"), - CONSTRAINT "FK_SubCategoryValue.subcategory_id" - FOREIGN KEY ("subcategory_id") - REFERENCES "SubCategory"("subcategory_id"), - CONSTRAINT "FK_SubCategoryValue.sector_value_id" - FOREIGN KEY ("sector_value_id") - REFERENCES "SectorValue"("sector_value_id"), - CONSTRAINT "FK_SubCategoryValue.inventory_id" - FOREIGN KEY ("inventory_id") - REFERENCES "Inventory"("inventory_id") -); \ No newline at end of file diff --git a/schema/SubSector.sql b/schema/SubSector.sql deleted file mode 100644 index eb39c2adc..000000000 --- a/schema/SubSector.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE "SubSector"( - "subsector_id" uuid, - "subsector_name" varchar(255), - "sector_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY("subsector_id"), - CONSTRAINT "FK_SubSector.sector_id" - FOREIGN KEY("sector_id") - REFERENCES "Sector" ("sector_id") -); \ No newline at end of file diff --git a/schema/SubSectorReportingLevel.sql b/schema/SubSectorReportingLevel.sql deleted file mode 100644 index ed4a76128..000000000 --- a/schema/SubSectorReportingLevel.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "SubSectorReportingLevel"( - "subsector_id" uuid, - "reportinglevel_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("subsector_id", "reportinglevel_id"), - CONSTRAINT "FK_SubSectorReportingLevel.subsector_id" - FOREIGN KEY("subsector_id") - REFERENCES "SubSector" ("subsector_id"), - CONSTRAINT "FK_SubSectorReportingLevel.reportinglevel_id" - FOREIGN KEY("reportinglevel_id") - REFERENCES "ReportingLevel" ("reportinglevel_id") -); \ No newline at end of file diff --git a/schema/SubSectorScope.sql b/schema/SubSectorScope.sql deleted file mode 100644 index ebcbb4831..000000000 --- a/schema/SubSectorScope.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE "SubSectorScope"( - "subsector_id" uuid, - "scope_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("subsector_id", "scope_id"), - CONSTRAINT "FK_SubSectorScope.subsector_id" - FOREIGN KEY("subsector_id") - REFERENCES "SubSector" ("subsector_id"), - CONSTRAINT "FK_SubSectorScope.scope_id" - FOREIGN KEY("scope_id") - REFERENCES "Scope" ("scope_id") -); \ No newline at end of file diff --git a/schema/SubSectorValue.sql b/schema/SubSectorValue.sql deleted file mode 100644 index 4830d927c..000000000 --- a/schema/SubSectorValue.sql +++ /dev/null @@ -1,26 +0,0 @@ -CREATE TABLE "SubSectorValue" ( - "subsector_value_id" uuid, - "activity_units" varchar(255), - "activity_value" numeric, - "emission_factor_value" numeric, - "total_emissions" numeric, - "emissions_factor_id" uuid, - "subsector_id" uuid, - "sector_value_id" uuid, - "inventory_id" uuid, - "created" timestamp, - "last_updated" timestamp, - PRIMARY KEY ("subsector_value_id"), - CONSTRAINT "FK_SubSectorValue.emissions_factor_id" - FOREIGN KEY ("emissions_factor_id") - REFERENCES "EmissionsFactor"("emissions_factor_id"), - CONSTRAINT "FK_SubSectorValue.subsector_id" - FOREIGN KEY ("subsector_id") - REFERENCES "SubSector"("subsector_id"), - CONSTRAINT "FK_SubSectorValue.sector_value_id" - FOREIGN KEY ("sector_value_id") - REFERENCES "SectorValue"("sector_value_id"), - CONSTRAINT "FK_SubSectorValue.inventory_id" - FOREIGN KEY ("inventory_id") - REFERENCES "Inventory"("inventory_id") -); \ No newline at end of file diff --git a/schema/User.sql b/schema/User.sql deleted file mode 100644 index 48ffc7f0f..000000000 --- a/schema/User.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE user ( - user_id uuid PRIMARY KEY, - name text, - picture_url text, - is_organization boolean DEFAULT false, - email text, - password_hash text, - role text, - created timestamp, - last_updated timestamp, - organization_id uuid, - CONSTRAINT "FK_user.organization_id" - FOREIGN KEY("organization_id") - REFERENCES "user" ("id") -); - diff --git a/schema/Version.sql b/schema/Version.sql deleted file mode 100644 index d06fdaebe..000000000 --- a/schema/Version.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE TABLE "Version"( - "version_id" uuid, - "year" int, - "version" varchar(255), - "inventory_id" uuid, - PRIMARY KEY ("version_id"), - CONSTRAINT "FK_Version.inventory_id" - FOREIGN KEY ("inventory_id") - REFERENCES "Inventory"("inventory_id") -); \ No newline at end of file diff --git a/schema/db.sql b/schema/db.sql new file mode 100644 index 000000000..184f2dd16 --- /dev/null +++ b/schema/db.sql @@ -0,0 +1,469 @@ +CREATE TABLE "User" ( + "user_id" uuid PRIMARY KEY, + "name" varchar(255), + "picture_url" text, + "is_organization" boolean DEFAULT false, + "email" varchar(255) UNIQUE, + "password_hash" char(60), + "role" text, + "created" timestamp, + "last_updated" timestamp, + "organization_id" uuid, + CONSTRAINT "FK_user.organization_id" + FOREIGN KEY("organization_id") + REFERENCES "User" ("user_id") +); + +CREATE TABLE "City" ( + "city_id" uuid, + "locode" varchar(255) UNIQUE, + "name" varchar(255), + "shape" jsonb, + "country" varchar(255), + "region" varchar(255), + "area" bigint, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("city_id") +); + +CREATE TABLE "CityUser" ( + "city_user_id" uuid, + "user_id" uuid, + "city_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("city_user_id"), + CONSTRAINT "FK_CityUser.user_id" + FOREIGN KEY ("user_id") + REFERENCES "User" ("user_id"), + CONSTRAINT "FK_CityUser.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") +); + +CREATE TABLE "Publisher" ( + "publisher_id" uuid, + "name" varchar(255), + "URL" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("publisher_id") +); + +CREATE TABLE "ReportingLevel" ( + "reportinglevel_id" uuid, + "reportinglevel_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("reportinglevel_id") +); + +CREATE TABLE "Scope" ( + "scope_id" uuid, + "scope_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("scope_id") +); + +CREATE TABLE "Sector" ( + "sector_id" uuid, + "sector_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("sector_id") +); + +CREATE TABLE "SubSector" ( + "subsector_id" uuid, + "subsector_name" varchar(255), + "sector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("subsector_id"), + CONSTRAINT "FK_SubSector.sector_id" + FOREIGN KEY("sector_id") + REFERENCES "Sector" ("sector_id") +); + +CREATE TABLE "SubCategory" ( + "subcategory_id" uuid, + "subcategory_name" varchar(255), + "activity_name" varchar(255), + "subsector_id" uuid, + "scope_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("subcategory_id"), + CONSTRAINT "FK_SubCategory.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubCategory.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id"), + CONSTRAINT "FK_SubCategory.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") +); + +CREATE TABLE "ActivityData" ( + "activitydata_id" uuid, + "activitydata" varchar(255), + "subcategory_id" uuid, + "scope_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("activitydata_id"), + CONSTRAINT "FK_ActivityData.subcategory_id" + FOREIGN KEY("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id"), + CONSTRAINT "FK_ActivityData.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id"), + CONSTRAINT "FK_ActivityData.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") +); + +CREATE TABLE "EmissionsFactor" ( + "emissions_factor_id" uuid, + "emissions_factor" numeric, + "emissions_factor_url" varchar(255), + "units" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("emissions_factor_id") +); + +CREATE TABLE "GHGs" ( + "ghg_id" uuid, + "ghg_name" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("ghg_id") +); + +CREATE TABLE "DataSource" ( + "datasource_id" uuid, /*Unique identifier for the datasource */ + "name" varchar(255), /* Name of the datasource */ + "URL" varchar(255), /* Link to the datasource */ + "description" TEXT, /* A brief human-readerble description of the datasource */ + "access_type" varchar(255), /* How to access the datasource. Through download, api etc */ + "geographical_location" varchar(255), /* Which regions or countries does the data source focus on */ + "latest_accounting_year" int, /* What's the latest year of the datasource */ + "frequency_of_update" varchar(255), /* How often does the datasource get updated? */ + "spacial_resolution" varchar(255), /* City boundary? Outside city boundary? */ + "language" varchar(255), + "accessibility" varchar(255), /* Is the datasource free or paid? */ + "data_quality" varchar(255), /* Is the datasource third party verified or not? */ + "notes" TEXT, /* Any other information about the datasource */ + "units" varchar(255), + "methodology_url" varchar(255), + "publisher_id" uuid, + "retrieval_method" varchar(255), + "api_endpoint" varchar(255), + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id"), + CONSTRAINT "FK_DataSource.publisher_id" + FOREIGN KEY ("publisher_id") + REFERENCES "Publisher" ("publisher_id") +); + +CREATE TABLE "Methodology" ( + "methodology_id" uuid, /* Unique identifier for the methodology */ + "methodology" varchar(255), /* Description or name of methodology being used */ + "methodology_url" varchar(255), /* Link for human-readable methodology documentation */ + "datasource_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("methodology_id"), + CONSTRAINT "FK_Methodology.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id") +); + +CREATE TABLE "DataSourceActivityData" ( + "datasource_id" uuid, + "activitydata_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "activitydata_id"), + CONSTRAINT "FK_DataSourceActivityData.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceActivityData.activitydata_id" + FOREIGN KEY("activitydata_id") + REFERENCES "ActivityData" ("activitydata_id") +); + +CREATE TABLE "DataSourceEmissionsFactor" ( + "datasource_id" uuid, + "emissions_factor_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "emissions_factor_id"), + CONSTRAINT "FK_DataSourceEmissionsFactor.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceEmissionsFactor.emissions_factor_id" + FOREIGN KEY("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id") +); + +CREATE TABLE "DataSourceGHGs" ( + "datasource_id" uuid, + "ghg_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "ghg_id"), + CONSTRAINT "FK_DataSourceGHGs.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceGHGs.ghg_id" + FOREIGN KEY("ghg_id") + REFERENCES "GHGs" ("ghg_id") +); + +CREATE TABLE "DataSourceMethodology" ( + "datasource_id" uuid, + "methodology_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "methodology_id"), + CONSTRAINT "FK_DataSourceMethodology.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceMethodology.methodology_id" + FOREIGN KEY("methodology_id") + REFERENCES "Methodology" ("methodology_id") +); + +CREATE TABLE "DataSourceReportingLevel" ( + "datasource_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","reportinglevel_id"), + CONSTRAINT "FK_DataSourceReportingLevel.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceReportingLevel.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") +); + +CREATE TABLE "DataSourceScope" ( + "datasource_id" uuid, + "scope_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","scope_id"), + CONSTRAINT "FK_DataSourceScope.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceScope.activitydata_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id") +); + +CREATE TABLE "DataSourceSector" ( + "datasource_id" uuid, + "sector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id", "sector_id"), + CONSTRAINT "FK_DataSourceSector_datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSector_sector_id" + FOREIGN KEY("sector_id") + REFERENCES "Sector" ("sector_id") +); + +CREATE TABLE "DataSourceSubCategory" ( + "datasource_id" uuid, + "subcategory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","subcategory_id"), + CONSTRAINT "FK_DataSourceSubCategory.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSubCategory.subcategory_id" + FOREIGN KEY("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id") +); + +CREATE TABLE "DataSourceSubSector" ( + "datasource_id" uuid, + "subsector_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY("datasource_id","subsector_id"), + CONSTRAINT "FK_DataSourceSubSector.datasource_id" + FOREIGN KEY("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_DataSourceSubSector.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id") +); + +CREATE TABLE "GDP" ( + "city_id" uuid, /* city ID */ + "gdp" bigint, /* GDP in US dollars */ + "year" int, /* Year of measurement, YYYY */ + "created" timestamp, + "last_updated" timestamp, + "datasource_id" uuid, + PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ + CONSTRAINT "FK_GDP.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_GDP.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") +); + +CREATE TABLE "Inventory" ( + "inventory_id" uuid, + "inventory_name" varchar(255), + "year" int, + "total_emissions" bigint, + "city_id" uuid, + PRIMARY KEY ("inventory_id"), + CONSTRAINT "FK_Inventory.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") +); + +CREATE TABLE "Population" ( + "city_id" uuid, /* city ID */ + "population" bigint, /* Population in units; 1000 => 1000 people */ + "year" int, /* Year of measurement, YYYY */ + "created" timestamp, + "last_updated" timestamp, + "datasource_id" uuid, + PRIMARY KEY ("city_id", "year"), /* One record per actor per year */ + CONSTRAINT "FK_Population.datasource_id" + FOREIGN KEY ("datasource_id") + REFERENCES "DataSource" ("datasource_id"), + CONSTRAINT "FK_Population.city_id" + FOREIGN KEY ("city_id") + REFERENCES "City" ("city_id") +); + +CREATE TABLE "SectorValue" ( + "sector_value_id" uuid, + "total_emissions" numeric, + "sector_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("sector_value_id"), + CONSTRAINT "FK_SectorValue.sector_id" + FOREIGN KEY ("sector_id") + REFERENCES "Sector" ("sector_id"), + CONSTRAINT "FK_SectorValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") +); + +CREATE TABLE "SubCategoryValue" ( + "subcategory_value_id" uuid, + "activity_units" varchar(255), + "activity_value" numeric, + "emission_factor_value" numeric, + "total_emissions" numeric, + "emissions_factor_id" uuid, + "subcategory_id" uuid, + "sector_value_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subcategory_value_id"), + CONSTRAINT "FK_SubCategoryValue.emissions_factor_id" + FOREIGN KEY ("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id"), + CONSTRAINT "FK_SubCategoryValue.subcategory_id" + FOREIGN KEY ("subcategory_id") + REFERENCES "SubCategory" ("subcategory_id"), + CONSTRAINT "FK_SubCategoryValue.sector_value_id" + FOREIGN KEY ("sector_value_id") + REFERENCES "SectorValue" ("sector_value_id"), + CONSTRAINT "FK_SubCategoryValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") +); + +CREATE TABLE "SubSectorReportingLevel" ( + "subsector_id" uuid, + "reportinglevel_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_id", "reportinglevel_id"), + CONSTRAINT "FK_SubSectorReportingLevel.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorReportingLevel.reportinglevel_id" + FOREIGN KEY("reportinglevel_id") + REFERENCES "ReportingLevel" ("reportinglevel_id") +); + +CREATE TABLE "SubSectorScope" ( + "subsector_id" uuid, + "scope_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_id", "scope_id"), + CONSTRAINT "FK_SubSectorScope.subsector_id" + FOREIGN KEY("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorScope.scope_id" + FOREIGN KEY("scope_id") + REFERENCES "Scope" ("scope_id") +); + +CREATE TABLE "SubSectorValue" ( + "subsector_value_id" uuid, + "activity_units" varchar(255), + "activity_value" numeric, + "emission_factor_value" numeric, + "total_emissions" numeric, + "emissions_factor_id" uuid, + "subsector_id" uuid, + "sector_value_id" uuid, + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("subsector_value_id"), + CONSTRAINT "FK_SubSectorValue.emissions_factor_id" + FOREIGN KEY ("emissions_factor_id") + REFERENCES "EmissionsFactor" ("emissions_factor_id"), + CONSTRAINT "FK_SubSectorValue.subsector_id" + FOREIGN KEY ("subsector_id") + REFERENCES "SubSector" ("subsector_id"), + CONSTRAINT "FK_SubSectorValue.sector_value_id" + FOREIGN KEY ("sector_value_id") + REFERENCES "SectorValue" ("sector_value_id"), + CONSTRAINT "FK_SubSectorValue.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") +); + +CREATE TABLE "Version" ( + "version_id" uuid, + "year" int, + "version" varchar(255), + "inventory_id" uuid, + "created" timestamp, + "last_updated" timestamp, + PRIMARY KEY ("version_id"), + CONSTRAINT "FK_Version.inventory_id" + FOREIGN KEY ("inventory_id") + REFERENCES "Inventory" ("inventory_id") +); + diff --git a/schema/reset.sql b/schema/reset.sql new file mode 100644 index 000000000..7ceee4b60 --- /dev/null +++ b/schema/reset.sql @@ -0,0 +1,6 @@ +DROP SCHEMA public CASCADE; +CREATE SCHEMA public; +GRANT ALL ON SCHEMA public TO postgres; +GRANT ALL ON SCHEMA public TO public; +COMMENT ON SCHEMA public IS 'standard public schema'; +