From 043105b8720212178e5fd12eba3d52ec5461dde9 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Thu, 27 Aug 2020 23:48:28 -0700 Subject: [PATCH 01/11] Setup sequelize models for words. --- .gitignore | 2 + .nvmrc | 1 + package.json | 19 ++ .../elasticsearch-mysql/.env.example | 7 + .../elasticsearch-mysql/docker-compose.yaml | 99 +++++++ .../elasticsearch-mysql/package-lock.json | 256 ++++++++++++++++++ .../elasticsearch-mysql/package.json | 17 ++ .../src/database/models/AltWord.js | 11 + .../src/database/models/Flag.js | 11 + .../src/database/models/FlagType.js | 11 + .../src/database/models/Level.js | 11 + .../src/database/models/Reading.js | 15 + .../src/database/models/Speech.js | 14 + .../src/database/models/SubTerm.js | 15 + .../src/database/models/Word.js | 19 ++ .../src/database/models/index.js | 30 ++ .../src/database/sequelize.js | 20 ++ .../elasticsearch-mysql/src/index.js | 22 ++ 18 files changed, 580 insertions(+) create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 package.json create mode 100644 test-api-environment/elasticsearch-mysql/.env.example create mode 100644 test-api-environment/elasticsearch-mysql/docker-compose.yaml create mode 100644 test-api-environment/elasticsearch-mysql/package-lock.json create mode 100644 test-api-environment/elasticsearch-mysql/package.json create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Flag.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Level.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Reading.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Speech.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Word.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/index.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/sequelize.js create mode 100644 test-api-environment/elasticsearch-mysql/src/index.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97aca2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +node_modules \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..d9c6647 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +12.16.1 \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..9c91d29 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "self-defined-api", + "version": "0.0.1", + "description": "The api to access the Self Defined dictionary.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/selfdefined/api.git" + }, + "author": "Self Defined - Tatiana Mac", + "license": "ISC", + "bugs": { + "url": "https://github.com/selfdefined/api/issues" + }, + "homepage": "https://github.com/selfdefined/api#readme" +} diff --git a/test-api-environment/elasticsearch-mysql/.env.example b/test-api-environment/elasticsearch-mysql/.env.example new file mode 100644 index 0000000..e88fc44 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/.env.example @@ -0,0 +1,7 @@ +# MySQL ENV Variables +MYSQL_ROOT_PASSWORD=secret +MYSQL_DATABASE=self-defined +MYSQL_USER=self-defined +MYSQL_PASSWORD=secret123 +MYSQL_HOST=localhost +MYSQL_PORT=9206 \ No newline at end of file diff --git a/test-api-environment/elasticsearch-mysql/docker-compose.yaml b/test-api-environment/elasticsearch-mysql/docker-compose.yaml new file mode 100644 index 0000000..bafeb8f --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/docker-compose.yaml @@ -0,0 +1,99 @@ +version: "2.2" +services: + es01: + image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + container_name: es01 + environment: + - node.name=es01 + - cluster.name=es-docker-cluster + - discovery.seed_hosts=es02,es03 + - cluster.initial_master_nodes=es01,es02,es03 + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + memlock: + soft: -1 + hard: -1 + volumes: + - data01:/usr/share/elasticsearch/data + ports: + - 9200:9200 + networks: + - elastic + + # es02: + # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + # container_name: es02 + # environment: + # - node.name=es02 + # - cluster.name=es-docker-cluster + # - discovery.seed_hosts=es01,es03 + # - cluster.initial_master_nodes=es01,es02,es03 + # - bootstrap.memory_lock=true + # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + # ulimits: + # memlock: + # soft: -1 + # hard: -1 + # volumes: + # - data02:/usr/share/elasticsearch/data + # ports: + # - 9201:9201 + # networks: + # - elastic + + # es03: + # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + # container_name: es03 + # environment: + # - node.name=es03 + # - cluster.name=es-docker-cluster + # - discovery.seed_hosts=es01,es02 + # - cluster.initial_master_nodes=es01,es02,es03 + # - bootstrap.memory_lock=true + # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + # ulimits: + # memlock: + # soft: -1 + # hard: -1 + # volumes: + # - data03:/usr/share/elasticsearch/data + # ports: + # - 9202:9202 + # networks: + # - elastic + + kib01: + image: docker.elastic.co/kibana/kibana:7.9.0 + container_name: kib01 + ports: + - 9201:5601 + environment: + ELASTICSEARCH_URL: http://es01:9200 + ELASTICSEARCH_HOSTS: http://es01:9200 + networks: + - elastic + + mysql: + image: "mysql:8.0.20" + container_name: mysql + restart: always + ports: + - "9206:3306" + environment: + MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" + MYSQL_DATABASE: "${MYSQL_DATABASE}" + MYSQL_USER: "${MYSQL_USER}" + MYSQL_PASSWORD: "${MYSQL_PASSWORD}" + +volumes: + data01: + driver: local + data02: + driver: local + data03: + driver: local + +networks: + elastic: + driver: bridge diff --git a/test-api-environment/elasticsearch-mysql/package-lock.json b/test-api-environment/elasticsearch-mysql/package-lock.json new file mode 100644 index 0000000..a9ef3ef --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/package-lock.json @@ -0,0 +1,256 @@ +{ + "name": "elasticsearch-mysql", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.1.tgz", + "integrity": "sha512-HnYlg/BRF8uC1FyKRFZwRaCPTPYKa+6I8QiUZFLredaGOou481cgFS4wKRFyKvQtX8xudqkSdBczJHIYSQYKrQ==" + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mysql2": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.1.0.tgz", + "integrity": "sha512-9kGVyi930rG2KaHrz3sHwtc6K+GY9d8wWk1XRSYxQiunvGcn4DwuZxOwmK11ftuhhwrYDwGx9Ta4VBwznJn36A==", + "requires": { + "cardinal": "^2.1.1", + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "~4.0.0" + } + }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "sequelize": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.3.4.tgz", + "integrity": "sha512-W6Y96N5QHTgEz5Q37v2GYbKufSXaw0b3v4rCLTPbcCMfIG0MHI42Ozp7IwiyV9bdNkfFEdY7XP8R6lWrWg4hUw==", + "requires": { + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.15", + "moment": "^2.26.0", + "moment-timezone": "^0.5.31", + "retry-as-promised": "^3.2.0", + "semver": "^7.3.2", + "sequelize-pool": "^6.0.0", + "toposort-class": "^1.0.1", + "uuid": "^8.1.0", + "validator": "^10.11.0", + "wkx": "^0.5.0" + } + }, + "sequelize-pool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", + "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" + }, + "sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "requires": { + "@types/node": "*" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/test-api-environment/elasticsearch-mysql/package.json b/test-api-environment/elasticsearch-mysql/package.json new file mode 100644 index 0000000..0aa67e9 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/package.json @@ -0,0 +1,17 @@ +{ + "name": "elasticsearch-mysql", + "version": "0.0.1", + "description": "Test setup for Self Defined API using Elastic Search and MySQL.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "node ./src" + }, + "author": "Self Defined - Simeon Smith", + "license": "ISC", + "dependencies": { + "dotenv": "^8.2.0", + "mysql2": "^2.1.0", + "sequelize": "^6.3.4" + } +} diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js new file mode 100644 index 0000000..7169d2c --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js @@ -0,0 +1,11 @@ +const { DataTypes } = require("sequelize"); + +const AltWord = (sequelize) => + sequelize.define("AltWord", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = AltWord; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js new file mode 100644 index 0000000..6e6243a --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js @@ -0,0 +1,11 @@ +const { DataTypes } = require("sequelize"); + +const Flag = (sequelize) => + sequelize.define("Flag", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = Flag; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js new file mode 100644 index 0000000..0096101 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js @@ -0,0 +1,11 @@ +const { DataTypes } = require("sequelize"); + +const FlagType = (sequelize) => + sequelize.define("FlagType", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = FlagType; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Level.js b/test-api-environment/elasticsearch-mysql/src/database/models/Level.js new file mode 100644 index 0000000..82ec3f3 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Level.js @@ -0,0 +1,11 @@ +const { DataTypes } = require("sequelize"); + +const Level = (sequelize) => + sequelize.define("Level", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = Level; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js new file mode 100644 index 0000000..5df1de4 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js @@ -0,0 +1,15 @@ +const { DataTypes } = require("sequelize"); + +const Reading = (sequelize) => + sequelize.define("Reading", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + href: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = Reading; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js b/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js new file mode 100644 index 0000000..d5c0fcd --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js @@ -0,0 +1,14 @@ +const { DataTypes } = require("sequelize"); + +const Speech = (sequelize) => + sequelize.define("Speech", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + abbrev: { + type: DataTypes.STRING, + }, + }); + +module.exports = Speech; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js new file mode 100644 index 0000000..7139683 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js @@ -0,0 +1,15 @@ +const { DataTypes } = require("sequelize"); + +const SubTerm = (sequelize) => + sequelize.define("SubTerm", { + affix: { + type: DataTypes.STRING, + allowNull: false, + }, + text: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + +module.exports = SubTerm; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js new file mode 100644 index 0000000..5ce0c34 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js @@ -0,0 +1,19 @@ +const { DataTypes } = require("sequelize"); + +const Word = (sequelize) => + sequelize.define("Word", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + }, + body: { + type: DataTypes.TEXT, + allowNull: true, + }, + }); + +module.exports = Word; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js new file mode 100644 index 0000000..9a88201 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -0,0 +1,30 @@ +const models = [ + require("./AltWord"), + require("./Flag"), + require("./FlagType"), + require("./Level"), + require("./Reading"), + require("./Speech"), + require("./SubTerm"), + require("./Word"), +]; + +module.exports.init = (sequelize) => { + for (let m = 0; m < models.length; m++) { + models[m](sequelize); + } +}; + +module.exports.initRelationships = (sequelize) => { + const { AltWord, Flag, FlagType, Level, Reading, Speech, SubTerm, Word } = sequelize.models; + AltWord.hasOne(Speech); + + Flag.hasOne(Level); + Flag.hasOne(FlagType); + + Word.hasMany(Speech); + Word.hasMany(SubTerm); + Word.hasMany(Reading); + Word.hasMany(Flag); + Word.hasMany(AltWord); +}; diff --git a/test-api-environment/elasticsearch-mysql/src/database/sequelize.js b/test-api-environment/elasticsearch-mysql/src/database/sequelize.js new file mode 100644 index 0000000..5333a83 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/sequelize.js @@ -0,0 +1,20 @@ +const { Sequelize } = require("sequelize"); +const dotenv = require("dotenv"); + +const models = require("./models"); + +dotenv.config(); + +const { MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT } = process.env; + +const sequelize = new Sequelize(MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, { + host: MYSQL_HOST, + port: MYSQL_PORT, + dialect: "mysql", +}); + +models.init(sequelize); + +models.initRelationships(sequelize); + +module.exports = sequelize; diff --git a/test-api-environment/elasticsearch-mysql/src/index.js b/test-api-environment/elasticsearch-mysql/src/index.js new file mode 100644 index 0000000..41fafc8 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/index.js @@ -0,0 +1,22 @@ +const sequelize = require("./database/sequelize"); + +async function syncDatabaseChanges() { + try { + const syncResponse = await sequelize.authenticate(); + console.log("Database authentication successful."); + + try { + const syncResponse = await sequelize.sync({ force: true }); + console.log("Database sync successful."); + sequelize.close(); + } catch (syncError) { + console.log("Unable to sync."); + throw new Error(syncError); + } + } catch (authenticateError) { + console.log("Unable to authenticate."); + throw new Error(authenticateError); + } +} + +syncDatabaseChanges(); From 6bff1ad380fb43cacde3d8280b46b77f935b53b2 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Fri, 28 Aug 2020 00:04:25 -0700 Subject: [PATCH 02/11] Added my notes to the repo. --- .../Database Strucure Notes.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 test-api-environment/elasticsearch-mysql/Database Strucure Notes.md diff --git a/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md b/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md new file mode 100644 index 0000000..06718d9 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md @@ -0,0 +1,25 @@ +- title - string + +- slug - string + +- defined - boolean + +- speech? - id association to part of speech lookup table (one-to-many) needs intermediary join table + +- skip_in_table_of_contents - boolean + +- sub_terms? - id association to sub term table (one-to-many) needs intermediary join table + - text - string + - full_title - string +- reading? - id association to reading table (one-to-many) needs intermediary join table + - text - string + - href - string +- flag? - id association to flag table (one-to-many) needs intermediary join table + - level - id association to level lookup table + - alt-for - string - not needed + - text - string + - type - id association to flag_type lookup table +- alt_words? (one-to-many) needs intermediary join table + - type(change to speech?)? - id assocaition to part of speech lookup table + - text - string +- body? - large text \ No newline at end of file From 35b2a3b7e3119541d5b6640e5bb3a27db340fd18 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Fri, 28 Aug 2020 00:12:44 -0700 Subject: [PATCH 03/11] Setup appropriate many to many relationship for model. --- .../elasticsearch-mysql/src/database/models/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js index 9a88201..42c0067 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/index.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -22,9 +22,9 @@ module.exports.initRelationships = (sequelize) => { Flag.hasOne(Level); Flag.hasOne(FlagType); - Word.hasMany(Speech); - Word.hasMany(SubTerm); - Word.hasMany(Reading); - Word.hasMany(Flag); - Word.hasMany(AltWord); + Speech.belongsToMany(Word, { through: "Word_Speech" }); + SubTerm.belongsToMany(Word, { through: "Word_SubTerm" }); + Reading.belongsToMany(Word, { through: "Word_Reading" }); + Flag.belongsToMany(Word, { through: "Word_Flag" }); + AltWord.belongsToMany(Word, { through: "Word_AltWord" }); }; From a8ec86e16a07b3fd73ddff03cb7ceb9d4eb76aab Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 14:07:17 -0700 Subject: [PATCH 04/11] Copied linting from selfdefined/web-app repo. --- .eslintignore | 2 + .eslintrc.json | 12 + .markdownlint.json | 6 + .prettierrc | 6 + package-lock.json | 1312 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 9 +- 6 files changed, 1346 insertions(+), 1 deletion(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .markdownlint.json create mode 100644 .prettierrc create mode 100644 package-lock.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..2369e45 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +dist/ +!.eleventy.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..8673629 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "extends": ["eslint:recommended", "plugin:prettier/recommended"], + "ignorePatterns": ["node_modules/"], + "env": { + "browser": true, + "es2020": true, + "node": true + }, + "parserOptions": { + "sourceType": "module" + } +} diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..dd40ae7 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,6 @@ +{ + "MD004": {"style": "dash"}, + "MD013": false, + "MD024": false, + "MD033": false +} \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5ae9cd8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "singleQuote": true, + "useTabs": false, + "arrowParens": "always" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8465df1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1312 @@ +{ + "name": "self-defined-api", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "color-convert": { + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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 + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-plugin-prettier": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "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 + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "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" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "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 + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.differencewith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", + "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdownlint": { + "version": "0.20.4", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.20.4.tgz", + "integrity": "sha512-jpfaPgjT0OpeBbemjYNZbzGG3hCLcAIvrm/pEY3+q/szDScG6ZonDacqySVRJAv9glbo8y4wBPJ0wgW17+9GGA==", + "dev": true, + "requires": { + "markdown-it": "10.0.0" + } + }, + "markdownlint-cli": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.23.2.tgz", + "integrity": "sha512-OSl5OZ8xzGN6z355cqRkiq67zPi3reJimklaF72p0554q85Dng5ToOjjSB9tDKZebSt85jX8cp+ruoQlPqOsPA==", + "dev": true, + "requires": { + "commander": "~2.9.0", + "deep-extend": "~0.5.1", + "get-stdin": "~5.0.1", + "glob": "~7.1.2", + "ignore": "~5.1.4", + "js-yaml": "~3.13.1", + "jsonc-parser": "~2.2.0", + "lodash.differencewith": "~4.5.0", + "lodash.flatten": "~4.4.0", + "markdownlint": "~0.20.4", + "markdownlint-rule-helpers": "~0.11.0", + "minimatch": "~3.0.4", + "minimist": "~1.2.5", + "rc": "~1.2.7" + }, + "dependencies": { + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "markdownlint-rule-helpers": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.11.0.tgz", + "integrity": "sha512-PhGii9dOiDJDXxiRMpK8N0FM9powprvRPsXALgkjlSPTwLh6ymH+iF3iUe3nq8KGu26tclFBlLL5xAGy/zb7FA==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } +} diff --git a/package.json b/package.json index 9c91d29..a684920 100644 --- a/package.json +++ b/package.json @@ -15,5 +15,12 @@ "bugs": { "url": "https://github.com/selfdefined/api/issues" }, - "homepage": "https://github.com/selfdefined/api#readme" + "homepage": "https://github.com/selfdefined/api#readme", + "devDependencies": { + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-plugin-prettier": "^3.1.3", + "markdownlint-cli": "^0.23.1", + "prettier": "^1.19.1" + } } From 2c8a0b7a86518425a2dfa241407358caf621851b Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 14:07:42 -0700 Subject: [PATCH 05/11] Corrected extension of docker-compose. --- .../elasticsearch-mysql/docker-compose.yml | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 test-api-environment/elasticsearch-mysql/docker-compose.yml diff --git a/test-api-environment/elasticsearch-mysql/docker-compose.yml b/test-api-environment/elasticsearch-mysql/docker-compose.yml new file mode 100644 index 0000000..bafeb8f --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/docker-compose.yml @@ -0,0 +1,99 @@ +version: "2.2" +services: + es01: + image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + container_name: es01 + environment: + - node.name=es01 + - cluster.name=es-docker-cluster + - discovery.seed_hosts=es02,es03 + - cluster.initial_master_nodes=es01,es02,es03 + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + memlock: + soft: -1 + hard: -1 + volumes: + - data01:/usr/share/elasticsearch/data + ports: + - 9200:9200 + networks: + - elastic + + # es02: + # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + # container_name: es02 + # environment: + # - node.name=es02 + # - cluster.name=es-docker-cluster + # - discovery.seed_hosts=es01,es03 + # - cluster.initial_master_nodes=es01,es02,es03 + # - bootstrap.memory_lock=true + # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + # ulimits: + # memlock: + # soft: -1 + # hard: -1 + # volumes: + # - data02:/usr/share/elasticsearch/data + # ports: + # - 9201:9201 + # networks: + # - elastic + + # es03: + # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 + # container_name: es03 + # environment: + # - node.name=es03 + # - cluster.name=es-docker-cluster + # - discovery.seed_hosts=es01,es02 + # - cluster.initial_master_nodes=es01,es02,es03 + # - bootstrap.memory_lock=true + # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + # ulimits: + # memlock: + # soft: -1 + # hard: -1 + # volumes: + # - data03:/usr/share/elasticsearch/data + # ports: + # - 9202:9202 + # networks: + # - elastic + + kib01: + image: docker.elastic.co/kibana/kibana:7.9.0 + container_name: kib01 + ports: + - 9201:5601 + environment: + ELASTICSEARCH_URL: http://es01:9200 + ELASTICSEARCH_HOSTS: http://es01:9200 + networks: + - elastic + + mysql: + image: "mysql:8.0.20" + container_name: mysql + restart: always + ports: + - "9206:3306" + environment: + MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" + MYSQL_DATABASE: "${MYSQL_DATABASE}" + MYSQL_USER: "${MYSQL_USER}" + MYSQL_PASSWORD: "${MYSQL_PASSWORD}" + +volumes: + data01: + driver: local + data02: + driver: local + data03: + driver: local + +networks: + elastic: + driver: bridge From 9f349346b9d951e988cfa39ce2a83640d4c46f35 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 14:08:01 -0700 Subject: [PATCH 06/11] Moved database structure notes. --- .../Database Structure Notes.md | 27 +++++++++++++++++++ .../Database Strucure Notes.md | 25 ----------------- 2 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 test-api-environment/elasticsearch-mysql/Database Structure Notes.md delete mode 100644 test-api-environment/elasticsearch-mysql/Database Strucure Notes.md diff --git a/test-api-environment/elasticsearch-mysql/Database Structure Notes.md b/test-api-environment/elasticsearch-mysql/Database Structure Notes.md new file mode 100644 index 0000000..421fffc --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/Database Structure Notes.md @@ -0,0 +1,27 @@ +# Database Structure Notes + +- title - string + +- slug - string + +- defined - boolean + +- speech? - id association to part of speech lookup table (many-to-many) needs intermediary join table + +- skip_in_table_of_contents - boolean + +- sub_terms? - id association to sub term table (many-to-many) needs intermediary join table + - text - string + - full_title - string +- reading? - id association to reading table (many-to-many) needs intermediary join table + - text - string + - href - string +- flag? - id association to flag table (many-to-many) needs intermediary join table + - level - id association to level lookup table + - alt-for - string - not needed + - text - string + - type - id association to flag_type lookup table +- alt_words? (many-to-many) needs intermediary join table + - type(change to speech?)? - id association to part of speech lookup table + - text - string +- body? - large text diff --git a/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md b/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md deleted file mode 100644 index 06718d9..0000000 --- a/test-api-environment/elasticsearch-mysql/Database Strucure Notes.md +++ /dev/null @@ -1,25 +0,0 @@ -- title - string - -- slug - string - -- defined - boolean - -- speech? - id association to part of speech lookup table (one-to-many) needs intermediary join table - -- skip_in_table_of_contents - boolean - -- sub_terms? - id association to sub term table (one-to-many) needs intermediary join table - - text - string - - full_title - string -- reading? - id association to reading table (one-to-many) needs intermediary join table - - text - string - - href - string -- flag? - id association to flag table (one-to-many) needs intermediary join table - - level - id association to level lookup table - - alt-for - string - not needed - - text - string - - type - id association to flag_type lookup table -- alt_words? (one-to-many) needs intermediary join table - - type(change to speech?)? - id assocaition to part of speech lookup table - - text - string -- body? - large text \ No newline at end of file From 65e3e0fc4abc8da5287ff6f80f60cd239c5ad838 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 14:09:29 -0700 Subject: [PATCH 07/11] Created sync-database deployment script. Updated some name to be more understandable. Turned models index into a class. Applied linting. --- .../elasticsearch-mysql/docker-compose.yaml | 99 ------------------- .../elasticsearch-mysql/package.json | 4 +- .../elasticsearch-mysql/src/database/index.js | 24 +++++ .../src/database/models/AltWord.js | 10 +- .../src/database/models/Flag.js | 10 +- .../src/database/models/FlagType.js | 10 +- .../src/database/models/Level.js | 10 +- .../src/database/models/Reading.js | 12 +-- .../src/database/models/Speech.js | 12 +-- .../src/database/models/SubTerm.js | 12 +-- .../src/database/models/Word.js | 16 +-- .../src/database/models/index.js | 69 ++++++++----- .../src/database/sequelize.js | 20 ---- .../src/deployment/sync-database.js | 23 +++++ .../elasticsearch-mysql/src/index.js | 23 +---- 15 files changed, 145 insertions(+), 209 deletions(-) delete mode 100644 test-api-environment/elasticsearch-mysql/docker-compose.yaml create mode 100644 test-api-environment/elasticsearch-mysql/src/database/index.js delete mode 100644 test-api-environment/elasticsearch-mysql/src/database/sequelize.js create mode 100644 test-api-environment/elasticsearch-mysql/src/deployment/sync-database.js diff --git a/test-api-environment/elasticsearch-mysql/docker-compose.yaml b/test-api-environment/elasticsearch-mysql/docker-compose.yaml deleted file mode 100644 index bafeb8f..0000000 --- a/test-api-environment/elasticsearch-mysql/docker-compose.yaml +++ /dev/null @@ -1,99 +0,0 @@ -version: "2.2" -services: - es01: - image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 - container_name: es01 - environment: - - node.name=es01 - - cluster.name=es-docker-cluster - - discovery.seed_hosts=es02,es03 - - cluster.initial_master_nodes=es01,es02,es03 - - bootstrap.memory_lock=true - - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - ulimits: - memlock: - soft: -1 - hard: -1 - volumes: - - data01:/usr/share/elasticsearch/data - ports: - - 9200:9200 - networks: - - elastic - - # es02: - # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 - # container_name: es02 - # environment: - # - node.name=es02 - # - cluster.name=es-docker-cluster - # - discovery.seed_hosts=es01,es03 - # - cluster.initial_master_nodes=es01,es02,es03 - # - bootstrap.memory_lock=true - # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - # ulimits: - # memlock: - # soft: -1 - # hard: -1 - # volumes: - # - data02:/usr/share/elasticsearch/data - # ports: - # - 9201:9201 - # networks: - # - elastic - - # es03: - # image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0 - # container_name: es03 - # environment: - # - node.name=es03 - # - cluster.name=es-docker-cluster - # - discovery.seed_hosts=es01,es02 - # - cluster.initial_master_nodes=es01,es02,es03 - # - bootstrap.memory_lock=true - # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - # ulimits: - # memlock: - # soft: -1 - # hard: -1 - # volumes: - # - data03:/usr/share/elasticsearch/data - # ports: - # - 9202:9202 - # networks: - # - elastic - - kib01: - image: docker.elastic.co/kibana/kibana:7.9.0 - container_name: kib01 - ports: - - 9201:5601 - environment: - ELASTICSEARCH_URL: http://es01:9200 - ELASTICSEARCH_HOSTS: http://es01:9200 - networks: - - elastic - - mysql: - image: "mysql:8.0.20" - container_name: mysql - restart: always - ports: - - "9206:3306" - environment: - MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" - MYSQL_DATABASE: "${MYSQL_DATABASE}" - MYSQL_USER: "${MYSQL_USER}" - MYSQL_PASSWORD: "${MYSQL_PASSWORD}" - -volumes: - data01: - driver: local - data02: - driver: local - data03: - driver: local - -networks: - elastic: - driver: bridge diff --git a/test-api-environment/elasticsearch-mysql/package.json b/test-api-environment/elasticsearch-mysql/package.json index 0aa67e9..772068d 100644 --- a/test-api-environment/elasticsearch-mysql/package.json +++ b/test-api-environment/elasticsearch-mysql/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "node ./src" + "dev": "node ./src", + "start-docker": "docker-compose up -d", + "sync-database": "node ./src/deployment/sync-database.js" }, "author": "Self Defined - Simeon Smith", "license": "ISC", diff --git a/test-api-environment/elasticsearch-mysql/src/database/index.js b/test-api-environment/elasticsearch-mysql/src/database/index.js new file mode 100644 index 0000000..07e7e8d --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/index.js @@ -0,0 +1,24 @@ +const { Sequelize } = require('sequelize'); +const dotenv = require('dotenv'); + +const Models = require('./models'); + +dotenv.config(); + +const { + MYSQL_DATABASE, + MYSQL_USER, + MYSQL_PASSWORD, + MYSQL_HOST, + MYSQL_PORT +} = process.env; + +const database = new Sequelize(MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, { + host: MYSQL_HOST, + port: MYSQL_PORT, + dialect: 'mysql' +}); + +const models = new Models(database); + +module.exports = database; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js index 7169d2c..183030f 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js @@ -1,11 +1,11 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const AltWord = (sequelize) => - sequelize.define("AltWord", { +const AltWord = (database) => + database.define('AltWord', { title: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = AltWord; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js index 6e6243a..e087e51 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js @@ -1,11 +1,11 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const Flag = (sequelize) => - sequelize.define("Flag", { +const Flag = (database) => + database.define('Flag', { title: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = Flag; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js index 0096101..2818763 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js @@ -1,11 +1,11 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const FlagType = (sequelize) => - sequelize.define("FlagType", { +const FlagType = (database) => + database.define('FlagType', { title: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = FlagType; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Level.js b/test-api-environment/elasticsearch-mysql/src/database/models/Level.js index 82ec3f3..b354f31 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Level.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Level.js @@ -1,11 +1,11 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const Level = (sequelize) => - sequelize.define("Level", { +const Level = (database) => + database.define('Level', { title: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = Level; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js index 5df1de4..dc13296 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js @@ -1,15 +1,15 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const Reading = (sequelize) => - sequelize.define("Reading", { +const Reading = (database) => + database.define('Reading', { title: { type: DataTypes.STRING, - allowNull: false, + allowNull: false }, href: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = Reading; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js b/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js index d5c0fcd..c242295 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js @@ -1,14 +1,14 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const Speech = (sequelize) => - sequelize.define("Speech", { +const Speech = (database) => + database.define('Speech', { title: { type: DataTypes.STRING, - allowNull: false, + allowNull: false }, abbrev: { - type: DataTypes.STRING, - }, + type: DataTypes.STRING + } }); module.exports = Speech; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js index 7139683..7eeaaf8 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js @@ -1,15 +1,15 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const SubTerm = (sequelize) => - sequelize.define("SubTerm", { +const SubTerm = (database) => + database.define('SubTerm', { affix: { type: DataTypes.STRING, - allowNull: false, + allowNull: false }, text: { type: DataTypes.STRING, - allowNull: false, - }, + allowNull: false + } }); module.exports = SubTerm; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js index 5ce0c34..228da85 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js @@ -1,19 +1,23 @@ -const { DataTypes } = require("sequelize"); +const { DataTypes } = require('sequelize'); -const Word = (sequelize) => - sequelize.define("Word", { +const Word = (database) => + database.define('Word', { title: { type: DataTypes.STRING, - allowNull: false, + allowNull: false }, slug: { type: DataTypes.STRING, - allowNull: false, + allowNull: false }, body: { type: DataTypes.TEXT, - allowNull: true, + allowNull: true }, + excerpt: { + type: DataTypes.TEXT, + allowNull: true + } }); module.exports = Word; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js index 42c0067..dc6dafa 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/index.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -1,30 +1,53 @@ const models = [ - require("./AltWord"), - require("./Flag"), - require("./FlagType"), - require("./Level"), - require("./Reading"), - require("./Speech"), - require("./SubTerm"), - require("./Word"), + require('./AltWord'), + require('./Flag'), + require('./FlagType'), + require('./Level'), + require('./Reading'), + require('./Speech'), + require('./SubTerm'), + require('./Word') ]; -module.exports.init = (sequelize) => { - for (let m = 0; m < models.length; m++) { - models[m](sequelize); +class Models { + constructor(database) { + this.init = this.init.bind(this); + this.initModels = this.initModels.bind(this); + this.initRelationships = this.initRelationships.bind(this); + + this.init(database); + } + init(database) { + this.initModels(database); + this.initRelationships(database); } -}; + initModels(database) { + for (let m = 0; m < models.length; m++) { + models[m](database); + } + } + initRelationships(database) { + const { + AltWord, + Flag, + FlagType, + Level, + Reading, + Speech, + SubTerm, + Word + } = database.models; + AltWord.hasOne(Speech); -module.exports.initRelationships = (sequelize) => { - const { AltWord, Flag, FlagType, Level, Reading, Speech, SubTerm, Word } = sequelize.models; - AltWord.hasOne(Speech); + Flag.hasOne(Level); + Flag.hasOne(FlagType); - Flag.hasOne(Level); - Flag.hasOne(FlagType); + Speech.belongsToMany(Word, { through: 'Word_Speech' }); + SubTerm.belongsToMany(Word, { through: 'Word_SubTerm' }); + Reading.belongsToMany(Word, { through: 'Word_Reading' }); + Flag.belongsToMany(Word, { through: 'Word_Flag' }); + AltWord.belongsToMany(Word, { through: 'Word_AltWord' }); + } +} - Speech.belongsToMany(Word, { through: "Word_Speech" }); - SubTerm.belongsToMany(Word, { through: "Word_SubTerm" }); - Reading.belongsToMany(Word, { through: "Word_Reading" }); - Flag.belongsToMany(Word, { through: "Word_Flag" }); - AltWord.belongsToMany(Word, { through: "Word_AltWord" }); -}; +module.exports = Models; diff --git a/test-api-environment/elasticsearch-mysql/src/database/sequelize.js b/test-api-environment/elasticsearch-mysql/src/database/sequelize.js deleted file mode 100644 index 5333a83..0000000 --- a/test-api-environment/elasticsearch-mysql/src/database/sequelize.js +++ /dev/null @@ -1,20 +0,0 @@ -const { Sequelize } = require("sequelize"); -const dotenv = require("dotenv"); - -const models = require("./models"); - -dotenv.config(); - -const { MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT } = process.env; - -const sequelize = new Sequelize(MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, { - host: MYSQL_HOST, - port: MYSQL_PORT, - dialect: "mysql", -}); - -models.init(sequelize); - -models.initRelationships(sequelize); - -module.exports = sequelize; diff --git a/test-api-environment/elasticsearch-mysql/src/deployment/sync-database.js b/test-api-environment/elasticsearch-mysql/src/deployment/sync-database.js new file mode 100644 index 0000000..01dcfbc --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/deployment/sync-database.js @@ -0,0 +1,23 @@ +const database = require('../database'); + +async function syncDatabase() { + try { + const authResponse = await database.authenticate(); + console.log('Database authentication successful.'); + console.log(authResponse); + try { + const syncResponse = await database.sync({ force: true }); + console.log('Database sync successful.'); + console.log(syncResponse); + database.close(); + } catch (syncError) { + console.log('Unable to sync.'); + throw new Error(syncError); + } + } catch (authenticateError) { + console.log('Unable to authenticate.'); + throw new Error(authenticateError); + } +} + +syncDatabase(); diff --git a/test-api-environment/elasticsearch-mysql/src/index.js b/test-api-environment/elasticsearch-mysql/src/index.js index 41fafc8..9a966d0 100644 --- a/test-api-environment/elasticsearch-mysql/src/index.js +++ b/test-api-environment/elasticsearch-mysql/src/index.js @@ -1,22 +1 @@ -const sequelize = require("./database/sequelize"); - -async function syncDatabaseChanges() { - try { - const syncResponse = await sequelize.authenticate(); - console.log("Database authentication successful."); - - try { - const syncResponse = await sequelize.sync({ force: true }); - console.log("Database sync successful."); - sequelize.close(); - } catch (syncError) { - console.log("Unable to sync."); - throw new Error(syncError); - } - } catch (authenticateError) { - console.log("Unable to authenticate."); - throw new Error(authenticateError); - } -} - -syncDatabaseChanges(); +const database = require('./database'); From a8a585a7d2a280b6d77efea3b3bfea0b7d87c2e4 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 16:15:19 -0700 Subject: [PATCH 08/11] Completed data structure for MySQL example. --- .../MySQL Data Structure.md | 45 +++++++++++++++++++ .../elasticsearch-mysql/package-lock.json | 27 +++++++++++ .../elasticsearch-mysql/package.json | 3 +- .../src/database/models/AltWord.js | 23 +++++++++- .../src/database/models/AltWordGroup.js | 25 +++++++++++ .../src/database/models/Flag.js | 19 +++++++- .../src/database/models/FlagLevel.js | 26 +++++++++++ .../src/database/models/FlagType.js | 18 +++++++- .../src/database/models/Level.js | 11 ----- .../src/database/models/Reading.js | 19 +++++++- .../src/database/models/Speech.js | 14 ------ .../src/database/models/SpeechPart.js | 29 ++++++++++++ .../src/database/models/SubTerm.js | 21 +++++++-- .../src/database/models/Word.js | 21 +++++++-- .../src/database/models/index.js | 26 ++++++----- 15 files changed, 275 insertions(+), 52 deletions(-) create mode 100644 test-api-environment/elasticsearch-mysql/MySQL Data Structure.md create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js delete mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Level.js delete mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Speech.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js diff --git a/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md b/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md new file mode 100644 index 0000000..1287a8d --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md @@ -0,0 +1,45 @@ +# MySQL Data Structure +![MySQL ER Diagram for ](https://user-images.githubusercontent.com/11299714/91647707-aa8e8800-ea12-11ea-8a77-a17f0b171dbc.png) +[Self Defined API MySQL Workbench ER Diagram Zip File](https://github.com/selfdefined/web-app/files/5146104/Self.Defined.API.mwb.zip) + +## Diagram Key + +| Key | Description | +| :----------------------------------------------------------: | ------------------------------------------------------------ | +| ![1-to-Many Identifying Relationship](https://user-images.githubusercontent.com/11299714/91647201-d4dd4700-ea0c-11ea-9cc2-5e85a2e2c6a3.png) | This indicates that the table to which it is attached has entries that are related to many entries in another table. It also indicates that it is an identifying relationship. [Defintion](https://www.datanamic.com/support/relationshiptypes.html) | +| ![1-to-Many Non-Identifying Relationship](https://user-images.githubusercontent.com/11299714/91647213-f5a59c80-ea0c-11ea-953f-7d8062baf725.png) | This indicates that the table to which it is attached has entries that are related to many entries in another table. It also indicates that it is an non-identifying relationship. [Defintion](https://www.datanamic.com/support/relationshiptypes.html) | + + + +## Database Structure + +The databse structure displayed above can be broken down into 4 grouping which are displayed in columns from left to right. + +They are: + +1. Words table to which all other data is related. Each row here is equivalent to a markdown file in the definitions folder. +2. The second column of tables provides a many-to-many relationship between the Words and the third column of tables. An example of this relationship would be that the Words table could have many AltWords and an AltWords could have many Words attached to it. +3. The third column of tables is list of additional data that can be shared by words. +4. The fourth column of tables is lists that provide additional data that can be shared by the items in their table in the third column + +### Access Methodology + +This data structure would allow us to access words in the following manner. + +1. Words can be accessed directly either through their unique ID or unique Slug. +2. Words can be search by their title, defined status, body or excerpt. +3. The second column of tables provides relationship access from either the Words or from the third column of tables. +4. The third column of tables can be directly accessed by their unique ID or unique slug. The through the second column of tables words can be found that related to those items. +5. The third column of tables could also be searched by any of their VARCHAR text fields and related words found that way. +6. The fourth column of tables can be directly accessed by their unique ID or unique slug. Then you can access their related items in the third column in tables that in turn can access their related words through the second column of tables. +7. The fourth column of tables can also be searched by their VARCHAR text fields. This provides the same access methods as line 6. + +The API would handle precisely how we will allow end users to access the data but this is all the possible ways the data could potentially be accessed. + +### Reasons for Splitting Up the Word Data into Different Tables + +Putting things like AltWords, Flags, Readings, Speech Parts, and Sub Terms into their own tables allows us to maintain a master list of these items. This would allow content contributors to auto complete search the items and assign them to a word. This also means that there would only ever be 1 copy of each unique item in these tables. This way we would easily be able to modify an existing one and it would be updated for all words it was associated to. + +The same applies for the associations for Alt Word Groups, Flag Levels and Flag Types. + +These master lists are able to be added to in whatever method we determine. Also, each of these tables relationships to a word is optional. We can make them required on the front end if necessary. \ No newline at end of file diff --git a/test-api-environment/elasticsearch-mysql/package-lock.json b/test-api-environment/elasticsearch-mysql/package-lock.json index a9ef3ef..b16172c 100644 --- a/test-api-environment/elasticsearch-mysql/package-lock.json +++ b/test-api-environment/elasticsearch-mysql/package-lock.json @@ -87,6 +87,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -219,6 +224,23 @@ "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" }, + "sequelize-slugify": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/sequelize-slugify/-/sequelize-slugify-0.9.1.tgz", + "integrity": "sha512-G9gThMIekenankGoixbgXtIaz1IREQUDIC+etd42orc+mMqqcAfRQziQiWLo/CxvTp4Ik04Ks/OHLoh2siKtTg==", + "requires": { + "sluglife": "^0.9.8" + } + }, + "sluglife": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/sluglife/-/sluglife-0.9.8.tgz", + "integrity": "sha512-tJ5KZ9E8ApCFDIQqKbqXVhi4FdTjWCKg1jeEB8M7UxRaT3Sk9Al3GwFfltVV6JJhTZaHrONthNmWtZMExJNRqQ==", + "requires": { + "lodash.defaults": "^4.2.0", + "unicode": ">=11.0.1" + } + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", @@ -229,6 +251,11 @@ "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, + "unicode": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/unicode/-/unicode-12.1.0.tgz", + "integrity": "sha512-Ty6+Ew21DiYTWLYtd05RF/X4c1ekOvOgANyHbBj0h3MaXpfaGr2Rdmc0hMFuGQLyPLb9cU4ArNxl0bTF5HSzXw==" + }, "uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", diff --git a/test-api-environment/elasticsearch-mysql/package.json b/test-api-environment/elasticsearch-mysql/package.json index 772068d..5bccb07 100644 --- a/test-api-environment/elasticsearch-mysql/package.json +++ b/test-api-environment/elasticsearch-mysql/package.json @@ -14,6 +14,7 @@ "dependencies": { "dotenv": "^8.2.0", "mysql2": "^2.1.0", - "sequelize": "^6.3.4" + "sequelize": "^6.3.4", + "sequelize-slugify": "^0.9.1" } } diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js index 183030f..ae4678c 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js @@ -1,11 +1,30 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const AltWord = (database) => - database.define('AltWord', { +const AltWord = (database) => { + const model = database.define('AltWord', { title: { type: DataTypes.STRING, allowNull: false + }, + link: { + type: DataTypes.STRING, + allowNull: true + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + module.exports = AltWord; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js new file mode 100644 index 0000000..c263c91 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js @@ -0,0 +1,25 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const AltWordGroup = (database) => { + const model = database.define('AltWordGroup', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = AltWordGroup; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js index e087e51..34caf7e 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js @@ -1,11 +1,26 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const Flag = (database) => - database.define('Flag', { +const Flag = (database) => { + const model = database.define('Flag', { title: { type: DataTypes.STRING, allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + module.exports = Flag; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js new file mode 100644 index 0000000..e008a91 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const FlagLevel = (database) => { + const model = database.define('FlagLevel', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = FlagLevel; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js index 2818763..71fa249 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagType.js @@ -1,11 +1,25 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const FlagType = (database) => - database.define('FlagType', { +const FlagType = (database) => { + const model = database.define('FlagType', { title: { type: DataTypes.STRING, allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; module.exports = FlagType; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Level.js b/test-api-environment/elasticsearch-mysql/src/database/models/Level.js deleted file mode 100644 index b354f31..0000000 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Level.js +++ /dev/null @@ -1,11 +0,0 @@ -const { DataTypes } = require('sequelize'); - -const Level = (database) => - database.define('Level', { - title: { - type: DataTypes.STRING, - allowNull: false - } - }); - -module.exports = Level; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js index dc13296..9c61b70 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js @@ -1,7 +1,8 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const Reading = (database) => - database.define('Reading', { +const Reading = (database) => { + const model = database.define('Reading', { title: { type: DataTypes.STRING, allowNull: false @@ -9,7 +10,21 @@ const Reading = (database) => href: { type: DataTypes.STRING, allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + module.exports = Reading; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js b/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js deleted file mode 100644 index c242295..0000000 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Speech.js +++ /dev/null @@ -1,14 +0,0 @@ -const { DataTypes } = require('sequelize'); - -const Speech = (database) => - database.define('Speech', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - abbrev: { - type: DataTypes.STRING - } - }); - -module.exports = Speech; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js new file mode 100644 index 0000000..f5d460c --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js @@ -0,0 +1,29 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const SpeechPart = (database) => { + const model = database.define('SpeechPart', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + abbrev: { + type: DataTypes.STRING + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = SpeechPart; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js index 7eeaaf8..5ed916b 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js @@ -1,15 +1,30 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const SubTerm = (database) => - database.define('SubTerm', { +const SubTerm = (database) => { + const model = database.define('SubTerm', { affix: { type: DataTypes.STRING, allowNull: false }, - text: { + title: { type: DataTypes.STRING, allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + module.exports = SubTerm; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js index 228da85..a28f64e 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js @@ -1,14 +1,21 @@ const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); -const Word = (database) => - database.define('Word', { +const Word = (database) => { + const model = database.define('Word', { title: { type: DataTypes.STRING, allowNull: false }, slug: { type: DataTypes.STRING, - allowNull: false + allowNull: false, + unique: true + }, + defined: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false }, body: { type: DataTypes.TEXT, @@ -19,5 +26,13 @@ const Word = (database) => allowNull: true } }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; module.exports = Word; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js index dc6dafa..91235de 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/index.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -1,10 +1,11 @@ const models = [ require('./AltWord'), + require('./AltWordGroup'), require('./Flag'), require('./FlagType'), - require('./Level'), + require('./FlagLevel'), require('./Reading'), - require('./Speech'), + require('./SpeechPart'), require('./SubTerm'), require('./Word') ]; @@ -29,24 +30,25 @@ class Models { initRelationships(database) { const { AltWord, + AltWordGroup, Flag, FlagType, - Level, + FlagLevel, Reading, - Speech, + SpeechPart, SubTerm, Word } = database.models; - AltWord.hasOne(Speech); - Flag.hasOne(Level); - Flag.hasOne(FlagType); + AltWord.belongsTo(AltWordGroup); + Flag.belongsTo(FlagLevel); + Flag.belongsTo(FlagType); - Speech.belongsToMany(Word, { through: 'Word_Speech' }); - SubTerm.belongsToMany(Word, { through: 'Word_SubTerm' }); - Reading.belongsToMany(Word, { through: 'Word_Reading' }); - Flag.belongsToMany(Word, { through: 'Word_Flag' }); - AltWord.belongsToMany(Word, { through: 'Word_AltWord' }); + AltWord.belongsToMany(Word, { through: 'Words_have_AltWords' }); + Flag.belongsToMany(Word, { through: 'Words_have_Flags' }); + Reading.belongsToMany(Word, { through: 'Words_have_Readings' }); + SpeechPart.belongsToMany(Word, { through: 'Words_have_SpeechParts' }); + SubTerm.belongsToMany(Word, { through: 'Words_have_SubTerms' }); } } From 30fc277a30e5a8be37ab51715a51c0dbb6486da7 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Sat, 29 Aug 2020 16:30:02 -0700 Subject: [PATCH 09/11] Updated structure document. --- .../MySQL Data Structure.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md b/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md index 1287a8d..0b88da2 100644 --- a/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md +++ b/test-api-environment/elasticsearch-mysql/MySQL Data Structure.md @@ -1,26 +1,25 @@ # MySQL Data Structure + ![MySQL ER Diagram for ](https://user-images.githubusercontent.com/11299714/91647707-aa8e8800-ea12-11ea-8a77-a17f0b171dbc.png) [Self Defined API MySQL Workbench ER Diagram Zip File](https://github.com/selfdefined/web-app/files/5146104/Self.Defined.API.mwb.zip) ## Diagram Key -| Key | Description | -| :----------------------------------------------------------: | ------------------------------------------------------------ | -| ![1-to-Many Identifying Relationship](https://user-images.githubusercontent.com/11299714/91647201-d4dd4700-ea0c-11ea-9cc2-5e85a2e2c6a3.png) | This indicates that the table to which it is attached has entries that are related to many entries in another table. It also indicates that it is an identifying relationship. [Defintion](https://www.datanamic.com/support/relationshiptypes.html) | +| Key | Description | +| :---------------------------------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ![1-to-Many Identifying Relationship](https://user-images.githubusercontent.com/11299714/91647201-d4dd4700-ea0c-11ea-9cc2-5e85a2e2c6a3.png) | This indicates that the table to which it is attached has entries that are related to many entries in another table. It also indicates that it is an identifying relationship. [Defintion](https://www.datanamic.com/support/relationshiptypes.html) | | ![1-to-Many Non-Identifying Relationship](https://user-images.githubusercontent.com/11299714/91647213-f5a59c80-ea0c-11ea-953f-7d8062baf725.png) | This indicates that the table to which it is attached has entries that are related to many entries in another table. It also indicates that it is an non-identifying relationship. [Defintion](https://www.datanamic.com/support/relationshiptypes.html) | - - ## Database Structure -The databse structure displayed above can be broken down into 4 grouping which are displayed in columns from left to right. +The database structure displayed above can be broken down into 4 grouping which are displayed in columns from left to right. They are: -1. Words table to which all other data is related. Each row here is equivalent to a markdown file in the definitions folder. +1. Words table to which all other data is related. Each row here is equivalent to a markdown file in the [definitions folder](https://github.com/selfdefined/web-app/tree/prod/11ty/definitions). 2. The second column of tables provides a many-to-many relationship between the Words and the third column of tables. An example of this relationship would be that the Words table could have many AltWords and an AltWords could have many Words attached to it. 3. The third column of tables is list of additional data that can be shared by words. -4. The fourth column of tables is lists that provide additional data that can be shared by the items in their table in the third column +4. The fourth column of tables are lists that provide additional data that can be shared by the items in their table in the third column ### Access Methodology @@ -29,7 +28,7 @@ This data structure would allow us to access words in the following manner. 1. Words can be accessed directly either through their unique ID or unique Slug. 2. Words can be search by their title, defined status, body or excerpt. 3. The second column of tables provides relationship access from either the Words or from the third column of tables. -4. The third column of tables can be directly accessed by their unique ID or unique slug. The through the second column of tables words can be found that related to those items. +4. The third column of tables can be directly accessed by their unique ID or unique slug. Then through the second column of tables words can be found that related to those items. 5. The third column of tables could also be searched by any of their VARCHAR text fields and related words found that way. 6. The fourth column of tables can be directly accessed by their unique ID or unique slug. Then you can access their related items in the third column in tables that in turn can access their related words through the second column of tables. 7. The fourth column of tables can also be searched by their VARCHAR text fields. This provides the same access methods as line 6. @@ -42,4 +41,4 @@ Putting things like AltWords, Flags, Readings, Speech Parts, and Sub Terms into The same applies for the associations for Alt Word Groups, Flag Levels and Flag Types. -These master lists are able to be added to in whatever method we determine. Also, each of these tables relationships to a word is optional. We can make them required on the front end if necessary. \ No newline at end of file +These master lists can be added to in whatever method we determine necessary. Also, each of these tables relationships to a word is optional. We can make them required on the front end if desired. From b058cf718578d3eca1b4400933a73ecc802c9f4b Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Thu, 10 Sep 2020 20:45:24 -0700 Subject: [PATCH 10/11] Setup language data localization and multi-entry status based word entries. --- .../src/database/models/Language.js | 30 +++++++++++++ .../src/database/models/Status.js | 26 +++++++++++ .../src/database/models/Word.js | 35 +-------------- .../src/database/models/WordEntry.js | 43 +++++++++++++++++++ .../src/database/models/index.js | 26 ++++++++--- 5 files changed, 119 insertions(+), 41 deletions(-) create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Language.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Status.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/WordEntry.js diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Language.js b/test-api-environment/elasticsearch-mysql/src/database/models/Language.js new file mode 100644 index 0000000..fe3c55b --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Language.js @@ -0,0 +1,30 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const Language = (database) => { + const model = database.define('Language', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + iso: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = Language; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Status.js b/test-api-environment/elasticsearch-mysql/src/database/models/Status.js new file mode 100644 index 0000000..876021a --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Status.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const Status = (database) => { + const model = database.define('Status', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = Status; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js index a28f64e..8165b64 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Word.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Word.js @@ -1,38 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const Word = (database) => { - const model = database.define('Word', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - }, - defined: { - type: DataTypes.BOOLEAN, - allowNull: false, - defaultValue: false - }, - body: { - type: DataTypes.TEXT, - allowNull: true - }, - excerpt: { - type: DataTypes.TEXT, - allowNull: true - } - }); - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('Word', {}); }; module.exports = Word; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/WordEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/WordEntry.js new file mode 100644 index 0000000..1959047 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/WordEntry.js @@ -0,0 +1,43 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const WordEntry = (database) => { + const model = database.define('WordEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + defined: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false + }, + body: { + type: DataTypes.TEXT, + allowNull: true + }, + excerpt: { + type: DataTypes.TEXT, + allowNull: true + }, + showInTableOfContents: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: true + } + }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = WordEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js index 91235de..012fb41 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/index.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -4,10 +4,13 @@ const models = [ require('./Flag'), require('./FlagType'), require('./FlagLevel'), + require('./Language'), require('./Reading'), require('./SpeechPart'), + require('./Status'), require('./SubTerm'), - require('./Word') + require('./Word'), + require('./WordEntry') ]; class Models { @@ -34,21 +37,30 @@ class Models { Flag, FlagType, FlagLevel, + Language, Reading, SpeechPart, + Status, SubTerm, - Word + Word, + WordEntry } = database.models; AltWord.belongsTo(AltWordGroup); Flag.belongsTo(FlagLevel); Flag.belongsTo(FlagType); - AltWord.belongsToMany(Word, { through: 'Words_have_AltWords' }); - Flag.belongsToMany(Word, { through: 'Words_have_Flags' }); - Reading.belongsToMany(Word, { through: 'Words_have_Readings' }); - SpeechPart.belongsToMany(Word, { through: 'Words_have_SpeechParts' }); - SubTerm.belongsToMany(Word, { through: 'Words_have_SubTerms' }); + WordEntry.hasOne(Language); + WordEntry.hasOne(Status); + + AltWord.belongsToMany(WordEntry, { through: 'WordEntries_have_AltWords' }); + Flag.belongsToMany(WordEntry, { through: 'WordEntries_have_Flags' }); + Reading.belongsToMany(WordEntry, { through: 'WordEntries_have_Readings' }); + SpeechPart.belongsToMany(WordEntry, { + through: 'WordEntries_have_SpeechParts' + }); + SubTerm.belongsToMany(WordEntry, { through: 'WordEntries_have_SubTerms' }); + WordEntry.belongsToMany(Word, { through: 'Words_have_WordEntries' }); } } From 7544f5cfd18334be6311b2d42ac96172ac6347e6 Mon Sep 17 00:00:00 2001 From: Simeon Smith Date: Thu, 10 Sep 2020 23:16:10 -0700 Subject: [PATCH 11/11] Completed data structure layout and started markdown data import. --- .../elasticsearch-mysql/.gitignore | 1 + .../elasticsearch-mysql/config/config.js | 38 + .../markdownParse/index.js | 35 + .../elasticsearch-mysql/models/index.js | 37 + .../elasticsearch-mysql/package-lock.json | 701 ++++ .../elasticsearch-mysql/package.json | 4 + .../seeders/20200911054436-markdown-import.js | 89 + .../src/database/models/AltWord.js | 27 +- .../src/database/models/AltWordEntry.js | 30 + .../src/database/models/AltWordGroup.js | 22 +- .../src/database/models/AltWordGroupEntry.js | 25 + .../src/database/models/Country.js | 12 + .../src/database/models/CountryName.js | 12 + .../src/database/models/Flag.js | 23 +- .../src/database/models/FlagEntry.js | 26 + .../src/database/models/FlagLevel.js | 23 +- .../src/database/models/FlagLevelEntry.js | 26 + .../src/database/models/FlagTypeEntry.js | 25 + .../src/database/models/Language.js | 20 +- .../src/database/models/LanguageName.js | 12 + .../src/database/models/Localization.js | 12 + .../src/database/models/Reading.js | 27 +- .../src/database/models/ReadingEntry.js | 30 + .../src/database/models/SpeechPart.js | 26 +- .../src/database/models/SpeechPartEntry.js | 29 + .../src/database/models/Status.js | 23 +- .../src/database/models/StatusEntry.js | 26 + .../src/database/models/SubTerm.js | 27 +- .../src/database/models/SubTermEntry.js | 30 + .../src/database/models/index.js | 76 +- .../database/seed-data/definitions/en_US.json | 3016 +++++++++++++++++ .../database/seed-data/definitions/fr_FR.json | 81 + .../database/seed-data/definitions/nl_NL.json | 10 + 33 files changed, 4386 insertions(+), 215 deletions(-) create mode 100644 test-api-environment/elasticsearch-mysql/.gitignore create mode 100644 test-api-environment/elasticsearch-mysql/config/config.js create mode 100644 test-api-environment/elasticsearch-mysql/markdownParse/index.js create mode 100644 test-api-environment/elasticsearch-mysql/models/index.js create mode 100644 test-api-environment/elasticsearch-mysql/seeders/20200911054436-markdown-import.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/AltWordEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroupEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Country.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/CountryName.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/FlagEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/FlagLevelEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/FlagTypeEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/LanguageName.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/Localization.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/ReadingEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/SpeechPartEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/StatusEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/models/SubTermEntry.js create mode 100644 test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/en_US.json create mode 100644 test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/fr_FR.json create mode 100644 test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/nl_NL.json diff --git a/test-api-environment/elasticsearch-mysql/.gitignore b/test-api-environment/elasticsearch-mysql/.gitignore new file mode 100644 index 0000000..d2611ea --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/.gitignore @@ -0,0 +1 @@ +markdownParse/definitions \ No newline at end of file diff --git a/test-api-environment/elasticsearch-mysql/config/config.js b/test-api-environment/elasticsearch-mysql/config/config.js new file mode 100644 index 0000000..908e0e9 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/config/config.js @@ -0,0 +1,38 @@ +const dotenv = require('dotenv'); + +dotenv.config(); + +const { + MYSQL_DATABASE, + MYSQL_USER, + MYSQL_PASSWORD, + MYSQL_HOST, + MYSQL_PORT +} = process.env; + +module.exports = { + development: { + username: MYSQL_USER, + password: MYSQL_PASSWORD, + database: MYSQL_DATABASE, + host: MYSQL_HOST, + port: MYSQL_PORT, + dialect: 'mysql' + }, + test: { + username: MYSQL_USER, + password: MYSQL_PASSWORD, + database: MYSQL_DATABASE, + host: MYSQL_HOST, + port: MYSQL_PORT, + dialect: 'mysql' + }, + production: { + username: MYSQL_USER, + password: MYSQL_PASSWORD, + database: MYSQL_DATABASE, + host: MYSQL_HOST, + port: MYSQL_PORT, + dialect: 'mysql' + } +}; diff --git a/test-api-environment/elasticsearch-mysql/markdownParse/index.js b/test-api-environment/elasticsearch-mysql/markdownParse/index.js new file mode 100644 index 0000000..4715f00 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/markdownParse/index.js @@ -0,0 +1,35 @@ +const fs = require('fs'); +const md2json = require('markdown-to-json'); + +const enFiles = fs + .readdirSync('markdownParse/definitions/en_US') + .map((filename) => `markdownParse/definitions/en_US/${filename}`); + +const enDefinitions = md2json.parse(enFiles, { pretty: true, content: true }); + +fs.writeFileSync( + 'src/database/seed-data/definitions/en_US.json', + enDefinitions +); + +const frFiles = fs + .readdirSync('markdownParse/definitions/fr_FR') + .map((filename) => `markdownParse/definitions/fr_FR/${filename}`); + +const frDefinitions = md2json.parse(frFiles, { pretty: true, content: true }); + +fs.writeFileSync( + 'src/database/seed-data/definitions/fr_FR.json', + frDefinitions +); + +const nlFiles = fs + .readdirSync('markdownParse/definitions/nl_NL') + .map((filename) => `markdownParse/definitions/nl_NL/${filename}`); + +const nlDefinitions = md2json.parse(nlFiles, { pretty: true, content: true }); + +fs.writeFileSync( + 'src/database/seed-data/definitions/nl_NL.json', + nlDefinitions +); diff --git a/test-api-environment/elasticsearch-mysql/models/index.js b/test-api-environment/elasticsearch-mysql/models/index.js new file mode 100644 index 0000000..33f09e7 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/models/index.js @@ -0,0 +1,37 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +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'); + }) + .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/test-api-environment/elasticsearch-mysql/package-lock.json b/test-api-environment/elasticsearch-mysql/package-lock.json index b16172c..d8a404f 100644 --- a/test-api-environment/elasticsearch-mysql/package-lock.json +++ b/test-api-environment/elasticsearch-mysql/package-lock.json @@ -9,6 +9,27 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.1.tgz", "integrity": "sha512-HnYlg/BRF8uC1FyKRFZwRaCPTPYKa+6I8QiUZFLredaGOou481cgFS4wKRFyKvQtX8xudqkSdBczJHIYSQYKrQ==" }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", @@ -19,6 +40,43 @@ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "cardinal": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", @@ -28,6 +86,78 @@ "redeyed": "~2.1.0" } }, + "cli-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", + "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", + "dev": true, + "requires": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.5" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -36,6 +166,12 @@ "ms": "^2.1.1" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", @@ -51,11 +187,156 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, "generate-function": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", @@ -64,6 +345,32 @@ "is-property": "^1.0.2" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "iconv-lite": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", @@ -77,11 +384,87 @@ "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" }, + "js-beautify": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.0.tgz", + "integrity": "sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "mkdirp": "^1.0.4", + "nopt": "^5.0.0" + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -92,6 +475,12 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -105,6 +494,58 @@ "yallist": "^3.0.2" } }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "markdown-to-json": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/markdown-to-json/-/markdown-to-json-0.5.4.tgz", + "integrity": "sha512-CynpVAbVB3+hO2XgvCKpic2X2os+Hdv/McaE3VhDbsHUdNI/EcfqElMpX8TRTmsf0AsNUlOFDtFOiuaywG6kPQ==", + "dev": true, + "requires": { + "commander": "^4.0.1", + "lodash.truncate": "^4.4.2", + "moment": "^2.24.0", + "yaml-front-matter": "^4.0.0" + } + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "moment": { "version": "2.27.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", @@ -163,6 +604,78 @@ } } }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -176,6 +689,27 @@ "esprima": "~4.0.0" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "retry-as-promised": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", @@ -219,6 +753,21 @@ "wkx": "^0.5.0" } }, + "sequelize-cli": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.2.0.tgz", + "integrity": "sha512-6WQ2x91hg30dUn66mXHnzvHATZ4pyI1GHSNbS/TNN/vRR4BLRSLijadeMgC8zqmKDsL0VqzVVopJWfJakuP++Q==", + "dev": true, + "requires": { + "cli-color": "^1.4.0", + "fs-extra": "^7.0.1", + "js-beautify": "^1.8.8", + "lodash": "^4.17.5", + "resolve": "^1.5.0", + "umzug": "^2.3.0", + "yargs": "^13.1.0" + } + }, "sequelize-pool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", @@ -232,6 +781,18 @@ "sluglife": "^0.9.8" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, "sluglife": { "version": "0.9.8", "resolved": "https://registry.npmjs.org/sluglife/-/sluglife-0.9.8.tgz", @@ -241,21 +802,86 @@ "unicode": ">=11.0.1" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "dev": true, + "requires": { + "bluebird": "^3.7.2" + } + }, "unicode": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/unicode/-/unicode-12.1.0.tgz", "integrity": "sha512-Ty6+Ew21DiYTWLYtd05RF/X4c1ekOvOgANyHbBj0h3MaXpfaGr2Rdmc0hMFuGQLyPLb9cU4ArNxl0bTF5HSzXw==" }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "uuid": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", @@ -266,6 +892,12 @@ "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -274,10 +906,79 @@ "@types/node": "*" } }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml-front-matter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/yaml-front-matter/-/yaml-front-matter-4.1.0.tgz", + "integrity": "sha512-E2NKXUe8Amsf3kyLDK48c2gvnfom0Yj3m7455iVVg+G5UbX66V5iqFSpEUkQ+A3iJCKIz+mvAbkN7BQ+N0wiLA==", + "dev": true, + "requires": { + "commander": "^2.14.1", + "js-yaml": "^3.10.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/test-api-environment/elasticsearch-mysql/package.json b/test-api-environment/elasticsearch-mysql/package.json index 5bccb07..c8d84c4 100644 --- a/test-api-environment/elasticsearch-mysql/package.json +++ b/test-api-environment/elasticsearch-mysql/package.json @@ -16,5 +16,9 @@ "mysql2": "^2.1.0", "sequelize": "^6.3.4", "sequelize-slugify": "^0.9.1" + }, + "devDependencies": { + "markdown-to-json": "^0.5.4", + "sequelize-cli": "^6.2.0" } } diff --git a/test-api-environment/elasticsearch-mysql/seeders/20200911054436-markdown-import.js b/test-api-environment/elasticsearch-mysql/seeders/20200911054436-markdown-import.js new file mode 100644 index 0000000..b37b931 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/seeders/20200911054436-markdown-import.js @@ -0,0 +1,89 @@ +'use strict'; + +const database = require('../src/database'); + +module.exports = { + up: async (queryInterface, Sequelize) => { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('Languages', [ + { + iso: 'en', + createdAt: new Date(), + updatedAt: new Date() + }, + { + iso: 'fr', + createdAt: new Date(), + updatedAt: new Date() + }, + { + iso: 'nl', + createdAt: new Date(), + updatedAt: new Date() + } + ]); + const languages = await database.models.Language.findAll(); + + await queryInterface.bulkInsert('Countries', [ + { + iso: 'us', + createdAt: new Date(), + updatedAt: new Date() + }, + { + iso: 'fr', + createdAt: new Date(), + updatedAt: new Date() + }, + { + iso: 'nl', + createdAt: new Date(), + updatedAt: new Date() + } + ]); + + const countries = await database.models.Country.findAll(); + + const languageNamesToInsert = [ + { + title: 'English' + }, + { + title: 'French' + }, + { + title: 'Dutch' + } + ]; + await queryInterface.bulkInsert( + 'LanguageNames', + languages.map((language, i) => ({ + LanguageId: language.id, + createdAt: new Date(), + updatedAt: new Date(), + ...languageNamesToInsert[i] + })) + ); + }, + + down: async (queryInterface, Sequelize) => { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + + await queryInterface.bulkDelete('Languages'); + await queryInterface.bulkDelete('Countries'); + await queryInterface.bulkDelete('LanguageNames'); + } +}; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js index ae4678c..4069c63 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWord.js @@ -1,30 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const AltWord = (database) => { - const model = database.define('AltWord', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - link: { - type: DataTypes.STRING, - allowNull: true - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('AltWord', {}); }; module.exports = AltWord; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWordEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordEntry.js new file mode 100644 index 0000000..251a06d --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordEntry.js @@ -0,0 +1,30 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const AltWordEntry = (database) => { + const model = database.define('AltWordEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + link: { + type: DataTypes.STRING, + allowNull: true + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = AltWordEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js index c263c91..92b141f 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroup.js @@ -1,25 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const AltWordGroup = (database) => { - const model = database.define('AltWordGroup', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('AltWordGroup', {}); }; module.exports = AltWordGroup; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroupEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroupEntry.js new file mode 100644 index 0000000..80e4428 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/AltWordGroupEntry.js @@ -0,0 +1,25 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const AltWordGroupEntry = (database) => { + const model = database.define('AltWordGroupEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = AltWordGroupEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Country.js b/test-api-environment/elasticsearch-mysql/src/database/models/Country.js new file mode 100644 index 0000000..fe5ec44 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Country.js @@ -0,0 +1,12 @@ +const { DataTypes } = require('sequelize'); + +const Country = (database) => { + database.define('Country', { + iso: { + type: DataTypes.STRING, + allowNull: false + } + }); +}; + +module.exports = Country; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/CountryName.js b/test-api-environment/elasticsearch-mysql/src/database/models/CountryName.js new file mode 100644 index 0000000..db3d4a3 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/CountryName.js @@ -0,0 +1,12 @@ +const { DataTypes } = require('sequelize'); + +const CountryName = (database) => { + database.define('CountryName', { + title: { + type: DataTypes.STRING, + allowNull: false + } + }); +}; + +module.exports = CountryName; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js index 34caf7e..88dee90 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Flag.js @@ -1,26 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const Flag = (database) => { - const model = database.define('Flag', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('Flag', {}); }; module.exports = Flag; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagEntry.js new file mode 100644 index 0000000..76a8d58 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagEntry.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const FlagEntry = (database) => { + const model = database.define('FlagEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = FlagEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js index e008a91..e9fd20e 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevel.js @@ -1,26 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const FlagLevel = (database) => { - const model = database.define('FlagLevel', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('FlagLevel', {}); }; module.exports = FlagLevel; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevelEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevelEntry.js new file mode 100644 index 0000000..27f928d --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagLevelEntry.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const FlagLevelEntry = (database) => { + const model = database.define('FlagLevelEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = FlagLevelEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/FlagTypeEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/FlagTypeEntry.js new file mode 100644 index 0000000..a55235c --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/FlagTypeEntry.js @@ -0,0 +1,25 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const FlagTypeEntry = (database) => { + const model = database.define('FlagTypeEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = FlagTypeEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Language.js b/test-api-environment/elasticsearch-mysql/src/database/models/Language.js index fe3c55b..cf66bf0 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Language.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Language.js @@ -1,30 +1,12 @@ const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); const Language = (database) => { - const model = database.define('Language', { - title: { - type: DataTypes.STRING, - allowNull: false - }, + database.define('Language', { iso: { type: DataTypes.STRING, allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true } }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); }; module.exports = Language; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/LanguageName.js b/test-api-environment/elasticsearch-mysql/src/database/models/LanguageName.js new file mode 100644 index 0000000..fc7e9e1 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/LanguageName.js @@ -0,0 +1,12 @@ +const { DataTypes } = require('sequelize'); + +const LanguageName = (database) => { + database.define('LanguageName', { + title: { + type: DataTypes.STRING, + allowNull: false + } + }); +}; + +module.exports = LanguageName; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Localization.js b/test-api-environment/elasticsearch-mysql/src/database/models/Localization.js new file mode 100644 index 0000000..1cdc350 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Localization.js @@ -0,0 +1,12 @@ +const { DataTypes } = require('sequelize'); + +const Localization = (database) => { + database.define('Localization', { + slug: { + type: DataTypes.STRING, + allowNull: false + } + }); +}; + +module.exports = Localization; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js index 9c61b70..d8c79ad 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Reading.js @@ -1,30 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const Reading = (database) => { - const model = database.define('Reading', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - href: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('Reading', {}); }; module.exports = Reading; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/ReadingEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/ReadingEntry.js new file mode 100644 index 0000000..37ad193 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/ReadingEntry.js @@ -0,0 +1,30 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const ReadingEntry = (database) => { + const model = database.define('ReadingEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + href: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = ReadingEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js index f5d460c..5785d07 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPart.js @@ -1,29 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const SpeechPart = (database) => { - const model = database.define('SpeechPart', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - abbrev: { - type: DataTypes.STRING - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('SpeechPart', {}); }; module.exports = SpeechPart; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPartEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPartEntry.js new file mode 100644 index 0000000..ae4801e --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SpeechPartEntry.js @@ -0,0 +1,29 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const SpeechPartEntry = (database) => { + const model = database.define('SpeechPartEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + abbrev: { + type: DataTypes.STRING + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = SpeechPartEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/Status.js b/test-api-environment/elasticsearch-mysql/src/database/models/Status.js index 876021a..c07c28d 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/Status.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/Status.js @@ -1,26 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const Status = (database) => { - const model = database.define('Status', { - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('Status', {}); }; module.exports = Status; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/StatusEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/StatusEntry.js new file mode 100644 index 0000000..103156e --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/StatusEntry.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const StatusEntry = (database) => { + const model = database.define('StatusEntry', { + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = StatusEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js index 5ed916b..11a034c 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SubTerm.js @@ -1,30 +1,5 @@ -const { DataTypes } = require('sequelize'); -const SequelizeSlugify = require('sequelize-slugify'); - const SubTerm = (database) => { - const model = database.define('SubTerm', { - affix: { - type: DataTypes.STRING, - allowNull: false - }, - title: { - type: DataTypes.STRING, - allowNull: false - }, - slug: { - type: DataTypes.STRING, - allowNull: false, - unique: true - } - }); - - SequelizeSlugify.slugifyModel(model, { - source: ['title'], - slugOptions: { lower: true }, - overwrite: false, - column: 'slug', - incrementalReplacement: '-' - }); + database.define('SubTerm', {}); }; module.exports = SubTerm; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/SubTermEntry.js b/test-api-environment/elasticsearch-mysql/src/database/models/SubTermEntry.js new file mode 100644 index 0000000..b42dd45 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/models/SubTermEntry.js @@ -0,0 +1,30 @@ +const { DataTypes } = require('sequelize'); +const SequelizeSlugify = require('sequelize-slugify'); + +const SubTermEntry = (database) => { + const model = database.define('SubTermEntry', { + affix: { + type: DataTypes.STRING, + allowNull: false + }, + title: { + type: DataTypes.STRING, + allowNull: false + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + } + }); + + SequelizeSlugify.slugifyModel(model, { + source: ['title'], + slugOptions: { lower: true }, + overwrite: false, + column: 'slug', + incrementalReplacement: '-' + }); +}; + +module.exports = SubTermEntry; diff --git a/test-api-environment/elasticsearch-mysql/src/database/models/index.js b/test-api-environment/elasticsearch-mysql/src/database/models/index.js index 012fb41..c3fc1e2 100644 --- a/test-api-environment/elasticsearch-mysql/src/database/models/index.js +++ b/test-api-environment/elasticsearch-mysql/src/database/models/index.js @@ -1,14 +1,27 @@ const models = [ require('./AltWord'), + require('./AltWordEntry'), require('./AltWordGroup'), + require('./AltWordGroupEntry'), + require('./Country'), + require('./CountryName'), require('./Flag'), - require('./FlagType'), + require('./FlagEntry'), require('./FlagLevel'), + require('./FlagLevelEntry'), + require('./FlagType'), + require('./FlagTypeEntry'), require('./Language'), + require('./LanguageName'), + require('./Localization'), require('./Reading'), + require('./ReadingEntry'), require('./SpeechPart'), + require('./SpeechPartEntry'), require('./Status'), + require('./StatusEntry'), require('./SubTerm'), + require('./SubTermEntry'), require('./Word'), require('./WordEntry') ]; @@ -33,34 +46,85 @@ class Models { initRelationships(database) { const { AltWord, + AltWordEntry, AltWordGroup, + AltWordGroupEntry, + Country, + CountryName, Flag, + FlagEntry, FlagType, + FlagTypeEntry, FlagLevel, + FlagLevelEntry, Language, + LanguageName, + Localization, Reading, + ReadingEntry, SpeechPart, + SpeechPartEntry, Status, + StatusEntry, SubTerm, + SubTermEntry, Word, WordEntry } = database.models; AltWord.belongsTo(AltWordGroup); + AltWord.belongsToMany(WordEntry, { through: 'WordEntries_have_AltWords' }); + + AltWordEntry.belongsTo(AltWord); + AltWordEntry.belongsTo(Localization); + + AltWordGroupEntry.belongsTo(AltWordGroup); + AltWordGroupEntry.belongsTo(Localization); + + CountryName.belongsTo(Country); + CountryName.belongsTo(Language); + Flag.belongsTo(FlagLevel); Flag.belongsTo(FlagType); + Flag.belongsToMany(WordEntry, { through: 'WordEntries_have_Flags' }); - WordEntry.hasOne(Language); - WordEntry.hasOne(Status); + FlagEntry.belongsTo(Flag); + FlagEntry.belongsTo(Localization); + + FlagTypeEntry.belongsTo(FlagType); + FlagTypeEntry.belongsTo(Localization); + + FlagLevelEntry.belongsTo(FlagLevel); + FlagLevelEntry.belongsTo(Localization); + + LanguageName.belongsTo(Language); + + Localization.belongsTo(Country); + Localization.belongsTo(Language); - AltWord.belongsToMany(WordEntry, { through: 'WordEntries_have_AltWords' }); - Flag.belongsToMany(WordEntry, { through: 'WordEntries_have_Flags' }); Reading.belongsToMany(WordEntry, { through: 'WordEntries_have_Readings' }); + + ReadingEntry.belongsTo(Reading); + ReadingEntry.belongsTo(Localization); + SpeechPart.belongsToMany(WordEntry, { through: 'WordEntries_have_SpeechParts' }); + + SpeechPartEntry.belongsTo(Status); + SpeechPartEntry.belongsTo(Localization); + + StatusEntry.belongsTo(Status); + StatusEntry.belongsTo(Localization); + SubTerm.belongsToMany(WordEntry, { through: 'WordEntries_have_SubTerms' }); - WordEntry.belongsToMany(Word, { through: 'Words_have_WordEntries' }); + + SubTermEntry.belongsTo(SubTerm); + SubTermEntry.belongsTo(Localization); + + WordEntry.belongsTo(Localization); + WordEntry.belongsTo(Status); + WordEntry.belongsTo(Word); } } diff --git a/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/en_US.json b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/en_US.json new file mode 100644 index 0000000..042e623 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/en_US.json @@ -0,0 +1,3016 @@ +{ + "-misia": { + "title": "-misia", + "slug": "-misia", + "speech": "noun", + "defined": true, + "excerpt": "from Greek for hate or hatred", + "sub_terms": [ + { + "text": "Fat", + "full_title": "fatmisia" + }, + { + "text": "Islam", + "full_title": "Islamomisia" + }, + { + "text": "Trans", + "full_title": "transmisia" + } + ], + "reading": [ + { + "text": "Beatley Library Anti-Oppression Guide", + "href": "https://simmons.libguides.com/anti-oppression#s-lib-ctab-10174165-1" + }, + { + "text": "Anti-Oppression: Anti-Fatmisia", + "href": "https://simmons.libguides.com/anti-oppression/anti-fatmisia" + } + ], + "content": "\n\nfrom Greek for hate or hatred\n\n## Use\n\n-Misia can be appended to minoritised identifiers that are targeted for hate, such as fat (fatmisia), trans (transmisia), or Islam (Islamomisia).\n\n## Issues\n\n-Phobia is Greek for 'fear of'.\n\nWhen used as a suffix in the context of Islamophobia, transphobia, or fatphobia, it is implied that the individual or group has a _fear_ of individuals and communities who identify in those ways. Rather than a direct translation, however, the implication and subtext of these terms is one of prejudice and discrimination. Using the term phobia falsely masks hate as fear.\n\nAdditionally, people with anxiety disorders and mental illness can also experience phobias, so conflating prejudice and discrimination (attitudes and behaviours that can be changed) with medical conditions that cannot be changed additionally harms people who experience phobias from their anxiety disorders.\n\nAs such, using the term phobia removes the responsibility from those who exhibit prejudice and discrimination as it implies it is outside of their control.\n\n## Impact\n\nHateful actions of prejudice and discrimination are unfairly conflated with mental illness. It can create a false parallel where one could imply that actual phobias are something that can be controlled, which harms people who experience actual phobias.\n\nMeanwhile, people exhibiting prejudice and discrimination are given excuses for their bigoted behaviour and not held accountable for their actions.\n\n## Preferable To\n\n-phobia\n", + "basename": "-misia" + }, + "-normative": { + "title": "-normative", + "slug": "-normative", + "defined": false, + "sub_terms": [ + { + "text": "Hetero", + "full_title": "heternormative" + } + ], + "content": "\n", + "basename": "-normative" + }, + "-passing": { + "title": "-passing", + "slug": "-passing", + "defined": false, + "sub_terms": [ + { + "text": "cis-", + "full_title": "cis-passing" + }, + { + "text": "female-", + "full_title": "female-passing" + }, + { + "text": "white-", + "full_title": "white-passing" + } + ], + "content": "\n", + "basename": "-passing" + }, + "-phile": { + "title": "-phile", + "slug": "-phile", + "defined": false, + "sub_terms": [ + { + "text": "andro-", + "full_title": "andro-phile" + }, + { + "text": "gyne-", + "full_title": "gyne-phile" + } + ], + "content": "\n", + "basename": "-phile" + }, + "-phobia": { + "title": "-phobia", + "slug": "-phobia", + "defined": false, + "sub_terms": [ + { + "text": "Fat", + "full_title": "Fatphobia" + }, + { + "text": "Homo", + "full_title": "Homophobia" + }, + { + "text": "Trans", + "full_title": "Transphobia" + } + ], + "content": "\n", + "basename": "-phobia" + }, + "-splaining": { + "title": "-Splaining", + "slug": "-splaining", + "defined": false, + "sub_terms": [ + { + "text": "Cissplaining", + "full_title": "Cissplaining" + }, + { + "text": "Mansplaining", + "full_title": "Mansplaining" + }, + { + "text": "Whitesplaining", + "full_title": "Whitesplaining" + } + ], + "content": "\n", + "basename": "-splaining" + }, + "-tard": { + "title": "-tard", + "slug": "-tard", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "-tard" + }, + "ableism": { + "title": "Ableism", + "slug": "ableism", + "defined": true, + "excerpt": "a system that places value on people’s bodies and minds based on societally constructed ideas of normalcy, intelligence, excellence, and productivity. These constructed ideas are deeply rooted in anti-Blackness, eugenics, colonialism, and capitalism.", + "speech": "noun", + "flag": { + "level": "warning", + "text": "content warning" + }, + "reading": [ + { + "text": "Ableism 2020: An Updated Definition", + "href": "https://www.talilalewis.com/blog/ableism-2020-an-updated-definition" + }, + { + "text": "Longmore Lecture: Context, Clarity & Grounding", + "href": "https://www.talilalewis.com/blog/longmore-lecture-context-clarity-grounding" + } + ], + "content": "\n\na system that places value on people’s bodies and minds based on societally constructed ideas of normalcy, intelligence, excellence, and productivity. These constructed ideas are deeply rooted in anti-Blackness, eugenics, colonialism, and capitalism.\n\n— Talia \"TL\" Lewis\n\n## Impact\n\nTo paraphrase Lewis, ableism \"leads to people and society determining who is valuable and worthy based on a person’s appearance and/or their ability to [...] produce, excel, and 'behave.'\" You do not have to be disabled to experience ableism, and Disabled people can also reinforce ableism internally (manifesting as harm to themselves) and externally (harm to other disabled people).\n", + "basename": "ableism" + }, + "ableist-language": { + "title": "Ableist language", + "slug": "ableist-language", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "ableist-language" + }, + "abuse": { + "title": "Abuse", + "slug": "abuse", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "abuse" + }, + "acquired-immune-deficiency-syndrome": { + "title": "Acquired Immune Deficiency Syndrome (AIDS)", + "slug": "acquired-immune-deficiency-syndrome", + "defined": false, + "content": "", + "basename": "acquired-immune-deficiency-syndrome" + }, + "african-american-vernacular-english": { + "title": "African American Vernacular English (AAVE)", + "slug": "african-american-vernacular-english", + "defined": false, + "content": "", + "basename": "african-american-vernacular-english" + }, + "agender": { + "title": "agender", + "slug": "agender", + "defined": false, + "content": "", + "basename": "agender" + }, + "alcoholism": { + "title": "alcoholism", + "slug": "alcoholism", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "alcoholism" + }, + "ambulatory-wheelchair": { + "title": "Ambulatory Wheelchair", + "slug": "ambulatory-wheelchair", + "defined": false, + "content": "", + "basename": "ambulatory-wheelchair" + }, + "american": { + "title": "American", + "slug": "american", + "defined": false, + "sub_terms": [ + { + "text": "African", + "full_title": "African American" + }, + { + "text": "Asian", + "full_title": "Asian American" + }, + { + "text": "Black", + "full_title": "Black American" + }, + { + "text": "Hispanic", + "full_title": "Hispanic American" + }, + { + "text": "Indigenous", + "full_title": "Indigenous American" + }, + { + "text": "Latin", + "full_title": "Latin American" + } + ], + "content": "\n", + "basename": "american" + }, + "ancestors": { + "title": "Ancestors", + "slug": "ancestors", + "defined": false, + "content": "", + "basename": "ancestors" + }, + "anti-": { + "title": "Anti-", + "slug": "anti-", + "defined": false, + "sub_terms": [ + { + "text": "-blackness", + "full_title": "anti-blackness" + }, + { + "text": "-queerness", + "full_title": "anti-queerness" + }, + { + "text": "-semitism", + "full_title": "antisemitism" + }, + { + "text": "-trans", + "full_title": "anti-trans" + } + ], + "content": "\n", + "basename": "anti-" + }, + "anxiety-disorders": { + "title": "Anxiety disorders", + "slug": "anxiety-disorders", + "defined": false, + "content": "", + "basename": "anxiety-disorders" + }, + "aromantic": { + "title": "aromantic", + "slug": "aromantic", + "defined": false, + "content": "", + "basename": "aromantic" + }, + "asexual": { + "title": "asexual", + "slug": "asexual", + "defined": false, + "content": "", + "basename": "asexual" + }, + "asian-american": { + "title": "Asian-American", + "slug": "asian-american", + "defined": true, + "speech": "noun", + "skip_in_table_of_content": true, + "content": "\numbrella term for people of Asian descent (immigrant or natural born) who live in and/or are from the United States.\n\n## Considerations\n\nAs many countries and cultures are enveloped within this umbrella term, try to be as specific as possible. When speaking of Vietnamese-Americans or Chinese-Americans, use those terms instead. Be careful to not assume that every English-speaking Asian person you meet in the U.S. is necessarily Asian-American. (For one, they could be Asian-Canadian or have any other number of nationalities. In general, be mindful of accuracy and confirm with relevant parties.\n\n## Note\n\nCan be shortened to AsAm or AA by those who identify as Asian American. Be mindful of context and always spell out on first reference. If you aren't Asian-American, it's best to keep it spelled out.\n", + "basename": "asian-american" + }, + "asian": { + "title": "Asian", + "slug": "asian", + "defined": false, + "sub_terms": [ + { + "text": "-American", + "full_title": "Asian-American" + }, + { + "text": "East", + "full_title": "East Asian" + }, + { + "text": "South", + "full_title": "South Asian" + }, + { + "text": "Southeast", + "full_title": "Southeast Asian" + } + ], + "content": "\n", + "basename": "asian" + }, + "assigned-at-birth": { + "title": "assigned at birth", + "slug": "assigned-at-birth", + "defined": false, + "content": "", + "basename": "assigned-at-birth" + }, + "attention-deficithyperactivity-disorder": { + "title": "Attention-Deficit/Hyperactivity Disorder (ADHD)", + "slug": "attention-deficithyperactivity-disorder", + "defined": false, + "content": "", + "basename": "attention-deficithyperactivity-disorder" + }, + "attraction": { + "title": "Attraction", + "slug": "attraction", + "defined": false, + "sub_terms": [ + { + "text": "Aesthetic", + "full_title": "Aesthetic Attraction" + }, + { + "text": "Platonic", + "full_title": "Platonic Attraction" + }, + { + "text": "Sexual", + "full_title": "Sexual Attraction" + } + ], + "content": "\n", + "basename": "attraction" + }, + "autism-spectrum": { + "title": "Autism spectrum", + "slug": "autism-spectrum", + "defined": false, + "content": "", + "basename": "autism-spectrum" + }, + "barbaric": { + "title": "Barbaric", + "slug": "barbaric", + "flag": { + "text": "Neo-Colonial/Racist slur", + "level": "avoid" + }, + "defined": true, + "excerpt": "something which is obscenely cruel; primitive; unsophisticated.", + "speech": "adjective", + "reading": [ + { + "text": "is the word barbarian a slur?", + "href": "https://seetobehumanityearth.wordpress.com/2015/07/16/is-the-term-barbarian-a-slur/" + }, + { + "text": "Barbarian wiki", + "href": "https://en.wikipedia.org/wiki/Barbarian" + } + ], + "alt_words": [ + "cruel", + "vicious", + "obscene", + "feral" + ], + "content": "\n\nsomething which is obscenely cruel; primitive; unsophisticated\n\n## Issues\n\nBarbarian originates from the Greek word _bárbaros_ meaning \"babbler\", to denote the \"unintelligible sounds\" (_\"bar bar bar\"_) made by foreign speakers.\nSimilar words exist in many other languages, for the identical purpose labeling a \"strange\"/\"foreign\" person/culture.\n\nIn modern day usage, you can notice this rhetoric being employed almost always for the purpose of demonizing \"foreign\" (more often than not from the global south) cultures - cultures that need to be civilized;\ncultures that need to be colonized to rescue them from themselves. A perfect lingual weapon for warmongers and racists alike. Equally repulsive sibling of \"savage\".\n\n## Impact\n\nWhen you use words, that are in vogue primarily inside circles of bigots, with racist etymologies, it's a wilful act of violence, ignorance and an indication to the vilified and minoritised communities that their history of wounds and abuses are inconsequential to our words.\n\n## Usage Tip\n\nAvoid words that have obscene etymologies. There is almost always a better alternative: an inclusive and a less hurtful one.\n", + "basename": "barbaric" + }, + "bias": { + "title": "Bias", + "slug": "bias", + "defined": false, + "content": "", + "basename": "bias" + }, + "bierasure": { + "title": "Bierasure", + "slug": "bierasure", + "speech": "noun", + "defined": true, + "reading": [ + { + "text": "Erasure of Bisexuality", + "href": "https://www.glaad.org/bisexual/bierasure" + } + ], + "content": "\n\nthe questioning or denial of the existance or legitimacy of [Bisexuality](/definitions/bisexual).\n\n## Impact\n\n\"Bi+ people experience discrimination from both heterosexual and sexual minority communities, related to repeatedly needing to “come out” as bi+.\n\nThis double discrimination can lead to isolation and loneliness, which can be harmful for mental health.\" — Sabra Katz-Wise\n", + "basename": "bierasure" + }, + "bipolar": { + "title": "Bipolar", + "slug": "bipolar", + "defined": false, + "flag": { + "level": "avoid", + "text": "medical appropriation" + }, + "content": "\n", + "basename": "bipolar" + }, + "biromantic": { + "title": "Biromantic", + "slug": "biromantic", + "speech": "adj", + "defined": true, + "reading": [ + { + "text": "Sorting Out Romantic vs Sexual Feelings", + "href": "http://teenhealthsource.com/blog/faq-sorting-out-romantic-vs-sexual-feelings/" + }, + { + "text": "Being Bi On The Asexual Spectrum", + "href": "https://www.curvemag.com/Lifestyle/Being-Bi-On-The-Asexual-Spectrum-2141/" + }, + { + "text": "Here’s What It Means When Your Romantic and Sexual Orientations Are Different", + "href": "https://everydayfeminism.com/2016/07/cross-orientation-101/" + } + ], + "content": "\n\nof, relating to, or characterised by being romantically attracted to more than one gender.\n\n## Note\n\nBiromantic does not imply any particular kind of sexual attraction, or sexual attraction at all. A biromantic person may be asexual, homosexual, heterosexual, [bisexual](/definitions/bisexual), [pansexual](/definitions/pansexual), etc.\n\nBiromantic does not preclude romantic attraction to [non-binary](/definitions/non-binary) or [transgender](/definitions/transgender) people.\n", + "basename": "biromantic" + }, + "bisexual": { + "title": "Bisexual", + "slug": "bisexual", + "speech": "adj", + "defined": true, + "reading": [ + { + "text": "Am I Bisexual?", + "href": "http://www.bisexualindex.org.uk/index.php/AmIBisexual" + } + ], + "content": "\n\nof, relating to, or characterised by being sexually attracted to more than one gender.\n\n## Note\n\nBisexuality does not preclude attraction to [non-binary](/definitions/non-binary) or [transgender](/definitions/transgender) people.\n\n## Other languages\n\n[Nederlands](/definitions/nl_NL/biseksueel)\n", + "basename": "bisexual" + }, + "black-asian-minority-ethnic": { + "title": "Black Asian Minority Ethnic (BAME)", + "slug": "black-asian-minority-ethnic", + "defined": false, + "content": "", + "basename": "black-asian-minority-ethnic" + }, + "black-indigenous-people-of-color": { + "title": "Black Indigenous People of Color (BIPOC)", + "slug": "black-indigenous-people-of-color", + "defined": false, + "content": "", + "basename": "black-indigenous-people-of-color" + }, + "black": { + "title": "Black", + "slug": "black", + "defined": false, + "sub_terms": [ + { + "text": "men (BM)", + "full_title": "Black men (BM)" + }, + { + "text": "people (BP)", + "full_title": "Black people (BP)" + }, + { + "text": "women (BW)", + "full_title": "Black women (BW)" + } + ], + "content": "\n", + "basename": "black" + }, + "boogaloo": { + "title": "Boogaloo", + "slug": "boogaloo", + "flag": { + "text": "Racist Symbol", + "level": "avoid" + }, + "defined": true, + "excerpt": "Appropriated by Alt-Right and White Supremacist groups as a thinly veiled code for a race-based or civil war, boogaloo was originally both a dance and musical genre.", + "speech": "noun", + "reading": [ + { + "text": "Who Owns Boogaloo?", + "href": "https://www.npr.org/sections/codeswitch/2020/05/31/864402190/who-owns-boogaloo" + }, + { + "text": "The Boogaloo: Extremists’ New Slang Term for A Coming Civil War", + "href": "https://www.adl.org/blog/the-boogaloo-extremists-new-slang-term-for-a-coming-civil-war" + }, + { + "text": "Boogaloo movement", + "href": "https://en.wikipedia.org/wiki/Boogaloo_movement#:~:text=The%20Boogaloo%20movement%2C%20members%20of,they%20call%20the%20%22boogaloo%22." + }, + { + "text": "Tiki bars are built on cultural appropriation and colonial nostalgia. Where’s the reckoning?", + "href": "https://www.latimes.com/food/story/2019-11-27/tiki-bar-problems" + }, + { + "text": "The Boogaloo Movement Is Not What You Think", + "href": "https://www.bellingcat.com/news/2020/05/27/the-boogaloo-movement-is-not-what-you-think/" + } + ], + "content": "\n\n\noriginal meaning: A type of music made up of a mix of mambo, cha cha, pachanga, doo-wop and soul. \"Boogaloo\" has since been appropriated by Alt-Right and White Supremacists groups to refer to a race-based civil war. Other terms for Boogaloo include: _boog, boojahideen, big igloo, and big luau_.\n\nThe co-opted use of “Boogaloo” is a [dog-whistle](https://en.m.wikipedia.org/wiki/Dog-whistle_politics), used to communicate about, and signal support for militias inciting violence to escalate and accelerate violent uprisings against the government. Part of electing to use this term, as well as Hawaiian shirts and igloos is to avoid existing automated content flags used on social media sites.\n\nIts usage is derived from memes about the film _Breakin’ 2: Electric Boogaloo_, riffing on the title – notably, as “Civil War 2: Electric Boogaloo”. Appending “Electric Boogaloo” to other concepts as a joke was born in and largely popularized by early internet message boards such as Something Awful and 4chan.\n\nSome Alt-Right members self-identify as \"Boogaloo Boys\" (or \"Bois\"), or speak of \"preparing / showing up for the Boogaloo\". Many dress in Hawaiian shirts and/or military wear to distinguish themselves at protests and gatherings. One effect of wearing the Hawaiian shirt is to co-opt the public’s existing notions about Hawaiian culture with peaceful, impartial observation, and not radical militarism.\n\n## Issues\n\nSimilarly to the [OK Hand symbol](/definitions/ok-hand), the word itself does not have racist origins (and in fact, is a product of the Latinx music community) and neither does the original meme (a joke about movie sequels). However, language evolves, and \"Boogaloo\" has become a term used quite seriously by Alt-Right and White Supremacist communities.\n\nIt should be noted that this approach of indoctrinating symbols of hate is one long-documented, and [used for the Swastika as well](https://theconversation.com/how-nazis-twisted-the-swastika-into-a-symbol-of-hate-83020)\n\n## Related symbols\n\nBoth the Hawaiian shirt and Igloo snow huts are associated with Indigenous cultures. Before being co-opted by the Boogaloo movement, both symbols were co-opted by American popular culture.\n\nHawaiian shirts were popularized by the Tiki culture movement, created after American military returned from being stationed in the South Pacific during World War II. Due to a lack of including and elevating Polynesian people in the movement, it is considered to be both cultural appropriation and colonial nostalgia.\n\n## Impact\n\nAlthough this was previously a non-violent / non-hateful meme, continuing to use it supports the plausible deniability of those who do use it with serious intent. Those who are most vulnerable will not know your intent, and therefore will feel the impact of hurt and fear, regardless.\n", + "basename": "boogaloo" + }, + "bropropriating": { + "title": "Bropropriating", + "slug": "bropropriating", + "defined": false, + "content": "", + "basename": "bropropriating" + }, + "brown": { + "title": "Brown", + "slug": "brown", + "defined": false, + "content": "", + "basename": "brown" + }, + "bullying": { + "title": "Bullying", + "slug": "bullying", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "bullying" + }, + "burka": { + "title": "Burka", + "slug": "burka", + "defined": false, + "content": "", + "basename": "burka" + }, + "child-of-a-deaf-adult": { + "title": "Child of a Deaf Adult (CODA)", + "slug": "child-of-a-deaf-adult", + "defined": false, + "content": "", + "basename": "child-of-a-deaf-adult" + }, + "childhood-trauma": { + "title": "childhood trauma", + "slug": "childhood-trauma", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "childhood-trauma" + }, + "cisgender": { + "title": "Cisgender", + "slug": "cisgender", + "speech": "adj", + "defined": true, + "content": "\n\nof, relating to, or characterised by being a gender that matches the gender they were assigned at birth.\n\nThe opposite of [transgender](/definitions/transgender).\n", + "basename": "cisgender" + }, + "climate-change": { + "title": "Climate change", + "slug": "climate-change", + "defined": false, + "content": "", + "basename": "climate-change" + }, + "colonial-narrative": { + "title": "Colonial narrative", + "slug": "colonial-narrative", + "defined": false, + "content": "", + "basename": "colonial-narrative" + }, + "colonialism": { + "title": "Colonialism", + "slug": "colonialism", + "defined": false, + "content": "\n", + "basename": "colonialism" + }, + "colorism": { + "title": "colorism", + "slug": "colorism", + "defined": false, + "content": "", + "basename": "colorism" + }, + "complex-post-traumatic-stress-disorder": { + "title": "Complex Post-Traumatic Stress Disorder (PTSD)", + "slug": "complex-post-traumatic-stress-disorder", + "defined": false, + "content": "", + "basename": "complex-post-traumatic-stress-disorder" + }, + "crazy": { + "title": "crazy", + "slug": "crazy", + "flag": { + "text": "Ableist language", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "abundant", + "bizarre", + "enormous", + "ludicrous", + "obnoxious", + "outlandish", + "ridiculous", + "unbelievable", + "unexpected", + "unfamiliar", + "unreal", + "scary", + "shocking", + "strange", + "wicked", + "wild" + ], + "content": "\n\nmentally deranged; demented; insane.\n\n## Issues\n\nCrazy is very commonly used as an adjective to embody a vast array of ideas, often not specifically. It is used so frequently that it sometimes is a filler. Crazy can also be used in a derogatory manner for someone with mental or psychiatric disabilities.\n\n## Impact\n\nBy using ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling.\n", + "basename": "crazy" + }, + "crippled": { + "title": "Crippled", + "slug": "crippled", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "crippled" + }, + "cultural-appropriation": { + "title": "cultural appropriation", + "slug": "cultural-appropriation", + "defined": false, + "content": "", + "basename": "cultural-appropriation" + }, + "deaf-and-deaf": { + "title": "deaf and Deaf", + "slug": "deaf-and-deaf", + "defined": false, + "content": "", + "basename": "deaf-and-deaf" + }, + "demi": { + "title": "Demi", + "slug": "demi", + "defined": false, + "sub_terms": [ + { + "text": "-boy", + "full_title": "Demi-boy" + }, + { + "text": "-girl", + "full_title": "Demi-girl" + }, + { + "text": "-romantic", + "full_title": "Demi-romantic" + }, + { + "text": "-sexual", + "full_title": "Demi-sexual" + } + ], + "content": "\n", + "basename": "demi" + }, + "demiboy": { + "title": "demiboy", + "slug": "demiboy", + "defined": false, + "content": "", + "basename": "demiboy" + }, + "demigirl": { + "title": "demigirl", + "slug": "demigirl", + "defined": false, + "content": "", + "basename": "demigirl" + }, + "depression": { + "title": "Depression", + "slug": "depression", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "depression" + }, + "derpy": { + "title": "derpy", + "slug": "derpy", + "flag": { + "text": "Ableist Term", + "level": "avoid" + }, + "defined": true, + "speech": "adjective", + "alt_words": [ + "ridiculous", + "clumsy", + "foolish", + "misshapen", + "malformed", + "silly" + ], + "reading": [ + { + "text": "Derp is ableist and offensive", + "href": "https://americandramedy.blogspot.com/2013/06/derp-is-ableist-and-offensive-stop.html" + }, + { + "text": "Ableist words and terms to avoid", + "href": "https://www.autistichoya.com/p/ableist-words-and-terms-to-avoid.html" + } + ], + "content": "\n\nclumsy, foolish, unattractive, or otherwise unintelligent act or person.\n\n## Related Words\n\nderp, derp face, herp derp, hurr durr\n\n## Issues\n\nDerpy is very commonly used as an adjective to describe someone's clumsy or foolish behavior, occasionally that of the speaker themselves. Sometimes it is used as a direct replacement of the [r-word](https://www.selfdefined.app/definitions/r-word/).\n\nIt is also used to describe someone else's physical features as unattractive or akin to someone with intellectual and developmental disabilities. In imagery, derpy or a so-called \"derp face\", is often signified by crossed eyes, a stuck out tongue, or permanent facial differences.\n\n## Origins\n\nThe word \"derp\" found its first known use in the 1998 film __Baseketball__ by the creators of the American animated sitcom, __South Park__, and later in __South Park__ itself in the name of the character [\"Mr Derp\"](https://southpark.fandom.com/wiki/Mr._Derp). The creators of the show have expressed that the term is uttered when one \"screws up\". In these early uses the word is interchangeable with the words \"duh\", \"hur\" and \"dur\" that came before it, and may have directly or indirectly originated from them.\n\nThe word evolved in 4chan and other forums and began being associated with memes, where the \"derpy\" imagery began. It is there where it became associated with intellectual and developmental disabilities (I/IDD) specifically, as people started overlaying \"derp\" over photographs of children with I/DD.\n\n## Impact\n\nRegardless of whether derpy is being used to describe yourself, or someone with or without an I/DD or physical disability, use of the word contributes to the dehumanisation, stigmatisation, and negative perceptions of people with an I/DD or physical (especially facial) differences.\n\nBy using ableist language, we are perpetuating violence against people who experience mental, developmental, or physical disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling. If you are describing a person's silly actions or expressions use a more relevant, descriptive word.\n\nIf you are using it to describe or refer to a person's disability or physical difference, don't.\n", + "basename": "derpy" + }, + "digital-blackface": { + "title": "digital Blackface", + "slug": "digital-blackface", + "defined": true, + "Speech": "noun", + "reading": [ + { + "text": "We Need to Talk About Digital Blackface in Reaction GIFs", + "href": "https://www.teenvogue.com/story/digital-blackface-reaction-gifs" + }, + { + "text": "Memes and Misogynoir", + "href": "https://www.theawl.com/2014/08/memes-and-misogynoir/" + } + ], + "content": "\n\na form of appropriation where non-Black individuals use memes and gifs featuring Black people and even emojis with dark skin; a 21st century version of Black minstrelsy, which was prevalent in the 19th and 20th centuries\n\n## Issues\n\nDigital Blackface is one of many ways of dehumanising Black individuals into exaggerated versions of themselves, especially Black women. Rarely are Black characters given subtle feelings, emotion or actions. Additionally, power comes into it as a non-Black person is using a Black person as a mask (hence where the minstrelsy comes in).\n\nDigital Blackface is also an issue of representation and culture appropriation: memes and gifs are often used in spaces where no real Black people are present, which presents them as a prop to be used in all-white spaces. Black culture is stolen from Black people and commodified by non-Black people.\n\n## Examples\n\n- Online personas: It can go further than appropration. Falsified personas are easy to spot as they almost always use terms like \"as a black woman...\" [sic] and resort to incorrect and illegitimate use of African American Vernacular English (AAVE).[1](https://www.buzzfeednews.com/article/ryanhatesthis/your-slip-is-showing-4chan-trolls-operation-lollipop)\n\n \"On Twitter lie countless handles featuring a Black person’s image, run by users who are most assuredly not Black. These accounts, which often include a “ghetto” name — the formula prefix “La+” is a favored trope — are riddled with poor attempts at Black vernacular, and feature stereotypes from the minstrel stage.\" [2](https://www.theawl.com/2014/08/memes-and-misogynoir/)\n\n- Gifs\n\n \"For while reaction GIFs can and do every feeling under the sun, white and nonblack users seem to especially prefer GIFs with black people when it comes to emitting their most exaggerated emotions. Extreme joy, annoyance, anger and occasions for drama and gossip are a magnet for images of black people, especially black femmes.\" [1](https://www.teenvogue.com/story/digital-blackface-reaction-gifs)\n\n- Emojis (using a darker-than-your-own skin-tone, especially when you are white)[1](https://www.npr.org/sections/codeswitch/2018/03/21/425573955/white-skin-black-emojis)[2](https://techcrunch.com/2017/10/01/thoughts-on-white-people-using-dark-skinned-emoji/)\n\n- Simple actions like using dark toned emoji in text or social media posts\n\n## What To Do (instead)\n\nIf you are not Black, before using a Black person's identity to express or convey an idea, take a moment to reflect upon what you're doing and what message you're trying to convey. In most situations, you would probably be better off picking a gif or meme of a non-Black person, better yet, of a race you identify with.\n", + "basename": "digital-blackface" + }, + "disability": { + "title": "Disability", + "slug": "disability", + "defined": false, + "content": "", + "basename": "disability" + }, + "disabled": { + "title": "Disabled", + "slug": "disabled", + "defined": false, + "content": "", + "basename": "disabled" + }, + "discordant-couples": { + "title": "Discordant couples", + "slug": "discordant-couples", + "defined": false, + "content": "", + "basename": "discordant-couples" + }, + "discrimination": { + "title": "Discrimination", + "slug": "discrimination", + "defined": false, + "content": "", + "basename": "discrimination" + }, + "dissociative-identity-disorder": { + "title": "Dissociative Identity Disorder", + "slug": "dissociative-identity-disorder", + "speech": "noun", + "defined": true, + "content": "\n\nDissociative identity disorder (DID) is a mental illness that involves disruptions or breakdowns of memory, awareness, identity and/or perception. It can also include the existence of two or more distinct identities (or “personality states”). The distinct identities are accompanied by changes in behavior, memory and thinking.\n\n## Read also\n\n- [plural](/definitions/plural)\n", + "basename": "dissociative-identity-disorder" + }, + "dominant-culture-habits": { + "title": "Dominant culture habits", + "slug": "dominant-culture-habits", + "defined": false, + "content": "", + "basename": "dominant-culture-habits" + }, + "dominant-culture": { + "title": "Dominant culture", + "slug": "dominant-culture", + "defined": false, + "content": "", + "basename": "dominant-culture" + }, + "dude": { + "title": "dude", + "slug": "dude", + "defined": true, + "flag": { + "level": "avoid" + }, + "alt_words": { + "expression of astonishment": [ + "wow", + "oh my word", + "yikes" + ], + "noun": [ + "y'all", + "friend", + "mate", + "fam", + "folks", + "pal*", + "buddy*" + ] + }, + "reading": [ + { + "text": "Etymonline entry", + "href": "https://www.etymonline.com/word/dude" + } + ], + "content": "\n\ncolloquially, a man; a discourse marker expressing masculine solidarity; an expression of astonishment when used alone\n\n## Issues\n\n\"Dude\" was originally used to refer to a man who paid a lot of attention to his appearance, but became more broadly used to describe any man as part of African American Vernacular English in the 1960s. It was subsequently appropriated by white men in the 1980s, particularly on the West Coast, and has since grown to be used broadly by white men and women as a noun as well as a discourse marker.\n\nWhen used as a discourse marker, it carries the connotation that the speaker believes that they are speaking to a man; however, as both a discourse marker and a noun, it is frequently used without regard for the gender or pronouns of listeners.\n\n## Impact\n\nRegardless of the intent of the speaker, prefacing a statement with \"dude\" risks misgendering its audience and perpetuating a culture that favors traditional masculinity as the baseline for gender. Proponents of using \"dude\" commonly defend its usage aggressively by claiming that they use it in a gender-neutral way (which is not possible) and that anyone negatively impacted by its usage is wrong for not accepting that and chooses to apply the gendered interpretation. The argument fails to acknowledge that society dictates and reinforces gender, regardless of the individual interpretation. The ubiquity of that argument often deters those who are negatively impacted from bringing attention to the usage of \"dude\" as their experiences are often [gaslighted](/definitions/gaslighting).\n\n## Alt Words Mindfulness Note\n\nBefore using colloquial terms of endearment, it's important to be mindful of power and context. While our intent may be to make people feel at ease or comfortable, we can have the opposite effect. For example, \"buddy\" or \"pal\" from an older person to younger person or a manager to employee can feel infantilising or pejorative; this becomes exacerbated because of the power differential in the relationship. The person in less power often isn't in a position to correct. There's no one-size-fits-all model; instead we should seek to address people with consent first and course correct. It's not about getting it perfect at first, it's about getting it right in the end.\n", + "basename": "dude" + }, + "dumb": { + "title": "dumb", + "slug": "dumb", + "flag": { + "text": "ableist language", + "level": "avoid" + }, + "defined": true, + "speech": "adjective", + "alt_words": [ + "basic", + "incomprehensible", + "nonsensical", + "redundant", + "shallow", + "silly", + "senseless", + "strange", + "weird", + "unfamiliar", + "unfathomable", + "unnecessary" + ], + "reading": [ + { + "text": "Etymonline entry", + "href": "https://www.etymonline.com/word/dumb" + }, + { + "text": "The Case Against Stupid", + "href": "https://ischemgeek.wordpress.com/2014/02/15/the-case-against-stupid/" + }, + { + "text": "National Association of the Deaf FAQ", + "href": "https://www.nad.org/resources/american-sign-language/community-and-culture-frequently-asked-questions/" + }, + { + "text": "National Geographic Creation of Sign Language", + "href": "https://www.nationalgeographic.com/history/magazine/2019/05-06/creation-of-sign-language/" + }, + { + "text": "Stereotypes and Evaluations of People who are D/deaf [PDF, 363KB]", + "href": "https://digitalcommons.unf.edu/cgi/viewcontent.cgi?article=1020&context=honors" + }, + { + "text": "StackExchange \"Who first wrote about deafness\"", + "href": "https://history.stackexchange.com/questions/7293/who-first-wrote-about-deafness" + } + ], + "content": "\n\nnon-verbal, non-speaking, silent, refraining from speaking or unable to speak; sometimes __mute__ which can also be ableist; colloquially used to mean unintelligent or senseless\n\n## Issues\n\nDumb initially meant \"mute, silent, refraining or unable to speak.\" Old German __thumb__ carried a dual meaning of \"stupid\", which eventually took over.\n\nAn oft-cited quote by Greek philosopher Aristotle reads, \"Men that are deaf are in all cases also dumb.**\" Historically the Greeks valued physical prowess (as evidenced by their invention of the Olympic Games) and their language, so anyone who lacked the ability to perform certain physical tasks or conduct reason (verbalise reason, rather) in their language was considered invaluable to society. The historical context is still ever present today, where we devalue disabled bodies and minds.\n\nUsing dumb reinforces these cultural values.\n\n**Isolation to only \"men\" also reinforces the historical patriarchical ideas that intersected with these ableist ones.\n\n## Impact\n\nUsing the word dumb reinforces the idea that Deaf and/or non-speaking/non-verbal people do not have valuable ideas to contribute, and that we only value people based on their idea to generate ideas and goods (see [Ableism](/definitions/ableism))\n\nBy using ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling.\n", + "basename": "dumb" + }, + "east-asian": { + "title": "East Asian", + "slug": "east-asian", + "defined": true, + "speech": "noun", + "skip_in_table_of_content": true, + "content": "\numbrella term for people of East Asian descent. East Asian countries include China, Hong Kong, Macau, Mongolia, North Korea, South Korea, Japan, and Taiwan\n\n## Considerations\n\nAs many countries and cultures are enveloped within this umbrella term, try to be as specific as possible. If you know or can ask someone if they are Japanese, for example, that's better as it's more specific.\n\nDo not assume someone is East Asian because of certain physical characteristics or language knowledge.\n\nAdditionally, these Asian subregions are important to differentiate, as some regions were most fraught to imperialism and colonisation than others.\n", + "basename": "east-asian" + }, + "ebonics": { + "title": "Ebonics", + "slug": "ebonics", + "defined": false, + "flag": { + "level": "avoid", + "text": "racist language" + }, + "content": "", + "basename": "ebonics" + }, + "egalitarian": { + "title": "Egalitarian", + "slug": "egalitarian", + "defined": false, + "content": "", + "basename": "egalitarian" + }, + "ehlers-danlos-syndromes": { + "title": "Ehlers-Danlos Syndromes (EDS)", + "slug": "ehlers-danlos-syndromes", + "defined": false, + "content": "", + "basename": "ehlers-danlos-syndromes" + }, + "empathy": { + "title": "Empathy", + "slug": "empathy", + "defined": false, + "content": "", + "basename": "empathy" + }, + "enby": { + "title": "enby", + "slug": "enby", + "defined": false, + "content": "", + "basename": "enby" + }, + "english-as-second-language": { + "title": "English as Second Language (ESL)", + "slug": "english-as-second-language", + "flag": { + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "English as learning-language (ELL)", + "or non-native", + "or omit (because do you really know, for sure?)" + ], + "reading": [ + { + "href": "https://benchmarkeducation.com/best-practices-library/supporting-english-language-learners-in-reading-writing.html#section_2", + "text": "ELL Glossary by Benchmark Education" + } + ], + "content": "\n\nthe teaching of English to people who speak a different language and who live in a country where English is the main language spoken\n\n## Issues\n\nMonolinguist, English-only speakers often refer to people who don't speak English natively as \"ESL\" or say they are learning a \"second language\". More often than not, this is not true, as many people are multi-lingual with 3 or more languages\n\n## Impact\n\nIt makes false assumptions about English learners, centres English as the \"default\" or \"expected\" first language, ignoring that many people learn multiple (>3), non-English languages first.\n", + "basename": "english-as-second-language" + }, + "entitlement": { + "title": "Entitlement", + "slug": "entitlement", + "defined": false, + "content": "", + "basename": "entitlement" + }, + "equality": { + "title": "Equality", + "slug": "equality", + "defined": false, + "content": "", + "basename": "equality" + }, + "equity": { + "title": "Equity", + "slug": "equity", + "defined": false, + "content": "", + "basename": "equity" + }, + "ethnicity": { + "title": "Ethnicity", + "slug": "ethnicity", + "defined": false, + "content": "", + "basename": "ethnicity" + }, + "fat": { + "defined": false, + "title": "Fat", + "slug": "fat", + "sub_terms": [ + { + "text": "-phobia", + "full_title": "Fatphobia" + }, + { + "text": "Shaming", + "full_title": "Fat Shaming" + }, + { + "text": "Activism", + "full_title": "Fat Activism" + }, + { + "text": "Liberation", + "full_title": "Fat Liberation" + } + ], + "content": "\n", + "basename": "fat" + }, + "fatphobia": { + "title": "Fatphobia", + "slug": "fatphobia", + "defined": true, + "speech": "noun", + "skip_in_table_of_content": true, + "flag": { + "level": "warning", + "text": "content warning" + }, + "reading": [ + { + "text": "Sizeism and Fatphobia", + "href": "https://www.srhweek.ca/providers/people-and-communities/sizeism-and-fatphobia/" + }, + { + "text": "Anti-Oppression: Anti-Fatmisia", + "href": "https://simmons.libguides.com/anti-oppression/anti-fatmisia" + } + ], + "content": "\n\nthe fear, hatred, and stigmitasation of fat people.\n\n## Issues\n\nFatphobia is the racialised, classist, and ableist tool of oppression that codifies a “ideal” body type that centres a white, Western aesthetic, demands time and resources that people may not have, and attempts to correlate thinness and heathliness—perpetuating white supremacist violence against people of colour, perpetuates classist oppression of people living with limited resources, and the ableist idea of healthiness as an indicator of human value.\n\n## Impact\n\nA history of being ignored and shamed prevents many fat people from visiting medical professionals even if they have the financial and physical means to do so. Medical professionals hold fatphobic biases and often prescribe weight loss as a default instead of listening to their fat patients' concerns.\n\nEmployers will pay fat employees less than their thin colleagues and offer them no protection from weight stigma in the workplace, as their fatphobic biases lead to their perception of fat employees as lazy, less intelligent, and unmotivated.\n\nLaw enforcement officers are less likely to believe fat people reporting sexual assaults, as their fatphobic biases lead them to think of fat people as unattractive, not sexually active, or undesirable.\n\n## Note\n\nWhile fatphobia is a more widely known term, many prefer fatmisia, as [-misia] means hate or hatred of, which more accurately describes the prejudice and discrimination.\n", + "basename": "fatphobia" + }, + "fem": { + "title": "Fem", + "slug": "fem", + "defined": false, + "content": "", + "basename": "fem" + }, + "femme": { + "title": "Femme", + "slug": "femme", + "defined": false, + "content": "", + "basename": "femme" + }, + "food": { + "title": "Food", + "slug": "food", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "food" + }, + "gaslighting": { + "title": "Gaslighting", + "slug": "gaslighting", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "Tool of Oppression" + }, + "reading": [ + { + "text": "11 warnings signs of gaslighting", + "href": "https://www.psychologytoday.com/us/blog/here-there-and-everywhere/201701/11-warning-signs-gaslighting" + }, + { + "text": "Gaslighting examples", + "href": "https://www.aconsciousrethink.com/6766/gaslighting-examples/" + } + ], + "content": "\n\npsychological manipulation tactic used to abuse by instilling doubt in the victim's own thoughts, observations, feelings by denying, misdirecting, and lying to them; originated from the Gaslight play (1933) and film (1944), where a man changes the lights in the house, while denying her observations of the changes.\n\n## Impact\n\nGaslighting reinforces systems of power, as gaslighting abusers will tend to be in systematically dominant positions where they are intrinsically believed over their victim (e.g., white person over person of colour, man over woman, abled person over disabled person, parent over child, manager over worker, etc). Gaslighting is an abusive and oppressive behaviour and tactic.\n\nThe abuser can become in control of the victim, who now no longer trusts their own perception. The victim can become codependent upon their abuser, and internalise.\n", + "basename": "gaslighting" + }, + "gender-confirmation-surgery": { + "title": "Gender confirmation surgery (GCS)", + "slug": "gender-confirmation-surgery", + "defined": false, + "content": "", + "basename": "gender-confirmation-surgery" + }, + "gender-pronouns": { + "title": "Gender pronouns", + "slug": "gender-pronouns", + "defined": true, + "content": "\n\ngender pronouns are often used to mean [pronouns](/definitions/pronouns).\n\n## Issue\n\nNot everyone's gender has a relationship to the pronouns they use to identify themselves. Some people are agender or gender non-conforming and still use pronouns.\n\nReiterating \"gender pronouns\" enforces the idea that there is necessarily a relationship between the two, and furthermore, it can suggest that if there isn't a relationship between the two, that it is not a valid use of pronouns.\n\n## Impact\n\nBy connecting gender and perpetuating unnecessary gender norms and expectations, we are perpetuating violence against gender minoritised people. Using this language perpetuates those systems and language of harm, regardless of our intent.\n", + "basename": "gender-pronouns" + }, + "gender": { + "title": "Gender", + "slug": "gender", + "defined": false, + "sub_terms": [ + { + "text": "Cis-", + "full_title": "Cisgender" + }, + { + "text": "-Fluid", + "full_title": "Gender-Fluid" + }, + { + "text": "Non-Conforming", + "full_title": "Gender Non-Conforming" + }, + { + "text": "Trans", + "full_title": "transgender" + }, + { + "text": "-Queer", + "full_title": "Gender-Queer" + } + ], + "content": "\n", + "basename": "gender" + }, + "genderqueer": { + "title": "genderqueer", + "slug": "genderqueer", + "defined": false, + "content": "", + "basename": "genderqueer" + }, + "genocide": { + "title": "Genocide", + "slug": "genocide", + "defined": false, + "content": "", + "basename": "genocide" + }, + "governmentality": { + "title": "Governmentality", + "slug": "governmentality", + "defined": false, + "content": "", + "basename": "governmentality" + }, + "gray-ace": { + "title": "gray ace", + "slug": "gray-ace", + "defined": false, + "content": "", + "basename": "gray-ace" + }, + "gray-asexuality": { + "title": "Gray asexuality", + "slug": "gray-asexuality", + "defined": false, + "content": "", + "basename": "gray-asexuality" + }, + "hard-of-hearing": { + "title": "Hard of Hearing (HOH)", + "slug": "hard-of-hearing", + "defined": false, + "content": "", + "basename": "hard-of-hearing" + }, + "hegemonic": { + "title": "hegemonic", + "slug": "hegemonic", + "defined": false, + "content": "", + "basename": "hegemonic" + }, + "hermaphrodite": { + "title": "Hermaphrodite", + "slug": "hermaphrodite", + "defined": false, + "sub_terms": [ + { + "text": "pseudo, male and female", + "full_title": "Hermaprhodite pseudo, male and female" + } + ], + "content": "\n", + "basename": "hermaphrodite" + }, + "high-functioning": { + "title": "High-Functioning", + "slug": "high-functioning", + "defined": false, + "content": "", + "basename": "high-functioning" + }, + "hijab": { + "title": "Hijab", + "slug": "hijab", + "defined": false, + "content": "", + "basename": "hijab" + }, + "hispanic": { + "title": "Hispanic", + "slug": "hispanic", + "defined": true, + "reading": [ + { + "text": "Remezcla: Hispanic vs. Latino vs. Latinx: A Brief History of How These Words Originated", + "href": "https://remezcla.com/features/culture/latino-vs-hispanic-vs-latinx-how-these-words-originated/" + } + ], + "content": "\n\nServes as an umbrella term for people of Spanish, or Spanish-speaking ancestry. Hispanic is considered a pan-ethnic term, and does not provide context for someone's race or country of origin.\n\n#### Note\n\nPeople who self-identify as Hispanic may also self-identify as Chicano/Chicana, [Latino/Latina](/definitions/latino), or [Latinx](/definitions/latinx), but don't assume that they do. When in doubt, ask for individual preferences.\n", + "basename": "hispanic" + }, + "homophobia": { + "title": "Homophobia", + "slug": "homophobia", + "defined": false, + "content": "", + "basename": "homophobia" + }, + "hormone-replacement-therapy": { + "title": "Hormone Replacement Therapy (HRT)", + "slug": "hormone-replacement-therapy", + "defined": false, + "content": "", + "basename": "hormone-replacement-therapy" + }, + "human-immunodeficiency-virus": { + "title": "Human Immunodeficiency Virus (HIV)", + "slug": "human-immunodeficiency-virus", + "defined": false, + "content": "", + "basename": "human-immunodeficiency-virus" + }, + "hysterical": { + "title": "hysterical", + "slug": "hysterical", + "defined": true, + "speech": "adjective", + "flag": { + "level": "avoid", + "text": "sexist" + }, + "reading": [ + { + "text": "Etymoline", + "href": "https://www.etymonline.com/word/hysterical" + }, + { + "text": "On the sexist etimology of “hysteria,” and what academia did about it", + "href": "https://medium.com/@peacelovetrig/on-the-sexist-etimology-of-hysteria-and-what-academia-did-about-it-ef98815ddb6c" + }, + { + "text": "Hysteria, Is the Medical Condition Mental, Physical, or Made Up?", + "href": "https://www.newsweek.com/hysteria-medical-condition-mental-physical-or-made-66277" + } + ], + "content": "\n\nfeeling or showing uncontrollable outburst of emotion; casually: very funny\n\n## Issues\n\nHysteria originates from the Greek word _hysterikos_ or \"of the womb.\" The Greeks believed that hysteria was something that moved through a woman's body and caused ailments.\n\nHysteria was once an official medical condition that was primarily diagnosed in women. (It has since been disbanded into other disorders, such as conversion and disassociative disorders.) So, as medical professionals believed men did not have uteruses\\*, medical professionals would not diagnose men with hysteria (even though they were experiencing the same symptoms of conversion disorder).\n\n\\*Editor's Note: This concept that men cannot have uteruses is reflective of the medical context, not the belief of the editor.\n\n## Impact\n\nGender-codified and sexist language perpetuates harmful stereotypes that reinforce patriarchical ideas. In the case of hysteria, it perpetuates the false stereotype of women as being unreasonable, irrational, and not in control of their emotions. Harmful stereotypes can cause women to not be believed, to have their experiences invalidated, and be tone-policed.\n\nDefining gender by sexual organs can also perpetuate transphobic and anti-trans definitions, where gender is falsely defined by sexual organs.\n\nMedical conditions believed to be defined by sex and gender are reductive and can lead to misdiagnosis.\n\n## Alt Words\n\nIf intending **funny** connotation, try: funny; hilarious; comedic.\n\nIf intending **panic** connotation, try: panicked, petrified, startled.\n", + "basename": "hysterical" + }, + "idiot": { + "title": "Idiot", + "slug": "idiot", + "defined": false, + "flag": { + "level": "avoid", + "text": "Ableist language" + }, + "content": "\n", + "basename": "idiot" + }, + "illness": { + "title": "Illness", + "slug": "illness", + "defined": false, + "sub_terms": [ + { + "text": "Chronic", + "full_title": "Chronic Illness" + } + ], + "content": "\n", + "basename": "illness" + }, + "immigrant": { + "title": "Immigrant", + "slug": "immigrant", + "defined": false, + "content": "", + "basename": "immigrant" + }, + "impact": { + "title": "Impact", + "slug": "impact", + "defined": false, + "content": "", + "basename": "impact" + }, + "implicit-bias": { + "title": "Implicit bias", + "slug": "implicit-bias", + "defined": false, + "content": "", + "basename": "implicit-bias" + }, + "indigenous": { + "title": "Indigenous", + "slug": "indigenous", + "defined": false, + "content": "", + "basename": "indigenous" + }, + "inherent": { + "title": "Inherent", + "slug": "inherent", + "defined": false, + "content": "", + "basename": "inherent" + }, + "insane": { + "title": "Insane", + "slug": "insane", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist language" + }, + "content": "", + "basename": "insane" + }, + "intent": { + "title": "Intent", + "slug": "intent", + "defined": false, + "content": "", + "basename": "intent" + }, + "internalized-oppression": { + "title": "internalized oppression", + "slug": "internalized-oppression", + "defined": false, + "content": "", + "basename": "internalized-oppression" + }, + "intersectionality": { + "title": "Intersectionality", + "slug": "intersectionality", + "defined": false, + "content": "\n", + "basename": "intersectionality" + }, + "intersex": { + "title": "intersex", + "slug": "intersex", + "defined": false, + "content": "", + "basename": "intersex" + }, + "invisible-disabilities": { + "title": "invisible disabilities", + "slug": "invisible-disabilities", + "defined": false, + "content": "", + "basename": "invisible-disabilities" + }, + "jihad": { + "title": "Jihad", + "slug": "jihad", + "defined": false, + "content": "", + "basename": "jihad" + }, + "lame": { + "title": "Lame", + "slug": "lame", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "lame" + }, + "latino": { + "title": "Latin American/Latino/Latina", + "slug": "latino", + "defined": true, + "reading": [ + { + "text": "Remezcla: Hispanic vs. Latino vs. Latinx: A Brief History of How These Words Originated", + "href": "https://remezcla.com/features/culture/latino-vs-hispanic-vs-latinx-how-these-words-originated/" + } + ], + "content": "\n\nServes as an umbrella term for people of Latin American ancestry. Latino (and Latina) are inherently gendered terms due to Spanish's gendered language. Latino is considered a pan-ethnic term that does not provide context for someone's language, country of origin, or race.\n\nAlso can be written in gender neutral forms of [Latinx](/definitions/latinx), or Latin@s. When in doubt, default to Latino, and ask individual parties their preference, if possible.\n\n#### Note\n\nPeople who self-identify as Latin American or Latino/Latina may also self-identify as Chicano/Chicana, [Hispanic](/definitions/hispanic), or [Latinx](/definitions/latinx).\n", + "basename": "latino" + }, + "latinx": { + "title": "Latinx", + "slug": "latinx", + "defined": true, + "reading": [ + { + "text": "Remezcla: Hispanic vs. Latino vs. Latinx: A Brief History of How These Words Originated", + "href": "https://remezcla.com/features/culture/latino-vs-hispanic-vs-latinx-how-these-words-originated/" + }, + { + "text": "Latino, Latinx, Latine. The grammatical gender neutral in Spanish", + "href": "https://medium.com/@puentera/latino-latinx-latine-a3b19e0dbc1c" + } + ], + "content": "\n\nLatinx arose as a gender-neutral alternative to the gendered [Latino/Latina](/definitions/latino) in the United States.\n\nThis is a term that is seeing expanded usage and evolution among academic circles. Latinx is considered a pan-ethnic term that does not provide context for someone's language, country of origin, or race.\n\n#### Note\n\nPeople who self-identify as Latinx may also self-identify as Chicano/Chicana, [Hispanic](/definitions/hispanic), or [Latin American](/definitions/latino)\n", + "basename": "latinx" + }, + "lunatic": { + "title": "Lunatic", + "slug": "lunatic", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "lunatic" + }, + "maniac": { + "title": "Maniac", + "slug": "maniac", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist language" + }, + "content": "\n", + "basename": "maniac" + }, + "mansplain": { + "title": "Mansplain", + "slug": "mansplain", + "speech": "verb", + "defined": true, + "reading": [ + { + "text": "Rebecca Solnit's 'Men Explain Things to Me' (2008)", + "href": "https://www.guernicamag.com/rebecca-solnit-men-explain-things-to-me/" + }, + { + "text": "Kim Goodwin's 'Am I mansplaining? graphic", + "href": "https://ichef.bbci.co.uk/wwfeatures/live/1600_900/images/live/p0/6f/zj/p06fzjxg.jpg" + } + ], + "content": "\n\nthe act of explaining (usually by a man) something without asking consent to do so, often to someone who already knows and/or after someone else has already explained it (usually a woman or femme person)\n\n## Issues\n\nMansplaining places men (usually without authority) in a position of default authority, and places women and gender minoritised people with authority in a position of default subordination, which reinforces the power differential in men's favour.\n\nMansplaining occupies real time in meetings, leading to men gaining more air time and exposure, despite the stereotype that women speak more.[1](https://slate.com/human-interest/2013/02/do-women-talk-more-the-answer-is-no-but-the-belief-persists-despite-the-evidence.html)\n\n## Impact\n\nMansplaining can reinforce toxic masculinity and rape culture, as it fundamentally is about disbelieving women and gender-minoritised individuals.\n\nMansplaining contributes to the invalidation and disbelief of any women and gender-minoritised individuals and their credentials. The disbelief and intrinsic questioning of women and gender-minoritised individual especially reinforces systemic bias and injustice against them.\n\nSomeone who is repeatedly mansplained can be perceived as lacking credentials or knowledge they very well may have, which can lead to missed career opportunities or systematic exclusion from leadership, for example.\n\nExamples include but aren't limited to: a man explaining to a woman how to pronounce her own name, explaining menstruation, or explaining the history of a country with which the woman is associated but the man has never been to. \n\n## Considerations\n\nA good way to check if you're mansplaining is to ask yourself whether:\n\n(1) the person explicitly asked for the explanation\n\n(2) you are assuming incompetence because of the person's gender, race, ability, etc, and,\n\n(3) how your systematic and individual bias, particularly gender bias in this context, affects your interpretation of (1) and (2)\n", + "basename": "mansplain" + }, + "marginalized": { + "title": "Marginalized", + "slug": "marginalized", + "defined": false, + "content": "", + "basename": "marginalized" + }, + "master-slave": { + "title": "Master Slave", + "slug": "master-slave", + "defined": true, + "speech": "noun", + "alt_words": [ + "Agency & Operatives", + "Leader & Follower", + "Main & Secondary", + "Parent & Child, Helpers, or Workers", + "Primary & Replica", + "Primary & Secondary", + "Trunk & Branch" + ], + "reading": [ + { + "text": "Rename Your Git Branch From Master To Main", + "href": "https://www.hanselman.com/blog/EasilyRenameYourGitDefaultBranchFromMasterToMain.aspx" + } + ], + "content": "\n\nA model of asymmetric communication or control where one device or process have total control over other components or are controlled by a component.\n\n## Issues\n\nMaster/slave terminology is problematic because it serves as a reminder that slavery was and continues to be a globally institutionalised practice. Yet, this type of offensive language is still used casually in many programming languages.\n\n## Impact\n\nThe outdated \"master/slave\" convention has strong associations with slavery which is exclusionary to members of our community who may continue to live with the negative impacts of slavery. It also demonstrates how pervasive and casual racism is throughout our culture and language.\n\n## Usage Tip\n\nSeek to change any existing \"master/slave\" terminology to one of the suggested terms, as there are many alternative terminologies to describe the relationship between two components, many of which are much more specific. Avoid creating new projects with this terminology.\n\nEven if you may not be negatively impacted by this terminology, it can negatively impact other existing and prospective contributors onto your project. The terminology isn't so unique that it's irreplaceable; the lift tends to be trivial in comparison to the potential impact.\n", + "basename": "master-slave" + }, + "matriarchy": { + "title": "Matriarchy", + "slug": "matriarchy", + "defined": false, + "content": "", + "basename": "matriarchy" + }, + "medication-sensitive": { + "title": "Medication sensitive", + "slug": "medication-sensitive", + "defined": false, + "content": "", + "basename": "medication-sensitive" + }, + "metis": { + "title": "Métis", + "slug": "metis", + "speech": "noun", + "defined": true, + "content": "\n\nA distinct Indigenous culture originating from the children of intermarriages between First Nationspersons and European Settlers (most often French). The homeland of the Métis is considered the Canadian Prairies with the Red River Settlement being the most well known.\n", + "basename": "metis" + }, + "midget": { + "title": "Midget", + "slug": "midget", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "midget" + }, + "militarisation": { + "title": "Militarisation", + "slug": "militarisation", + "defined": false, + "content": "", + "basename": "militarisation" + }, + "minorities": { + "title": "minorities", + "slug": "minorities", + "flag": { + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "minoritised", + "or omit" + ], + "content": "\n\nthe smaller in number of two groups constituting a whole\n\n## Issues\n\nMinorities is not always accurate and is vague. As it deals with numbers, the term minorities can often be inaccurate, as is the case when speaking of communities of colour, who often outnumber white communities.\n\nBy referring to a group as 'minorities,' it can suggest the group hasn't taken initiative to show up, thereby blaming the oppressed for systemic issues that prevent their participation.\n\n## Impact\n\nBy repeatedly referring to groups as \"minorities,\" they are being infantised to their numerical representation and made to feel minor. The vagueness also abstracts the identify of the marginalised group, making it difficult to address why they are minoritised to begin with.\n\n## Read also\n\n- [minoritised](/definitions/minoritised)\n- [overrepresented majority](/definitions/overrepresented-majority)\n- [underrepresented majority](/definitions/underrepresented-minority)\n", + "basename": "minorities" + }, + "minoritised": { + "title": "minoritised", + "slug": "minoritised", + "defined": true, + "speech": "adj", + "flag": { + "level": "better-alternative", + "alt-for": "minorities" + }, + "reading": [ + { + "text": "Minority vs minoritize", + "href": "https://www.theodysseyonline.com/minority-vs-minoritize" + } + ], + "content": "\n\ngroups resulting from social constructs have been granted less power or representation compared to other members or groups in society\n\n## Preferable To\n\n[minorities](/definitions/minorities)\n\n## Benefits\n\nMinoritised places the emphasis on the power struggle, and on the systemic issues at play. It's also an adjective, which requires you to add \"group\" or \"people\" so it's people-first language.\n\n## Impact\n\nIt removes the pejorative nature of \"minorities\", illuminating that this is an effect upon the individual or group, rather than the singular way to identify the group.\n\n## Read also\n\n- [minorities](/definitions/minorities)\n- [overrepresented majority](/definitions/overrepresented-majority)\n- [underrepresented majority](/definitions/underrepresented-minority)\n", + "basename": "minoritised" + }, + "misogynoir": { + "title": "Misogynoir", + "slug": "misogynoir", + "defined": false, + "content": "", + "basename": "misogynoir" + }, + "monoculture": { + "title": "Monoculture", + "slug": "monoculture", + "defined": true, + "speech": "noun", + "content": "\n\nstate of culture in which there is a relevant lack of diversity in cultural objects produced, both by organizations and audiences.\n", + "basename": "monoculture" + }, + "moron": { + "title": "Moron", + "slug": "moron", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "content": "\n", + "basename": "moron" + }, + "n-word": { + "title": "N-word", + "slug": "n-word", + "defined": false, + "flag": { + "level": "avoid", + "text": "racist slur" + }, + "content": "\n", + "basename": "n-word" + }, + "neopronouns": { + "title": "neopronouns", + "slug": "neopronouns", + "defined": true, + "speech": "noun", + "reading": [ + { + "text": "LGBTA Wiki: Neopronouns", + "link": "https://lgbta.wikia.org/wiki/Neopronouns" + } + ], + "content": "\n\na set of words that go alongside traditional third-person pronouns (he/she/singular they) such as ze/zir, ze/hir, xe/xem, and plural they.\n\n## Note\n\nSome people find using neopronouns helpful to disrupting the gender binary, as traditional pronouns he and she usually carry connotations of male/masculine and female/feminine and they can carry connotations of being non-binary. Neopronouns are not recognised \"officially\" in the English language and tend to be less known as a result of their newness and lack of institutional support.\n", + "basename": "neopronouns" + }, + "neurodivergent": { + "title": "Neurodivergent", + "slug": "neurodivergent", + "defined": false, + "content": "", + "basename": "neurodivergent" + }, + "neurodiverse": { + "title": "Neurodiverse", + "slug": "neurodiverse", + "defined": false, + "content": "", + "basename": "neurodiverse" + }, + "neurotypical": { + "title": "Neurotypical", + "slug": "neurotypical", + "defined": false, + "content": "", + "basename": "neurotypical" + }, + "non-binary": { + "title": "Non-binary", + "slug": "non-binary", + "speech": "adj", + "defined": true, + "content": "\n\nof, relating to, or characterised by being any gender that does not fit into the male-female gender binary; an umbrella term.\n\nFor example, a non-binary person may have some gender between male and female, have multiple genders, no gender, a culturally-specific gender (e.g., two-spirit).\n\n## Note\n\nNon-binary people may or may not also identify as [transgender](/definitions/transgender).\n\nAlthough non-binary is commonly used as an umbrella term, just because someone identifies as a term under the umbrella, does not necessarily imply that they identify as non-binary as well. For example, someone may be agender, but not identify with the term \"non-binary\".\n", + "basename": "non-binary" + }, + "not-safe-for-work": { + "title": "Not Safe For Work (NSFW)", + "slug": "not-safe-for-work", + "defined": false, + "flag": { + "level": "avoid", + "text": "anti-sex work" + }, + "content": "", + "basename": "not-safe-for-work" + }, + "nudity": { + "title": "Nudity", + "slug": "nudity", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "nudity" + }, + "nuts": { + "title": "nuts", + "slug": "nuts", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist language" + }, + "content": "\n", + "basename": "nuts" + }, + "obese": { + "title": "Obese", + "slug": "obese", + "defined": false, + "flag": { + "level": "avoid", + "text": "anti-fat language" + }, + "content": "\n", + "basename": "obese" + }, + "obsessive-compulsive-disorder": { + "title": "Obsessive Compulsive Disorder (OCD)", + "slug": "obsessive-compulsive-disorder", + "flag": { + "level": "avoid", + "text": "Medical Appropriation" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "conscientious", + "exact", + "fastidious", + "fussy", + "meticulous", + "nitpicky", + "particular", + "precise", + "quirky", + "thorough" + ], + "content": "\n\na mental illness usually embodied by unwanted repeated thoughts (obsession) coupled with repeated behaviour, routine, or action (compulsion)\n\n## Issues\n\nOCD is commonly misused to highlight personality quirks or fussiness, usually involving a preference for order or cleanliness. Use of 'OCD' as a noun or adjective in this manner diminishes the actual condition, resulting in reductive and over-normalised perception of a someone with these specific mental or psychiatric disabilities.\n\n## Impact\n\nBy conflating arbitrary quirks or behaviours with OCD, we are invalidating OCD as a medical condition and the people who experience it. Generally by using medically appropriative language, we are invalidating the existences of people with OCD, minimising their experiences, perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling. In this case, be particularly aware if the behaviour is actually unwanted or uncontrollable.\n", + "basename": "obsessive-compulsive-disorder" + }, + "ok-hand": { + "title": "👌 [ok-hand]", + "slug": "ok-hand", + "flag": { + "text": "Racist Symbol", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "👍", + "🆗", + "good", + "okay", + "or omit" + ], + "content": "\n\nhand gesture where right thumb and right index finger form a circle, remaining fingers fan out; in American Sign Language, gesture means number nine; in diving, gesture indicates “OK” as question or confirmation; gesture is used in an innocuous children's game called “[The Circle Game](https://www.vice.com/en_uk/article/wj8e74/searching-for-the-man-behind-the-circle-game),” where the gesture is held low—if another child looks at it, they get punched.\n\nIn 2017, the hand gesture was [appropriated by White Supremacists on 4chan](https://knowyourmeme.com/memes/ok-symbol-%F0%9F%91%8C) to mean White Power (the three fingers forming at 'W' and thumb and index forming the circle of the 'P'). It was framed as a hoax to \"own\" Leftists through trickery and [gaslighting](/definitions/gaslighting).\n\nThe hand gesture has been used by White Supremacists as a dogwhistle to identify other White Supremacists [at rallies](https://mashable.com/article/milo-yiannopoulos-banned-from-furry-convention/), [in forums](https://www.splcenter.org/hatewatch/2018/09/18/ok-sign-white-power-symbol-or-just-right-wing-troll), and even [at court hearings](https://nypost.com/2019/03/15/suspected-new-zealand-shooter-appears-in-court/). In 2019, the hand gesture was added to the [Anti-Defamation League's list of official symbols of hate](https://www.adl.org/news/press-releases/ok-and-other-alt-right-memes-and-slogans-added-to-adls-hate-symbols-database).\n\n## Issues\n\nWhile it can be argued that the symbol's origins and many of its uses do not imply racist connotations, and that the 4chan-ers \"framed it as a hoax,\" it is undeniable that the symbol has evolved and become a gesture used sincerely by white supremacists.\n\nThe uncertainty created by the 4chan-ers is a critical part of their strategy. The strategy employs plausible deniability: Because they self-identified it as a hoax, they can fall back on that explanation. Meanwhile, if people begin to adapt the symbol, as they did, it becomes a dogwhistle for White Supremacists. It should be noted that this approach of indoctrinating symbols of hate is one long-documented, and [used for the Swastika as well](https://theconversation.com/how-nazis-twisted-the-swastika-into-a-symbol-of-hate-83020).\n\n## Impact\n\nThe people most vulnerable to the oppressive impact of White Supremacy will never know for certain if the symbol is being used in one of its non-violent manners or if it's being used in its racist violent manners. The oppressed must choose the option that protects them, which is typically erring on the side of caution.\n\nContinuing to use the symbol with its non-hateful connotations to \"take it back,\" does not eliminate its pervasive new meaning associated with White Supremacy. Instead, continuing usage only perpetuates emotional and psychological harm upon the most vulnerable and susceptible populations.\n\n## Other Languages\n\n[Français](/definitions/fr_FR/signe-ok)\n", + "basename": "ok-hand" + }, + "oppression": { + "title": "Oppression", + "slug": "oppression", + "defined": false, + "sub_terms": [ + { + "text": "Iternalised", + "full_title": "Internalised Oppression" + } + ], + "content": "\n", + "basename": "oppression" + }, + "optical-allyship": { + "title": "optical allyship", + "slug": "optical-allyship", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "White Supremacy Tool" + }, + "reading": [ + { + "text": "We are not interested in Optical Allyship (origin)", + "href": "https://www.instagram.com/p/BiPDZkbFJFY/?hl=en" + }, + { + "text": "If You Want To Be Anti-Racist, This Non-Optical Allyship Guide Is Required Reading", + "href": "https://www.vogue.co.uk/arts-and-lifestyle/article/non-optical-ally-guide" + }, + { + "text": "What Is Optical Allyship? 3 Ways To Be Actively Anti-Racist", + "href": "https://www.bustle.com/p/what-is-optical-allyship-3-ways-to-be-actively-anti-racist-22956518" + }, + { + "text": "What is optical allyship? Ways you can support the BLM movement apart from spreading hashtags", + "href": "https://www.msn.com/en-ca/news/politics/what-is-optical-allyship-ways-you-can-support-the-blm-movement-apart-from-spreading-hashtags/ar-BB15cJgz" + } + ], + "content": "\n\na form of allyship.\n\nwhen an individual or group of power/majority/privilege (e.g., white, male, abled, unqueer, etc) creates a public display in the name of 'allyship,' serving only themselves and not the group they claim to support, often to receive praise and attention, without taking critical action to dismantle the systems of harm.\n\n> allyship that only serves at the surface level to platform the 'ally,' it makes a statement but doesn’t go beneath the surface and is not aimed at breaking away from the systems of power that oppress.\n\n## Related Words\n\nperformative allyship, corporate blackface, non-optical allyship\n\n## Impact\n\nOptical allyship detracts from the stories of the oppressed and the impact that oppression has on them in favour of the stories of the oppressors and their intent to help. Optical allyship centres the perspectives of the oppressor. The cost of optical allyship can also be that the stories of the oppressed people are appropriated, watered down, and inaccurately retold by people who should not be telling those stories. For example, in #BlackOutTuesday, many rushed to publicly respond without understanding the intent which \"derailed the conversation.\"\n", + "basename": "optical-allyship" + }, + "oriental": { + "title": "Oriental", + "slug": "oriental", + "defined": true, + "flag": { + "text": "racist term", + "level": "avoid" + }, + "speech": "noun or adj.", + "alt_words": [ + "Asian or Asian-American when you're uncertain. However, when possible, be as specific as possible. If you know or can ask someone's ethnicity, it's better to be specific such as Korean-Canadian or Vietnamese-American." + ], + "reading": [ + { + "text": "ThoughtCo: Avoid these five racial terms", + "href": "https://www.thoughtco.com/avoid-these-five-racial-terms-2834959" + }, + { + "text": "'Oriental': Rugs, Not People", + "href": "https://www.npr.org/templates/story/story.php?storyId=112465167?storyId=112465167" + } + ], + "content": "\n\n## Issues\n\nThe word Oriental is rooted in the concept of Orientalism, which is strongly articulated by Edward Said in eponymous book, _Orientalism_. In his book, Said illustrates the Orient as being the observed \"other\" or \"foreigner,\" whereas the Occident (or the West) is centred as the default. All Eastern culture is prescribed through this imperialist, pejorative lens, where it is deemed as strange, exotic, dirty, effeminate, and weak. By presenting Eastern culture through this lens, Western culture may present set itself up for dominance through cultural hegemony and colonisation.\n\nCalling someone Oriental reinforces those hegemonic ideas even if you're unaware of its historical context.\n\n## Impact\n\nBy continuing use of this term, we are perpetuating anti-Asian sentiments and the centralisation of Western (i.e., Occidental) imperialism. Diverse Asian people, nations, and cultures are flattened into one caricature of itself, which is dehumanising.\n", + "basename": "oriental" + }, + "other-specified-feeding-or-eating-disorders": { + "title": "Other specified feeding or eating disorders (OSFED)", + "slug": "other-specified-feeding-or-eating-disorders", + "defined": false, + "content": "", + "basename": "other-specified-feeding-or-eating-disorders" + }, + "overrepresented-majority": { + "title": "overrepresented majority (ORM)", + "slug": "overrepresented-majority", + "defined": true, + "speech": "noun", + "flag": { + "level": "better-alternative", + "alt-for": "underrepresented minority (URM)" + }, + "reading": [ + { + "text": "Minority vs minoritize", + "href": "https://www.theodysseyonline.com/minority-vs-minoritize" + } + ], + "content": "\n\ngroup resulting from social constructs have grant less power or representation compared to other members or groups in society; acts as a contrast to underrepresented minority (URM)\n\n## Usage\n\nWhen using any term for a group, it's important to contextualise it into people. So, for example, \"people from the overrepresented majority are less likely to be affected by this change\" over \"the overrepresented majority are less likely to be affected by this change.\"\n\nAs the underrepresented minority (URM) is the more commonly used term, it has an impact of focusing issues on that that group, which often can imply and place the burden of fixing the problem is onto that group. Underrepresented can imply that the group can do more to represent themselves.\n\nMeanwhile, the overrepresented majority is usually the group that possesses the power to influence which groups are majoritised (and subsequently receive power) and which groups are minoritised. It renders this power dynamic invisible.\n\n## Preferable To\n\n[minorities](/definitions/minorities)\n[underrepresented minorities](/definitions/underrepresented-minorities)\n\n## Benefits\n\nNaming the overrepresented majority allows us to discuss the power dynamic involved, and places emphasis on the fact that it's not about minoritised groups being _underrepresented_, but that it is also about majoritised groups being _overrepresented_.\n\nIt also allows prevents the false dichotomy where everyone is either \"default/unnamed\" or from an underrepresented minority. Without it, people from underrepresented minorities are forced to carry a label when people from overrepresented majorities are not.\n\n## Impact\n\nThe term overrepresented majority allows us to discuss the holistic systems and all of the players involved.\n\n## Read also\n\n- [minorities](/definitions/minorities)\n- [minoritised](/definitions/minoritised)\n- [underrepresented majority](/definitions/underrepresented-minority)\n", + "basename": "overrepresented-majority" + }, + "panic-attacks": { + "title": "Panic attacks", + "slug": "panic-attacks", + "defined": false, + "content": "", + "basename": "panic-attacks" + }, + "pansexual": { + "title": "Pansexual", + "slug": "pansexual", + "speech": "adj", + "defined": true, + "reading": [ + { + "text": "Pansexuality and Being Pansexual: Everything You Need to Know", + "href": "https://www.teenvogue.com/story/what-is-pansexuality" + } + ], + "content": "\n\nsomeone who is sexually attracted to people regardless of their gender, or to people of any gender.\n", + "basename": "pansexual" + }, + "parachuting": { + "title": "Parachuting", + "slug": "parachuting", + "defined": false, + "content": "", + "basename": "parachuting" + }, + "patriarchy": { + "title": "Patriarchy", + "slug": "patriarchy", + "defined": false, + "content": "", + "basename": "patriarchy" + }, + "peanut-gallery": { + "title": "peanut gallery", + "slug": "peanut-gallery", + "flag": { + "level": "avoid", + "text": "Racist Term" + }, + "defined": true, + "speech": "noun", + "reading": [ + { + "text": "Words and Phrases That Sting: \"Peanut Gallery\" and \"Sold Down the River\"", + "href": "http://www.theinclusionsolution.me/author/maryfwinters/" + }, + { + "text": "11 racist and offensive phrases that people still use all the time", + "href": "https://www.businessinsider.com/offensive-phrases-that-people-still-use-2013-11" + } + ], + "alt_words": [ + "disrupters", + "hecklers" + ], + "content": "\n\na group of people who are giving unsolicited (and unvalued) advice. Before microphones and opera glasses were common, balcony seats were the least desireable in Vaudeville theaters and were typically where Black people sat. The term \"peanut gallery\" became a nickname for these seats, in part due to the peanuts being served at the theatre that were rumored to be thrown at the performers on stage to convey patrons' disapproval.\n\n## Issues\n\nThe term perpetuates and reinforces the historic silencing of Black voices and speaking of them in a pejorative nature. Phrases such as \"no comments from the peanut gallery\" or \"quiet in the peanut gallery\" are extensions of the name.\n\n## Impact\n\nThe phrase implies that the opinions expressed by those from the gallery were unsolicited, unwarranted and unhelpful, which then perpetrates that Black people's critiques are irrelevant or insignificant. This is particularly problematic when they are critiquing oppressive systems and their oppressors. Using such terms perpetuate the imbalance of power and the delegitimisation of their critiques.\n\nBy continuing the use of the term, rooted in its subordination to white power structures, regardless of whether we intend to carry its racist origins or not, we are contributing to the perpetuating of harm against Black people and their voices. Seemingly small actions like this contribute to the normalisation of the harm.\n\nDenying the etymology or power of the word as irrelevant is denying the history of its strength: \"Peanut gallery\" has been used to dehumanise Black people and their voices, which leads to justify oppressing them or denying their rights.\n\n## Usage Tip\n\nConsider context and the power you possess in an interaction. The term becomes even worse if you are using it in reference to a group of Black people and you are non-Black. You are carrying the historical power you have in your usage.\n", + "basename": "peanut-gallery" + }, + "pedophilia": { + "title": "pedophilia", + "slug": "pedophilia", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "pedophilia" + }, + "people-of-color": { + "title": "People of Color (PoC)", + "slug": "people-of-color", + "defined": false, + "content": "", + "basename": "people-of-color" + }, + "people-with-disabilities": { + "title": "People with disabilities", + "slug": "people-with-disabilities", + "defined": false, + "content": "", + "basename": "people-with-disabilities" + }, + "performative-allyship": { + "title": "performative allyship", + "slug": "performative-allyship", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "White Supremacy Tool" + }, + "reading": [ + { + "text": "Are you practicing performative allyship?", + "href": "http://affinitymagazine.us/2017/07/09/are-you-practicing-performative-allyship/" + }, + { + "text": "Is This Your Queen? Ellen Pompeo, Growth and Performative White Allyship", + "href": "https://www.theroot.com/is-this-your-queen-ellen-pompeo-growth-and-performati-1830593400" + }, + { + "text": "Performative allyship: what it is, what it looks like, and why we want to avoid it.", + "href": "https://www.scarymommy.com/performative-allyship-what-it-is-what-it-looks-like-and-why-we-want-to-avoid-it/" + } + ], + "content": "\n\nwhen an individual or group of power/majority/privilege (e.g., white, male, abled, unqueer, etc) loudly profess(es) their actions in the name of 'allyship,' while actively conducting harm to, taking focus away from, and generally being unhelpful towards the group they claim to support, often to receive praise and attention, without taking critical action to dismantle the systems of harm.\n\n## Impact\n\nPerformative allyship detracts from the stories of the oppressed and the impact that oppression has on them in favour of the stories of the oppressors and their intent to help. The cost of performative allyship can also be that the stories of the oppressed people are appropriated, watered down, and inaccurately retold by people who should not be telling those stories.\n", + "basename": "performative-allyship" + }, + "platonic": { + "title": "Platonic", + "slug": "platonic", + "defined": false, + "sub_terms": [ + { + "text": "Queer", + "full_title": "Queer Platonic" + } + ], + "content": "\n", + "basename": "platonic" + }, + "plural": { + "title": "Plural", + "slug": "plural", + "speech": "noun", + "defined": true, + "content": "\n\nDenoting more than one entity living in a host body.\n\n## Read also\n\n- [dissociative identity disorder](/definitions/dissociative-identity-disorder)\n", + "basename": "plural" + }, + "police-brutality": { + "title": "police brutality", + "slug": "police-brutality", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "police-brutality" + }, + "polyamory": { + "title": "Polyamory", + "slug": "polyamory", + "speech": "noun", + "defined": true, + "reading": [ + { + "text": "My definition of polyamory", + "href": "https://avris.it/blog/my-definition-of-polyamory" + }, + { + "text": "Poly Glossary", + "href": "https://www.polymatchmaker.com/main.mvc?Screen=HTML&Page=polyglossary" + }, + { + "text": "http://polyliving.net/", + "href": "http://polyliving.net/" + } + ], + "content": "\n\nbelief that romantic and/or sexual exclusivity is not necessary for a happy, committed relationship; an umbrella term for various types of relationships (coded as romantic or quasi-romantic, sexual or non-sexual) where all partners involved consent to ethical non-monogamy, such as polycules, throuples, group marriages, etc.\n\n## Note\n\nOne can be polyamorous despite currently being single or in a monogamous relationship.\n", + "basename": "polyamory" + }, + "positivism": { + "title": "Positivism", + "slug": "positivism", + "defined": false, + "content": "", + "basename": "positivism" + }, + "post-traumatic-stress-disorder": { + "title": "Post-Traumatic Stress Disorder (PTSD)", + "slug": "post-traumatic-stress-disorder", + "defined": false, + "content": "", + "basename": "post-traumatic-stress-disorder" + }, + "pow-wow": { + "title": "pow-wow", + "slug": "pow-wow", + "defined": true, + "speech": "noun or verb", + "flag": { + "level": "avoid", + "text": "cultural appropriation" + }, + "alt-words": [ + "brainstorm/brainstorming session", + "gather/gathering", + "get together", + "meet/meeting", + "whiteboard/whiteboarding session", + "work/working session" + ], + "reading": [ + { + "text": "Use these culturally offensive phrases, questions at your own risk", + "href": "https://www.ictinc.ca/blog/culturally-offensive-phrases-you-should-use-at" + }, + { + "text": "Vice: How to be an ally to Native Americans and Indigenous people", + "href": "https://www.vice.com/en_us/article/pa5a3m/how-to-be-an-ally-to-native-americans-indigenous-people" + }, + { + "text": "Mic: Things we need to stop saying about Native Americans", + "href": "https://www.mic.com/articles/144584/things-we-need-to-stop-saying-about-native-americans" + }, + { + "text": "Working Effectively with Indigenous Peoples (4th Ed)", + "href": "https://www.chinookmarketplace.com/products/book-working-effectively-with-indigenous-peoples-4th-edition" + } + ], + "content": "\ncomes from the Narragansett word _powwaw_, meaning \"spiritual leader; (also spelled powwow, powaw, pawaw, powah, pauwau and pawau); social gathering, ceremony, or celebrations held in different Native American communities that can be spiritually symbolic in nature, involve dancing and regalia, and involve months of planning with hundreds of people in attendance; colloquially is culturally appropriated and used to mean \"to meet\" (verb) or meeting, working session, or gathering (noun).\n\n## Issue\n\nNon-Native/non-Indigenous people using pow-wow outside of the context of its Native American meaning and significance is culturally appropriation through terminology.\n\nUsing culturally appropriative language while Native American and Indigenous people are systematically harmed reinforces settler colonial oppression.\n\n## Impact\n\nCultural appropriation is problematic because it robs the culture from the people without their consent, while the people behind the culture are left behind and systemically excluded from the spaces using their culture.\n\nUsing Native and Indigenous culture outside of its intended meaning also demeans its value to the culture. Connoting that your five-person meeting about making an app is somehow the same as culturally significant event minimises what powwows are.\n", + "basename": "pow-wow" + }, + "power": { + "title": "power", + "slug": "power", + "defined": false, + "content": "", + "basename": "power" + }, + "poz": { + "title": "Poz", + "slug": "poz", + "defined": false, + "content": "", + "basename": "poz" + }, + "preferred-pronoun": { + "title": "preferred pronoun", + "slug": "preferred-pronoun", + "flag": { + "text": "avoid", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "pronoun" + ], + "content": "\n\na word that substitutes for a noun, in particular, a person's name; a person's pronouns does not necessarily align with their gender presentation or their gender identity; a person gets to say what pronouns they and others use to refer to them; pronouns can be fluid based on context and presentation and change over time.\n\n## Issues\n\nPreferred pronoun can imply that this is merely what is _preferred_ rather than what is _real_. Using this can reinforce the idea that someone's pronouns are a choice rather than what is true for them or it's merely a preference and that you can use whatever pronouns you'd like for them.\n\n## Impact\n\nPreferred pronouns can delegitimise pronouns of trans and non-binary people in particular, especially when their pronouns are wrongly assumed to be different than they are or [neopronouns](/definitions/neopronouns) that are less commonly known. Delegitimising their pronouns delegitimes aspects of their identity, reinforces transmisia and non-binary erasure, and leads to harm against them.\n\n## Usage Tip\n\nUse [pronouns](/definitions/pronouns) instead.\n", + "basename": "preferred-pronoun" + }, + "prejudice": { + "title": "Prejudice", + "slug": "prejudice", + "defined": false, + "content": "", + "basename": "prejudice" + }, + "pride": { + "title": "Pride", + "slug": "pride", + "defined": false, + "sub_terms": [ + { + "text": "First", + "full_title": "First Pride (Anti-Police Riots)" + } + ], + "content": "\n", + "basename": "pride" + }, + "privilege": { + "title": "Privilege", + "slug": "privilege", + "defined": false, + "content": "", + "basename": "privilege" + }, + "pronouns": { + "title": "Pronouns", + "slug": "pronouns", + "speech": "noun", + "defined": true, + "reading": [ + { + "text": "Merriam-Webster: Words We're Watching: Singular They", + "href": "https://www.merriam-webster.com/words-at-play/singular-nonbinary-they" + }, + { + "text": "Pronoun.is", + "href": "http://pronoun.is/" + } + ], + "content": "\na word that substitutes for a noun, in particular, a person's name; a person's pronouns does not necessarily align with their gender presentation or their gender identity; a person gets to say what pronouns they and others use to refer to them; pronouns can be fluid based on context and presentation and change over time.\n\n## Usage\n\n**If you're in a group setting, it's best to lead by example by sharing your own pronouns if you feel comfortable.** \"I'm Jack, my pronouns are they/them.\"\n\n**When referring to someone's pronouns, it's best to follow their lead.** People will say \"My pronoun(s) is/are...\"\n\n**When you are not sure, ask what pronouns you should use and for what context,** in particular if you will be writing or speaking about them in a public setting. If you can, it's best to ask them one-on-one in a private setting. If you can't, likely they'll tell you the pronouns that make sense for that public setting.\n\n**Sometimes people will list their pronouns on their websites, email signatures, social media bios, etc.** While you can refer to those places for usage, it generally doesn't hurt to confirm how _you_ should refer to the person _in the particular context_, as some people use different pronouns in different settings. (For example, someone might not feel comfortable using a set of pronouns that might \"out them\" (reveal aspects of their gender identity) in a place they don't feel safe doing so.\n\n**When you are not sure and unable to confirm (such as if the person is deceased), it's generally best to use they/them pronouns.** However, note that some people do not like the use of they/them pronouns, which is sometimes the case for someone who has to work very hard to match their perceived gender identity to their pronouns.\n\nIf it seems complicated, it is because it is. Pronouns can be really important to people as they can represent a lot to a person about their identity. It's best to try your hardest then course-correct as needed.\n\n## Tips for Asking\n\nKeeping your question simple usually is best:\n\n\"What pronoun(s) should I use for you [add context if it's beyond one on one usage, including who might see it]?\"\n\nAvoid adding extra words, like, \"[preferred pronoun](/definitions/preferred-pronoun)\" or \"[gender pronoun](/definitions/gender-pronouns)\"\n\n## Tips for Correction\n\n**If you get someone's pronouns wrong and you're alerted of it or realise, correct the pronoun, apologise swiftly, and move on.** Avoid dwelling on it (providing long back story or berating yourself and expecting them to console you).\n\nIt can be very uncomfortable for whom you used the wrong pronoun, as it can often mean misgendering them. When you dwell on your mistake, you're asking someone who just had an uncomfortable, potentially oppressive experience, to then console you. Gross.\n\n**If you notice someone use the wrong pronouns for someone, correct the pronoun.** \"Jack uses they/them pronouns.\" Be certain that you are sure that the person would want you to use these pronouns in this setting, as you can accidentally \"out\" somebody if you're not careful.\n\n## Considerations\n\n- Usually people will list the pronouns as they/them or they/them/theirs.\n- Some people use multiple pronouns, such as she/they or they/he. Sometimes the order of these can imply which pronoun they use more frequently or if there is a slight preference to one over the other. It can also sometimes imply that they are in transition between using one pronoun to another. It can also imply none of these things, so it is best not to assume.\n- Some people change their pronouns based on settings. For example, if someone is transitioning and does not want to be outed in one setting, they may use different pronouns in that setting. Hence, why it is important to follow someone's lead and to confirm usage based on context.\n- They/them is a singular pronoun and has been since the late 1300s, so if someone tries to tell you that it's only plural, it's unlikely they take issue with the grammar but with something else.\n- Some plural people will refer to themselves as \"we\" to represent their plural identities.\n\n## Places to Put Pronouns\n\nGenerally speaking, whereever your name appears, including your pronouns is a good place to do so. The website [pronoun.is](https://pronoun.is) is helpful as it appends someone's pronouns to a link, and gives explanation to pronoun usage. You may see people include this in their various bios.\n\nSome ideas of places to put pronouns include:\n\n- Conference talks/webinars\n- Email signatures\n- Introductions (If you're introducing two or more people, make sure you confirm their pronouns if you're not certain)\n- Nametags\n- Social media bios\n- Video conference name fields\n- Websites\n\n## Impact\n\nBy respecting others' pronouns, asking them for consent, and sharing our own pronouns, we can normalise this step in socialisation. Doing so causes us to pause before presuming someone's pronouns. When people presume pronouns, it can lead to misgendering, which causes harm toward people, particularly trans and non-binary folks.\n\nIt is particularly important for people whose gender presentation and identity aligns with their pronouns to take this step, as they have the most power to influence society.\n\n## Read Also\n\n[gender pronouns](/definitions/gender-pronouns)\n[preferred pronoun](/definitions/preferred-pronoun)\n", + "basename": "pronouns" + }, + "prophylaxis": { + "title": "Prophylaxis", + "slug": "prophylaxis", + "defined": false, + "sub_terms": [ + { + "text": "Pre-exposure (PreEP)", + "full_title": "Pre-exposure Prophylaxis (PreEP)" + }, + { + "text": "Post-exposure (PreEP)", + "full_title": "Post-exposure Prophylaxis (PEP)" + } + ], + "content": "\n", + "basename": "prophylaxis" + }, + "psych": { + "title": "Psych", + "slug": "psych", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist language" + }, + "content": "", + "basename": "psych" + }, + "psychopath": { + "title": "Psychopath", + "slug": "psychopath", + "flag": { + "text": "Ableist Slur", + "level": "avoid" + }, + "defined": false, + "content": "\n", + "basename": "psychopath" + }, + "r-word": { + "title": "R-word", + "slug": "r-word", + "defined": true, + "speech": "noun", + "flag": { + "level": "avoid", + "text": "ableist slur" + }, + "reading": [ + { + "text": "Why Use of the R-Word Needs to Stop", + "href": "https://www.verywellfamily.com/what-is-the-r-word-3105651" + }, + { + "text": "End the R word", + "href": "https://www.sonc.org/EndtheRWord" + } + ], + "content": "\n\nPreviously, the word \"retard\" (often referred to by the euphemism \"the r-word\") was used in a medical context as an umbrella term to describe people with intellectual and developmental disabilities (I/DD).\n\nIn modern use, the r-word is generally used as a denigrating term for a person with an I/DD, or to compare someone _without_ an I/DD to someone _with_ an I/DD in a derogatory sense.\n\n## Issues\n\nWhile the term was previously used in a medical context, use of the word has transitioned to having a negative connotation in modern language. Changes are being made in both the medical and legal fields to reflect that conversational shift.\n\n[Rosa's Law was passed in 2010](https://www.congress.gov/111/plaws/publ256/PLAW-111publ256.pdf) to eliminate all references to \"mental retardation\" in U.S. federal law, replacing them with \"intellectual disability\".\n\nThe [DSM-5 update in 2013](https://www.psychiatry.org/File%20Library/Psychiatrists/Practice/DSM/APA_DSM-5-Intellectual-Disability.pdf) replaced \"mental retardation\" with \"intellectual disability\". [The Diagnostic and Statistical Manual of Mental Disorders (DSM)](https://www.psychiatry.org/psychiatrists/practice/dsm/feedback-and-questions/frequently-asked-questions) is the handbook used by health care professionals in the United States and much of the world as the authoritative guide to the diagnosis of mental disorders. The DSM is [periodically revised](https://www.psychiatry.org/File%20Library/Psychiatrists/Practice/DSM/APA_DSM-5-Intellectual-Disability.pdf) to align the manual's content with modern language and in reflection of the most up-to-date research and diagnostic criteria.\n\n## Impact\n\nRegardless of whether r-word is being used to describe someone with or without an I/DD, use of the word contributes to the dehumanisation, stigmatisation, and negative perceptions of people with an I/DD.\n\nBy using ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Alt Words\n\nIf you are using it to describe or refer to a person with an I/DD in a context where their I/DD is relevant, first be certain that they have an I/DD. Use a term that does not have a derogatory connotation (\"intellectual disability\", or the name of the actual disability, if applicable). If you use the name of the actual disability, be certain that you are correct, and be certain that they are comfortable with using the name.\n\nIf you are using it to describe or refer to a person with an I/DD in a context where their I/DD is not relevant, don't. Describe something else about them as a person. if someone is writing an article about a person with an I/DD, the relevance of their I/DD should be led by them. Avoid \"inspiration porn\", which is the portrayal of people with disabilities as inspirational solely or in part on the basis of their disability. ([Coined by Stella Young](https://www.youtube.com/watch?v=SxrS7-I_sMQ)).\n\nIf you are using it to describe or refer to a person without an I/DD, don't. Use a different, more relevant, descriptive word.\n", + "basename": "r-word" + }, + "race": { + "title": "Race", + "slug": "race", + "defined": false, + "sub_terms": [ + { + "text": "Racial", + "full_title": "Racial" + }, + { + "text": "Contract", + "full_title": "Race Contract" + }, + { + "text": "Formation", + "full_title": "Racial Formation" + }, + { + "text": "State", + "full_title": "Racial State" + }, + { + "text": "Raciology", + "full_title": "Raciology" + } + ], + "content": "\n", + "basename": "race" + }, + "racism": { + "title": "Racism", + "slug": "racism", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "racism" + }, + "racist-language": { + "title": "Racist language", + "slug": "racist-language", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "racist-language" + }, + "racist": { + "title": "Racist", + "slug": "racist", + "defined": false, + "content": "", + "basename": "racist" + }, + "rape": { + "title": "Rape", + "slug": "rape", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "rape" + }, + "sane": { + "title": "sane", + "slug": "sane", + "flag": { + "text": "Medical appropriation", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "logical", + "mindful", + "reasonable", + "sound", + "thoughtful", + "well-conceived", + "well-constructed", + "well-tested" + ], + "reading": [ + { + "text": "Stack Exchange", + "href": "https://english.stackexchange.com/questions/282282/near-universally-applicable-alternative-to-sanity-check" + } + ], + "content": "\n\nof sound mind, mentally healthy\n\n## Issues\n\nWhile \"[insane](/definitions/insane)\" might seem more obvious to people as an ableist word to use, the subtle connotation that sanity is good implicitly suggests that _insanity_, its opposite, is bad.\n\nConnoting sanity (which is an assessment of a person's neurological status—a medical condition that largely can't be changed) with being well-thought out, reasonable, sensible (or mindful of an event or series of events) reinforces the ableist idea that sanity (being neurotypical or mentally well and abled) is good, and its opposite of insanity (being neurodivergent or mentally ill and disabled), is bad.\n\n## Impact\n\nUsing \"sane\" reinforces the system that excludes mentally ill and disabled people, reinforcing negative biases against them. Using this language causes harm to mentally ill, neurodivergent, and disabled people.\n\nBy using this ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what criteria we hope our test can meet and what kind of feedback we're hoping to gain.\n\n## Read also\n\n- [sanity check](/definitions/sanity-check)\n", + "basename": "sane" + }, + "sanity-check": { + "title": "sanity check", + "slug": "sanity-check", + "flag": { + "text": "Ableist language", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "basic function test", + "coherence check", + "confidence check", + "consistency check", + "initial check", + "quick check", + "sense check", + "smoke test", + "temperature check", + "soundness check", + "plausibility check", + "spot check", + "gut check" + ], + "reading": [ + { + "text": "Google Developer Documentation Style Guide: Inclusive Documentation", + "href": "https://developers.google.com/style/inclusive-documentation" + }, + { + "text": "Stack Exchange", + "href": "https://english.stackexchange.com/questions/282282/near-universally-applicable-alternative-to-sanity-check" + } + ], + "content": "\n\n a basic test to quickly evaluate whether a claim or the result of a calculation can possibly be true; when expressed literally, examines if the author of a test was sane when they wrote it; commonly used in software engineering to assess whether something is reasonable and sound or meets its goals/acceptance criteria.\n\n## Issues\n\nConnoting sanity (which is an assessment of a person's neurological status—a medical condition that largely can't be changed) with the thoroughness of a piece of software (which is an object we create by decisions, which can be changed) reinforces the ableist idea that sanity (being neurotypical or mentally well) is good and its opposite of insanity (being neurodivergent or mentally ill) is bad.\n\n## Impact\n\nUsing \"sanity check\" in our engineering processes reinforces a system that excludes mentally ill and disabled people, reinforcing negative biases against them and making unsafe places for them to work and to be. Using this language causes harm to our mentally ill, neurodivergent, and disabled colleagues.\n\nUsing \"sane\" reinforces the system that excludes mentally ill and disabled people, reinforcing negative biases against them. Using this language causes harm to mentally ill, neurodivergent, and disabled people.\n\nBy using this ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what criteria we hope our test can meet and what kind of feedback we're hoping to gain.\n\n## Read Also\n\n- [sane](/definitions/sane)\n", + "basename": "sanity-check" + }, + "savage": { + "title": "savage", + "slug": "savage", + "speech": "noun or adjective", + "defined": true, + "flag": { + "level": "avoid", + "text": "racist slur" + }, + "reading": [ + { + "href": "https://thedomainofthestrange.wordpress.com/2012/10/02/savages-the-history-of-a-word/", + "text": "Savages: The History of a Word" + }, + { + "href": "https://theestablishment.co/stop-calling-people-savage-7746984d565d/index.html", + "text": "Stop calling people savage" + }, + { + "href": "https://www.theguardian.com/world/2001/apr/15/socialsciences.highereducation", + "text": "Racists created the noble savage" + }, + { + "href": "https://www.autostraddle.com/indigenous-peoples-day-honoring-my-people-and-rejecting-heroic-genocide-354654/", + "text": "Indigenous Peoples Day honoring my people and rejecting heroic genocide" + }, + { + "href": "https://www.thestar.com/news/insight/2017/07/31/savages-scalps-and-stereotypes-i-combed-through-the-stars-historical-indigenous-coverage.html", + "text": "Savages, scalps and stereotypes: I combed through the stars historical Indigenous coverage" + }, + { + "href": "https://www.theodysseyonline.com/america-stop-using-word-savage", + "text": "America: Stop using the word savage" + } + ], + "alt_words": [ + "capricious", + "cold-blooded", + "cruel", + "fierce", + "harsh", + "merciless", + "ruthless", + "uncalled for", + "unconscionable" + ], + "content": "\n(adj) not domesticated, primative or civilised; wild, uncultivated; cold-blooded; colloquially used to mean ruthless or unconscionable.\n(noun) an undomesticated person, subhuman.\n\n## Issues\n\n\"Following the discovery of America, the phrase \"savage\" for indigenous peoples was used disparagingly to justify colonialism. The concept of the savage gave Europeans the supposed right to establish colonies without considering the possibility of preexisting, functional societies.\"[1](https://en.wikipedia.org/wiki/Noble_savage).\n\nThe term savage is deeply rooted in settler colonialism, used primarily to justify colonisation by dehumanising Indigenous people, in particular, with regard to North American Indigenous peoples.\n\nThe theories behind the \"noble savage\" led to scientific racism. [Boarding schools](https://eji.org/history-racial-injustice-cultural-genocide) were constructed to separate Indigenous children from their parents, becuase white colonisers didn't believe that they were equipped to be parents.\n\n“When the school is on the reserve the child lives with its parents, who are savages; he is surrounded by savages, and though he may learn to read and write his habits, and training and mode of thought are Indian. He is simply a savage who can read and write … [T]he Indian children should be withdrawn as much as possible from the parental influence, and the only way to do that would be to put them in central training industrial schools where they will acquire the habits and modes of thought of white men.”[2](https://eji.org/history-racial-injustice-cultural-genocide)\n\n## Impact\n\nBy continuing to use this word, rooted in colonist history and context, while Indigenous people's lands are still being occupied and unceded, while more and more Indigenous women and girls continue to go missing, we are perpetuating a word that has been used to justify the past and the ongoing harm we commit against Indigenous peoples. Seemingly small actions like this contribute to the normalisation of the harm.\n\nDenying the etymology or power of the word as irrelevant is denying the history of its strength: Savage has been used to dehumanise Indigenous people in order to justify oppressing them or granting them fewer rights. The justifications have even included Supreme Court cases.\n\nThe imagery associated with the \"savage\" is used to justify oppressive and systematic racism against Indigenous peoples; that they somehow deserve injustice because it is their own fault.\n\n## Considerations\n\nRihanna has a lingerie line called Savage by Fenty. Megan Thee Stallion has a song called \"Savage.\"\n\nThe intersection of oppression of Black and Indigenous cultures is one worth noting. [Gwen Benaway's piece, Rihanna’s Lingerie Line Brings Up a Complicated Discussion About Language](https://www.flare.com/fashion/rihanna-savage-fenty-lingerie/) addresses this complexity: \"As much as we like clear right and wrongs with easy retweetable hot takes, some issues—like the dialogue about savage between Indigenous and Black communities—isn’t one to simplify.\"\n", + "basename": "savage" + }, + "savior": { + "title": "Savior", + "slug": "savior", + "defined": false, + "sub_terms": [ + { + "text": "White", + "full_title": "White Savior" + } + ], + "content": "\n", + "basename": "savior" + }, + "self-harm": { + "title": "Self-harm", + "slug": "self-harm", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "self-harm" + }, + "semitic": { + "title": "Semitic", + "slug": "semitic", + "defined": false, + "content": "", + "basename": "semitic" + }, + "serodiscordant": { + "title": "Serodiscordant", + "slug": "serodiscordant", + "defined": false, + "content": "", + "basename": "serodiscordant" + }, + "settler": { + "title": "settler", + "slug": "settler", + "defined": false, + "sub_terms": [ + { + "text": "colonial mentality", + "full_title": "colonial mentality" + } + ], + "content": "\n", + "basename": "settler" + }, + "sexual-assault": { + "title": "sexual assault", + "slug": "sexual-assault", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "sexual-assault" + }, + "sexual": { + "title": "Sexual", + "slug": "sexual", + "defined": false, + "sub_terms": [ + { + "text": "Bi-", + "full_title": "Bisexual" + }, + { + "text": "Pan-", + "full_title": "Pansexual" + }, + { + "text": "assault of a minor", + "full_title": "assault of a minor" + }, + { + "text": "Orientation", + "full_title": "Sexual Orientation" + } + ], + "content": "\n", + "basename": "sexual" + }, + "socially-constructed": { + "title": "Socially constructed", + "slug": "socially-constructed", + "defined": false, + "content": "", + "basename": "socially-constructed" + }, + "solidarity": { + "title": "Solidarity", + "slug": "solidarity", + "defined": false, + "content": "", + "basename": "solidarity" + }, + "south-asian": { + "title": "South Asian", + "slug": "south-asian", + "defined": true, + "speech": "noun", + "skip_in_table_of_content": true, + "content": "\numbrella term for people of South Asian descent. South Asian countries include Afghanistan, Bangladesh, Bhutan, Maldives, Nepal, India, Pakistan, and Sri Lanka.\n\n## Considerations\n\nAs many countries and cultures are enveloped within this umbrella term, try to be as specific as possible. If you know or can ask someone if they are Nepalese, for example, that's better as it's more specific.\n\nDo not assume someone is South Asian because of certain physical characteristics or language knowledge.\n\nAdditionally, these Asian subregions are important to differentiate as some regions were most fraught to imperialism and colonisation than others.\n", + "basename": "south-asian" + }, + "southeast-asian": { + "title": "Southeast Asian", + "slug": "southeast-asian", + "defined": true, + "speech": "noun", + "skip_in_table_of_content": true, + "content": "\numbrella term for people of Southeast Asian descent. South Asian countries include two sub-regions:\n\n- **Mainland Southeast Asia:** Cambodia, Laos, Myanmar, Peninsular Malaysia, Thailand and Vietnam.\n- **Maritime Southeast Asia:** Andaman and Nicobar Islands (India), Ashmore and Cartier Islands (Australia), Brunei, Christmas Island (Australia), the Cocos (Keeling) Islands (Australia), East Malaysia, East Timor, Indonesia (except Western New Guinea, which is considered a part of the Australian continent), the Philippines and Singapore.\n\n## Considerations\n\nAs many countries and cultures are enveloped within this umbrella term, try to be as specific as possible. If you know or can ask someone if they are Laotian, for example, that's better as it's more specific.\n\nDo not assume someone is Southeast Asian because of certain physical characteristics or language knowledge.\n\nAdditionally, these Asian subregions are important to differentiate as some regions were most fraught to imperialism and colonisation than others.\n", + "basename": "southeast-asian" + }, + "spaz": { + "title": "Spaz", + "slug": "spaz", + "flag": { + "text": "Ableist Slur", + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "hyper", + "anxious", + "jumpy", + "unable to focus" + ], + "content": "\n\nirrationally nervous person; hyperactive\n\n## Issues\n\nThe origin of the word “Spaz” is a shortened version of “Spastic.” Spastic refers to an alteration in muscle tone affected by the medical condition spasticity, which is seen in spastic diplegia and many other forms of cerebral palsy.\n\n## Impact\n\nBy using ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling.\n", + "basename": "spaz" + }, + "spirit-animal": { + "title": "Spirit animal", + "slug": "spirit-animal", + "defined": false, + "flag": { + "level": "avoid", + "text": "cultural appropriation" + }, + "content": "\n", + "basename": "spirit-animal" + }, + "stupid": { + "title": "Stupid", + "slug": "stupid", + "defined": false, + "flag": { + "level": "avoid", + "text": "ableist language" + }, + "content": "\n", + "basename": "stupid" + }, + "suicide": { + "title": "suicide", + "slug": "suicide", + "defined": true, + "speech": "noun", + "flag": { + "level": "warning", + "text": "content warning" + }, + "reading": [ + { + "text": "Mental Health Foundation: Suicide", + "href": "https://www.mentalhealth.org.uk/a-to-z/s/suicide" + }, + { + "text": "Samaritans: Best Practice Suicide Reporting Tips", + "href": "https://www.samaritans.org/about-samaritans/media-guidelines/best-practice-suicide-reporting-tips/" + } + ], + "content": "\nthe deliberate act of voluntarily ending one's own life. Motivation for suicide can be the result of conscious or unconscious thoughts and feelings.\n\n## Common Issues\n\nCommonly referred to in conversation and journalism as \"committed suicide\", \"took their own life\", or similar, which can have negative connotations with criminality and judgement, and can place blame on the individual.\n\nCan also be used in combination with a related measure of \"success\" which promotes suicide as a desirable result.\n\nSuicide is sometimes used colloquially to mean something will severely negatively impact you (e.g., \"social suicide\" and \"career suicide\"). Replace \"career suicide\" with \"career-ending,\" which conveys the same intent. Replace \"social suicide\" with a complete rephrase where you avoid placing blame on the individual: \"Doing this will negatively impact your social life.\"\n\n## Impact\n\nUnless used with sensitivity and care, discussion of suicide can reinforce negative stereotypes and stigma around mental illness. Sensationalist reporting of suicide also risks inadvertently promoting suicide.\n\n## Usage Tips\n\nWhen discussing suicide and suicidal ideation:\n\n- Avoid mentioning details of methods used and suggesting that these are \"easy\" or \"painless\" to reduce the risk of imitation.\n- Avoid suggesting that suicide is an \"easy way out\".\n- Avoid speculation over possible triggers: Suicide and suicidal ideation is complex and not necessarily the result of a single event or condition. Attempting to explain away suicide with a specific cause or condition downplays the wider circumstances and the impact on all those affected.\n- Instead of saying that a person \"committed suicide\", say that a person \"died by suicide.\" Framing suicide as a symptom of wider/unknown-to-us conditions validates the individual as a victim, rather than a perpetrator.\n- Discussing or reporting on suicide can be an opportunity to signpost the support available and educate people about the importance of mental wellbeing.\n- Include local resources for people to gain help, such as links to suicide hotlines, mental health resources, etc. Ensure these resources are appropriately linked for ease of use (e.g., ensure telephones are linked with `tel` tags, for example).\n- Follow [Reporting on Suicide](https://reportingonsuicide.org/)'s guidelines (or similar linked resources below), especially if your reporting will be largely publicised.\n", + "basename": "suicide" + }, + "systematic": { + "title": "Systematic", + "slug": "systematic", + "defined": false, + "content": "", + "basename": "systematic" + }, + "systemic": { + "title": "Systemic", + "slug": "systemic", + "defined": false, + "content": "", + "basename": "systemic" + }, + "tawhid": { + "title": "Tawhid", + "slug": "tawhid", + "defined": false, + "content": "", + "basename": "tawhid" + }, + "tone-deaf": { + "title": "tone-deaf", + "slug": "tone-deaf", + "flag": { + "text": "Medical appropriation", + "level": "avoid" + }, + "defined": true, + "speech": "adjective", + "alt_words": [ + "badly drawn", + "in poor taste", + "insensitive", + "negligent", + "not thought through", + "unaware", + "poorly-conceived" + ], + "reading": [ + { + "text": "Less well-known ableist language", + "href": "https://thisisforyoucarrie.blog/2018/01/07/less-well-known-ableist-language/" + }, + { + "text": "Quora: Is tone-deaf ableist?", + "href": "https://www.quora.com/Is-the-term-tone-deaf-ableist?share=1" + } + ], + "content": "\n\namusia, a neurological disorder that can be congenital (from birth) or acquired (due to comorbidity or injury) that results in the inability to differentiate speech, loss of ability to sing or produce pitch, or other disassociations with music (like rhythm); colloquially, when something is insensitive or poorly thought through.\n\n## Appropriate Usage\n\nReferring the medical condition (amusia) as described above\n\n## Inappropriate Usage\n\nAs a literary metaphor for insensitive or negligent\n\n## Issues\n\nConnoting negligence with a medical disorder implies that actions we can control (bad choices) are the same as actions that cannot necessarily be controlled (deafness). It reinforces the discriminatory idea that disability is bad.\n\n## Impact\n\nUsing the word tone-deaf reinforces the idea that Deaf and/or non-speaking/non-verbal people are somehow less than and that disability is bad (see [Ableism](/definitions/ableism)).\n\nBy using ableist language, we are perpetuating violence against people who experience mental or psychological disabilities. Using this language perpetuates those systems and language of harm, regardless of our intent.\n\n## Usage Tip\n\nBe mindful if you're referring to the medical condition or using it as a literary metaphor. If the latter, substitute by being more specific. Typically we can find an alternate definition by taking time to reflect on what emotion we're really feeling.\n", + "basename": "tone-deaf" + }, + "top-down-approach": { + "title": "Top-down approach", + "slug": "top-down-approach", + "defined": false, + "content": "", + "basename": "top-down-approach" + }, + "totemic-animal": { + "title": "Totemic animal", + "slug": "totemic-animal", + "defined": false, + "flag": { + "level": "avoid", + "text": "cultural appropriation" + }, + "content": "", + "basename": "totemic-animal" + }, + "tranny": { + "title": "Tranny", + "slug": "tranny", + "defined": false, + "flag": { + "level": "avoid", + "text": "anti-trans slur" + }, + "content": "\n", + "basename": "tranny" + }, + "trans-exclusionary-radical-feminist": { + "title": "Trans Exclusionary Radical Feminist (TERF)", + "slug": "trans-exclusionary-radical-feminist", + "defined": false, + "content": "", + "basename": "trans-exclusionary-radical-feminist" + }, + "trans": { + "title": "Trans", + "slug": "trans", + "defined": false, + "sub_terms": [ + { + "text": "-femme", + "full_title": "Trans-Femme" + }, + { + "text": "-feminine", + "full_title": "Transfeminine" + }, + { + "text": "-gender", + "full_title": "Transgender" + }, + { + "text": "man", + "full_title": "Trans Man" + }, + { + "text": "masculine", + "full_title": "Transmasculine" + }, + { + "text": "phobia", + "full_title": "Transphobia" + }, + { + "text": "woman", + "full_title": "Trans Woman" + } + ], + "content": "\n", + "basename": "trans" + }, + "transfeminine": { + "title": "Transfeminine", + "slug": "transfeminine", + "speech": "adj", + "defined": true, + "content": "\n\ndescribes a [transgender](/definitions/transgender) person for whom femininity forms part of their gender.\n\nFor example, a transfeminine person may be a binary transgender woman; they may also be a [non-binary](/definitions/non-binary) person with a gender adjacent to female, or with multple genders including female.\n", + "basename": "transfeminine" + }, + "transgender": { + "title": "Transgender", + "slug": "transgender", + "speech": "adj", + "defined": true, + "content": "\n\nof, relating to, or characterised by a gender that does not match the gender they were assigned at birth.\n\nThe opposite of [cisgender](/definitions/cisgender).\n", + "basename": "transgender" + }, + "transmisia": { + "title": "transmisia", + "slug": "transmisia", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "transmisia" + }, + "transphobia": { + "title": "transphobia", + "slug": "transphobia", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "transphobia" + }, + "trauma": { + "title": "trauma", + "slug": "trauma", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "trauma" + }, + "tribe": { + "title": "Tribe", + "slug": "tribe", + "defined": false, + "flag": { + "level": "avoid", + "text": "cultural appropriation" + }, + "content": "\n", + "basename": "tribe" + }, + "triggers": { + "title": "Triggers", + "slug": "triggers", + "defined": false, + "flag": { + "level": "avoid", + "text": "medical appropriation" + }, + "content": "", + "basename": "triggers" + }, + "two-spirited": { + "title": "Two-spirited", + "slug": "two-spirited", + "defined": false, + "content": "", + "basename": "two-spirited" + }, + "underrepresented-minority": { + "title": "underrepresented minority (URM)", + "slug": "underrepresented-minority", + "defined": true, + "speech": "noun", + "flag": { + "level": "avoid" + }, + "reading": [ + { + "text": "Free Dictionary definition", + "href": "https://medical-dictionary.thefreedictionary.com/underrepresented+minority" + } + ], + "content": "\n\ngroup whose representation is disproportionately less than their proportion in the general population; often racial or ethnic minority is implied, but can be used to represent any identifier, such as LGBTQIA+, disabled, gender, etc.\n\nabbreviated often to URM\n\n## Issues\n\nOften people use URM to mean \"minoritised racial group\", when it doesn't explicitly mean racial group in all contexts (even if that's the most commonly used context). It can cause confusion when which minoritised group is being spoken of, and can also lessen/erase additional intersections of identity. For example, if someone is disabled and of a minoritised racial group, using URM to imply racial group can erase their disability.\n\nUsing a term like URM can also erase meaningful specificity. For example, an issue might specifically be relevant to Black folks, but by referring to the group as URM, it erases their Blackness, conflates/waters down issues, and reinforces the power dynamic of white and everyone else.\n\nURM can also imply that the group in question isn't \"showing up\" to be represented; that the burden is on the URM group to show up or to do more to improve their numbers and representation. Meanwhile, the complement, the overrepresented majority, tends to be unnamed.\n\n## Impact\n\nBy naming the underrepresented minority often without the overrepresented majority, we are often reinforcing the idea that people harmed by oppressive systems are on the hook to fix them.\n\nBy repeatedly referring to groups as \"[minorities](/definitions/minorities),\" they are being infantilised to their numerical representation and made to feel minor. The vagueness also abstracts the identify of the marginalised group, making it difficult to address why they are minoritised to begin with and often erasing the complexity of those intersections.\n\n## Usage\n\nWhen using any term for a group, it's important to contextualise it into people. So, for example, \"people from the underrepresented minorities are more likely to be affected by this change\" over \"the underrepresented minority are more likely to be affected by this change.\"\n\nAdditionally, it's important to examine the context of the usage:\n\n- Why are you placing focus on the URM groups?\n- Will you also be speaking of the role overrepresented majorities play as well?\n- Would examining and speaking of overrepresented majorities be more accurate to your context?\n- Is URM accurate?\n- If no, can you be more specific than URM?\n\n## Read also\n\n- [minorities](/definitions/minorities)\n- [minoritised](/definitions/minoritised)\n- [overrepresented majority](/definitions/overrepresented-majority)\n", + "basename": "underrepresented-minority" + }, + "undetectable": { + "title": "Undetectable", + "slug": "undetectable", + "defined": false, + "content": "", + "basename": "undetectable" + }, + "undetectableuntransmittable-(uu)": { + "title": "Undetectable=Untransmittable (U=U)", + "slug": "undetectableuntransmittable-(uu)", + "defined": false, + "content": "", + "basename": "undetectableuntransmittable-(uu)" + }, + "unqueer": { + "title": "Unqueer", + "slug": "unqueer", + "defined": false, + "content": "", + "basename": "unqueer" + }, + "unreal": { + "title": "unreal", + "slug": "unreal", + "defined": true, + "speech": "adj", + "content": "\n\nvery impressive; amazing; larger or more fantastic than typical of real life.\n", + "basename": "unreal" + }, + "vertigo": { + "title": "Vertigo", + "slug": "vertigo", + "defined": false, + "sub_terms": [ + { + "text": "Visual", + "full_title": "Visual Vertigo" + } + ], + "content": "\n", + "basename": "vertigo" + }, + "vestibular-migraine": { + "title": "Vestibular migraine", + "slug": "vestibular-migraine", + "defined": false, + "content": "", + "basename": "vestibular-migraine" + }, + "violence-against-women-and-girls": { + "title": "Violence against women and girls (VAWG)", + "slug": "violence-against-women-and-girls", + "defined": false, + "content": "", + "basename": "violence-against-women-and-girls" + }, + "viral-load": { + "title": "Viral Load", + "slug": "viral-load", + "defined": false, + "content": "", + "basename": "viral-load" + }, + "weight-gain": { + "title": "weight gain", + "slug": "weight-gain", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "weight-gain" + }, + "weight-loss": { + "title": "weight loss", + "slug": "weight-loss", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "\n", + "basename": "weight-loss" + }, + "white-feminism": { + "title": "white feminism", + "slug": "white-feminism", + "defined": true, + "flag": { + "level": "tool", + "text": "white supremacy tool" + }, + "reading": [ + { + "text": "White is toxic white feminism?", + "href": "https://www.harpersbazaar.com/culture/politics/a22717725/what-is-toxic-white-feminism/" + }, + { + "text": "Emma Watson Addresses Her White Privilege and 'White Feminism' in Letter to Her Book Club", + "href": "https://www.wmagazine.com/story/emma-watson-white-privilege-feminism/" + }, + { + "text": "White Tears, Brown Scars, by Ruby Hamad", + "href": "https://www.mup.com.au/books/white-tearsbrown-scars-paperback-softback" + } + ], + "content": "\na form of \"feminism\" that prioritises the issues of and denies the privileges of abled, white, [cisgender](/definitions/cisgender), hetero Western/Anglo women, while ignoring to outwardly denying the issues of disabled, Black/brown, trans, queer women; actively denies intersectional forms of oppression including but not limited to racism, sexism, transmisia, Islamomisia, queermisia.\n\nWhite feminism is a tool of white supremacy, as it reinforces the power and default/idealised setting of whiteness.\n\n## Examples\n\n- White feminists marching in the Women's March but absent for #BlackLivesMatter, and/or calling cops on Black/brown people for no reason other than existing.\n- White feminists ensuring that there is women represented on a panel, but being fine if the panel is still all white, able-bodied, cisgender, etc.\n- White feminists appropriating yoga, colonising its purpose from meditation to weight-loss, or improving vanity and outward appearance by white Westernised, able-bodied beauty standards.\n- White feminists supporting \"women's empowerment\" for choice, while sex work-shaming.\n- White feminists supporting \"women's choices\" while participating in fat-shaming or otherwise reinforcing conventional Western/Anglo beauty standards.\n- White feminists employing microaggressions, weaponised compliments, or white women tears to invalidate the lived experiences of Black/brown women.\n- White feminists aligning with their whiteness as a \"pick me\", denying the intersectional issues that they do not face, but other multiply marginalised women do.\n- White feminists calling attention to reproductive rights, while actively using trans-exclusive language (such as, associating menstrating with womanhood).\n- White feminists exploit the duality of both being presented as someone can do no harm, while actively doing harm to multiply marginalised women.\n\n## Notes\n\n- **Not all white women are necessary white feminists.** However, as white feminism is a tool of white supremacy, it is one that every white woman (and white-/woman- presenting person) receives at birth by nature of their appearance as a form of white privilege. Furthermore, every white woman is empowered to use it to reinforce the power of the white supremecist capitalist patriarchy.\n\n- For a white woman to not be a white feminist, they must engage in actively dismantling their unearned privilege and fight their engrained nature. This usually involves learning how to become anti-racist, anti-ableist, anti-transmisic, etc.\n\n- While it is not a white feminist's _fault_ that they were born into, indoctrinated with, and socialised to use white feminist tools, it is their _responsibility_ to examine and to unpack the harm they can intentional and unintentionally commit. Just like it's not minoritised women's fault that they were born into bodies that are harmed by white feminism.\n\n- White feminists can come in any gender, ability, race, orientation, nationality. White men benefit from supporting white feminism and white feminists, as it supports white supremacy. For Black/brown folks, the white feminism may take a form of internalised oppression and require a decolonialisation of self to understand.\n\n- Other forms of oppression do not negate this white privilege. So, a disabled white woman still is indoctrinated with the power of and benefits from white feminism and white privilege, at the harm of Black/brown disabled women. Same goes for size-privilege, etc.\n\n## Impact\n\nBlack/brown women's issues become secondary and subordinate to the needs of white women. White feminism only advances white women, and often at the harm of Black and brown women and minoritised genders. In fact, often, once the needs of white women are met, Black/brown women are left behind.\n\nWhite feminism destroys the work against integrated and intersectional dismantling of the white supremecist capitalis patriarchy and kyriarchy.\n\n## What To Do\n\nIf you suspect you might be a white feminist, examine your brand of feminism.\n\n- What privileges do you possess that other women do not?\n- How have you reinforced the systems of oppression (intentionally or unintentionally)?\n- When reading feminist texts or thinking of feminist icons, who are you centring? Who is missing?\n\nIf you are white, examine your own [white fragility](/definitions/white-fragility). Reading Black feminist and womanist texts by authors like Angela Davis, bell hooks, and Audre Lorde is a good place to start.\n\n## Editor's Notes\n\n[Non-binary](/definitions/non-binary), agender, gender non-conforming, and other gender minoritised people are often neglected in traditional feminist rhetoric. In this entry, we've explicitly not conflated and used the term \"non-binary people and women\" as many non-binary people do not like being lumped in with women. Exploring the nuance between even Black/brown women and Black/brown non-binary people, as one example, requires separate subtext beyond the scope of this singular definition.\n\nIn our definition of women, we include trans women, because trans women are women.\n", + "basename": "white-feminism" + }, + "white-fragility": { + "title": "White fragility", + "slug": "white-fragility", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "White Supremacy Tool" + }, + "reading": [ + { + "text": "White Fragility by Robin DiAngelo", + "href": "https://robindiangelo.com/publications/" + }, + { + "text": "White Fragility tag on The Root", + "href": "https://www.theroot.com/tag/white-fragility" + } + ], + "content": "\n\nthe tendency for dominant white culture to respond to racism with defensive, dismissive, and angry responses; “a state in which even a minimum amount of racial stress becomes intolerable, triggering a range of defensive moves.” (Robin DiAngelo).\n\n## Impact\n\nWhite fragility detracts from critical conversations about the systemic oppressors at play. The cost of white fragility is that it centres the feelings of white people while ignoring and invalidating the systemic harm conducted towards people of colour. White fragility also prevents white people from doing anti-racist work to unpack their socially internalised racism.\n", + "basename": "white-fragility" + }, + "white-supremacist-capitalist-patriarchy": { + "title": "White supremacist capitalist patriarchy", + "slug": "white-supremacist-capitalist-patriarchy", + "defined": false, + "content": "", + "basename": "white-supremacist-capitalist-patriarchy" + }, + "white": { + "title": "White", + "slug": "white", + "defined": false, + "sub_terms": [ + { + "text": "Feminism", + "full_title": "White Feminism" + }, + { + "text": "Fragility", + "full_title": "White Fragility" + }, + { + "text": "-ness", + "full_title": "Whiteness" + }, + { + "text": "Supremacy", + "full_title": "White Supremacy" + }, + { + "text": "Woman Tears", + "full_title": "White Woman Tears" + }, + { + "text": "People (WP)", + "full_title": "White People (WP)" + }, + { + "text": "Woman (WP)", + "full_title": "White Woman (WP)" + } + ], + "content": "\n", + "basename": "white" + }, + "womanism": { + "title": "womanism", + "slug": "womanism", + "defined": false, + "content": "", + "basename": "womanism" + }, + "women-and-people-of-colour": { + "title": "women and people of colour", + "slug": "women-and-people-of-colour", + "flag": { + "level": "avoid" + }, + "defined": true, + "speech": "noun", + "alt_words": [ + "people of colour and white women", + "people of colour", + "white non-binary people, and white women", + "find ways to reframe why this dynamic exists", + "or omit" + ], + "content": "\n\noften used as a phrase to encompass “non-white, non-men,” seeking to provide solidarity for these two groups\n\n## Issues\n\nWhat happens to women of colour? As a woman of colour, I am split between both women and people of colour.\n\n## Impact\n\nAs such, it elicits feelings of erasure for women of colour. It also neglects [non-binary](/definitions/non-binary) individuals.\n", + "basename": "women-and-people-of-colour" + }, + "womxn": { + "title": "womxn", + "slug": "womxn", + "defined": false, + "content": "", + "basename": "womxn" + }, + "xenophoba": { + "title": "xenophobia", + "slug": "xenophobia", + "defined": false, + "flag": { + "level": "warning", + "text": "content warning" + }, + "content": "", + "basename": "xenophoba" + } +} \ No newline at end of file diff --git a/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/fr_FR.json b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/fr_FR.json new file mode 100644 index 0000000..b89c791 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/fr_FR.json @@ -0,0 +1,81 @@ +{ + "capacitisme": { + "title": "Capacitisme", + "slug": "capacitisme", + "defined": true, + "speech": "noun", + "content": "\n\nun système qui accorde de l'importance aux corps et esprits des gens selon des préjugés sociétaux de normalité, d'intelligence, d'excellence et de productivité. Ces préjugés ont des origines profondément enracinées dans le racisme anti-noir, l'eugénisme, le colonialisme et le capitalisme.\n\n- Talia \"TL\" Lewis\n\n## Impact\n\nPour paraphraser Lewis, le capacistisme \"pousse les gens et la société à considérer comme importantes les personnes selon leurs apparences et/ou leurs capacités à [...] produire, exceller ou 'bien se comporter'\". Vous n'avez pas besoin d'être handicapé pour éprouver le capacitisme, et les personnes handicapées peuvent également participer au renforcement du capacitisme, que ce soit intérieurement (et ainsi se faisant du mal eux-mêmes) et extérieurement (en faisant du mal à d'autres personnes handicapées).\n\n## Pour aller plus loin\n\n- [Conférence: Contexte, Clarté & Foundation](https://www.talilalewis.com/blog/longmore-lecture-context-clarity-grounding)\n- [Capacitisme 2020: Une définition mise à jour](https://www.talilalewis.com/blog/ableism-2020-an-updated-definition)\n", + "basename": "capacitisme" + }, + "cisgenre": { + "title": "Cisgenre", + "slug": "cisgenre", + "speech": "adj", + "defined": true, + "content": "\n\ntype d'identité de genre où le genre ressenti d'une personne correspond au genre qui lui a été assigné à la naissance.\n\nLe contraire est [transgenre](/definitions/transgender).\n", + "basename": "cisgenre" + }, + "fragilite-blanche": { + "title": "Fragilité Blanche", + "slug": "fragilite-blanche", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "Outil Suprématie Blanche" + }, + "reading": [ + { + "text": "Fragilité Blanche de Robin DiAngelo", + "href": "https://robindiangelo.com/publications/" + }, + { + "text": "Etiquette Fragilité Blanche sur The Root", + "href": "https://www.theroot.com/tag/white-fragility" + } + ], + "content": "\n\nla tendance pour la culture blanche dominante de répondre au racisme de façon défensive, dédaigneuse et/ou colérique; “un état dans lequel même une quantité minimale de stress racial devient intolérable, déclenchant une gamme d'actions défensives.” (Robin DiAngelo).\n\n## Impact\n\nLa fragilité blanche permet de détourner les conversations cruciales à propos des oppresseurs systémique. Le coût de la fragilité blanche est qu'il donne la priorité aux sentiments des personnes blanches tout en ignorant et en invalidant la nuisance systémique envers les personnes de couleur. La fragilité blanche empêche également les personnes blanches de réaliser un travail anti-raciste pour combattre leur racisme intériorisé.\n", + "basename": "fragilite-blanche" + }, + "gaslighting": { + "title": "Gaslighting", + "slug": "gaslighting", + "defined": true, + "speech": "noun", + "flag": { + "level": "tool", + "text": "Outil d'oppression" + }, + "reading": [ + { + "text": "11 signes préoccupant de gaslighting", + "href": "https://www.psychologytoday.com/us/blog/here-there-and-everywhere/201701/11-warning-signs-gaslighting" + }, + { + "text": "Exemples de gaslighting", + "href": "https://www.aconsciousrethink.com/6766/gaslighting-examples/" + } + ], + "content": "\n\ntactique de manipulation psychologique utilisée pour abuser en faisant pénétrer des doutes, ses observations, ses sentiments de négation dans les propres pensées de la victime, en leur mentant et les désorientant; originaire de la pièce Gaslight (1933) et du film (1944), où un homme change les lumières de la maison, tout en rejetant les observations de sa femme sur les changements.\n\n## Impact\n\nGaslighting renforce les systèmes de pouvoir, car les abuseurs du gaslighting sont systématiquement dans des positions de dominant où leur parole sera constamment considérée plus importante que celle de leur victime (e.g., personne blanche plutôt qu'une personne de couleur, homme plutôt qu'une femme, personne capable plutôt qu'une personne handicapée, parent plutôt qu'un enfant, directeur plutôt qu'employée, etc). Gaslighting est un comportement et une tactique abusives et oppressifs.\n\nL'abuseur peut prendre le contrôle de la victime, qui ne fait plus confiance à ses propres perceptions. La victime peut devenir dépendante de son oppresseur, et l'internaliser.\n", + "basename": "gaslighting" + }, + "signe-ok": { + "title": "👌 [signe-ok]", + "slug": "signe-ok", + "flag": { + "text": "Symbole Raciste", + "level": "avoid" + }, + "defined": true, + "speech": "nom", + "alt_words": [ + "👍", + "🆗", + "bien", + "d'accord", + "ou omettre" + ], + "content": "\n\ngeste de la main où le pouce droit et l'index droit forment un cercle, et les autres doigts restent dépliés; dans la langue des signes, ce geste signifie le chiffre neuf; en plongée, le geste veut dit \"OK\" ou \"Ça va\" en tant que question ou confirmation; ce geste est aussi utilisé dans un jeu pour enfants inoffensif appelé “[Le jeu du cercle](https://www.vice.com/en_uk/article/wj8e74/searching-for-the-man-behind-the-circle-game),” où le geste est gardé en dessous de la ceinture: si un autre enfant le regarde, il se fait frapper le bras.\n\nEn 2017, [des Suprémacistes Blancs sur 4chan](https://knowyourmeme.com/memes/ok-symbol-%F0%9F%91%8C) se sont appropriés ce signe afin de signifier le Pouvoir Blanc (les trois doigts forment un 'W' et le pouce et l'index forment le cercle du 'P'). Le signe a été présenté comme un canular pour \"casser\" les gauchistes en utilisant des tromperies et le [gaslighting](/definitions/gaslighting).\n\nCe geste de la main a été utilisé par des Suprémacistes Blancs comme une façon de rassembler et d'identifier d'autres Suprémacistes Blancs [aux rassemblements](https://mashable.com/article/milo-yiannopoulos-banned-from-furry-convention/), [dans les forums](https://www.splcenter.org/hatewatch/2018/09/18/ok-sign-white-power-symbol-or-just-right-wing-troll) et même [durant des audiences](https://nypost.com/2019/03/15/suspected-new-zealand-shooter-appears-in-court/). En 2019, le signe de la main a été ajouté à [liste officielle des symboles de la haine de la Ligue Anti-Diffamation](https://www.adl.org/news/press-releases/ok-and-other-alt-right-memes-and-slogans-added-to-adls-hate-symbols-database).\n\n## Problèmes\n\nBien que l'on puisse débattre que les origines du symbole et un grand nombre de leurs utilisations n'implique pas de connotations racistes, et que les 4chan-ers \"l'ont présenté comme un canular,\" il est indéniable que le symbole a évolué et est devenu un geste vraiment utilisé par les suprémacistes blancs.\n\nL'incertitude créée par les 4chan-ers fait partie intégrante de leur stratégie. Parce qu'ils ont eux-mêmes identifiés ce geste comme un canular, ils peuvent retourner à cette explication. Pendant ce temps, si des gens commencent à adopter ce symbole, comme cela a été le cas, il devient un signe de ralliement pour les Suprémacistes Blancs. Il faudrait aussi noter que cette approche d'endoctrinement des symboles de haine est documentée depuis longtemps, et [a aussi été utilisé pour la Swastika](https://theconversation.com/how-nazis-twisted-the-swastika-into-a-symbol-of-hate-83020).\n\n## Impact\n\nLes personnes les plus vulnérables à l'impact de l'oppression de la Suprématie Blanche ne sauront jamais certains de savoir si le symbole est utilisé pour l'une de ses manières non violentes ou s'il est utilisé pour son caractère violent et raciste. Les oppressés doivent choisir une option qui les protègent, ce qui les fait typiquement pencher du côté de la prudence.\n\nContinuer d'utiliser le symbole avec ses connotations dénuées de haine pour \"le récupérer\", n'élimine pas la nouvelle signification envahissante associée avec la Suprémacie Blanche. Au contraire, continuer son utilisation contribue uniquement à perpétuer les préjudices émotionnels et psychologiques sur les populations les plus vulnérables et susceptibles d'être touchées.\n\n## Autres Langues\n\n[English](/definitions/ok-hand)\n", + "basename": "signe-ok" + } +} \ No newline at end of file diff --git a/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/nl_NL.json b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/nl_NL.json new file mode 100644 index 0000000..e2907a9 --- /dev/null +++ b/test-api-environment/elasticsearch-mysql/src/database/seed-data/definitions/nl_NL.json @@ -0,0 +1,10 @@ +{ + "biseksueel": { + "title": "Biseksueel", + "slug": "biseksueel", + "speech": "adj", + "defined": true, + "content": "\n\nhet zijn, relateren aan of zich laten kenmerken door seksueel aangetrokken te zijn tot meer dan één gender.\n\n## Opmerking\n\nBiseksualiteit sluit aangetrokken zijn tot [non-binaire](../../non-binary) personen of [transgenders](../../transgender) niet uit.\n\n## Meer informatie\n\n[Am I Bisexual?](http://www.bisexualindex.org.uk/index.php/AmIBisexual)\n\n## Andere talen\n\n[English](../../bisexual)\n", + "basename": "biseksueel" + } +} \ No newline at end of file