From 9ced9e3ba3bf01daabe06b99ef5a24ee67dbc885 Mon Sep 17 00:00:00 2001 From: lykmapipo Date: Wed, 19 Feb 2020 13:58:48 +0300 Subject: [PATCH 1/2] chore(deps): force latest version & audit fix --- package-lock.json | 216 +++++++--------------------------------------- package.json | 6 +- 2 files changed, 33 insertions(+), 189 deletions(-) diff --git a/package-lock.json b/package-lock.json index e9ce5b0..69a3459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@codetanzania/ewea-common", - "version": "0.5.2", + "version": "0.5.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1175,36 +1175,36 @@ } }, "@codetanzania/ewea-common": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@codetanzania/ewea-common/-/ewea-common-0.5.1.tgz", - "integrity": "sha512-qR9i2YZiPFy9eFVg6pFJRIXbkkv6sepYMz8Eph1QZmU5Wmiw2yuP+jgoQ1FXzG9UdMJK52rNbXUuZS5pSe9/ww==", - "dev": true, - "requires": { - "@codetanzania/ewea-internals": ">=0.3.0", - "@lykmapipo/common": ">=0.30.2", - "@lykmapipo/env": ">=0.16.4", - "@lykmapipo/express-common": ">=0.17.18", - "@lykmapipo/express-rest-actions": ">=0.8.5", - "@lykmapipo/file": ">=0.1.15", - "@lykmapipo/geo-tools": ">=0.5.3", - "@lykmapipo/logger": ">=0.5.3", - "@lykmapipo/mongoose-common": ">=0.28.8", - "@lykmapipo/mongoose-exportable": ">=0.3.18", - "@lykmapipo/mongoose-sequenceable": ">=0.2.4", - "@lykmapipo/permission": ">=0.8.16", - "@lykmapipo/postman": ">=0.16.4", - "@lykmapipo/predefine": ">=1.5.2", - "async": ">=3.1.0", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@codetanzania/ewea-common/-/ewea-common-0.5.2.tgz", + "integrity": "sha512-H58mRJCds09b4rTsOjx2Ey4TzE2pTs+HBP0q44jWYai340PFRn3FCvJLcmr4tW8rCbNp3kphtycfdPaTxRku3g==", + "dev": true, + "requires": { + "@codetanzania/ewea-internals": ">=0.4.2", + "@lykmapipo/common": ">=0.30.5", + "@lykmapipo/env": ">=0.16.7", + "@lykmapipo/express-common": ">=0.17.21", + "@lykmapipo/express-rest-actions": ">=0.8.8", + "@lykmapipo/file": ">=0.1.18", + "@lykmapipo/geo-tools": ">=0.6.4", + "@lykmapipo/logger": ">=0.5.6", + "@lykmapipo/mongoose-common": ">=0.29.4", + "@lykmapipo/mongoose-exportable": ">=0.3.22", + "@lykmapipo/mongoose-sequenceable": ">=0.2.8", + "@lykmapipo/permission": ">=0.8.19", + "@lykmapipo/postman": ">=0.16.7", + "@lykmapipo/predefine": ">=1.6.4", + "async": ">=3.1.1", "lodash": ">=4.17.15", - "mongoose-geojson-schemas": ">=0.11.4", - "mongoose-locale-schema": ">=0.4.10", - "mongoose-rest-actions": ">=0.29.12" + "mongoose-geojson-schemas": ">=0.11.8", + "mongoose-locale-schema": ">=0.4.14", + "mongoose-rest-actions": ">=0.29.16" } }, "@codetanzania/ewea-event": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@codetanzania/ewea-event/-/ewea-event-0.4.1.tgz", - "integrity": "sha512-gBdZCKSZUEfC9x3KonH/8885KWH/JXyh/kFR0iXyNC6kNc0ZjVglR4GKR616WyLod8NON266cTMRMzWh4qMZlA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@codetanzania/ewea-event/-/ewea-event-0.4.2.tgz", + "integrity": "sha512-HjEVN7bi4V/AL9uvHvwh4ilIt9TlUJneFsNm6vafq1MeS1t4ieKna5EfLC8i+f+hkctSx7KF233UbqQl/OWKFw==", "dev": true, "requires": { "@codetanzania/emis-stakeholder": ">=2.1.0", @@ -1225,111 +1225,12 @@ "moment": ">=2.24.0", "mongoose-geojson-schemas": ">=0.11.6", "mongoose-rest-actions": ">=0.29.14" - }, - "dependencies": { - "@lykmapipo/mongoose-common": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-common/-/mongoose-common-0.29.2.tgz", - "integrity": "sha512-H8ezv5gP8w9gWiRccdwP7wxa9hoSmNIbnTwy4bZq94H3RNdfzIvSdYEKKye+XWD4Cf2LDoIiRXfWO81tsi4HFA==", - "dev": true, - "requires": { - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/env": ">=0.16.5", - "async": ">=3.1.0", - "lodash": ">=4.17.15", - "mongoose-schema-jsonschema": ">=1.2.1", - "mongoose-valid8": ">=1.6.7" - } - }, - "@lykmapipo/mongoose-exportable": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-exportable/-/mongoose-exportable-0.3.20.tgz", - "integrity": "sha512-dMWSRPe4ARsr+4yS6CUmTlEpRCTfI/q7K/PiXnMIc0y75vi/NWkQTqIo4tzX/nZgIWeOFbWRK+Djf0+L/xodqg==", - "dev": true, - "requires": { - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/mongoose-common": ">=0.29.2", - "async": ">=3.1.0", - "csv": ">=5.3.1", - "is-stream": ">=2.0.0", - "lodash": ">=4.17.15", - "pump": ">=3.0.0" - } - }, - "@lykmapipo/mongoose-sequenceable": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-sequenceable/-/mongoose-sequenceable-0.2.6.tgz", - "integrity": "sha512-KjlthOjXd33wiXjpom2I8+xxQdFYWJnMRuvGjf7Gk/QslgMnDfZRmaCCQu/oFBIZc99VumalFyaUUJP6DLnpbw==", - "dev": true, - "requires": { - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/mongoose-common": ">=0.29.2", - "async": ">=3.1.0", - "lodash": ">=4.17.15", - "moment": ">=2.24.0", - "mongoose-rest-actions": ">=0.29.14" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "mongoose-geojson-schemas": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/mongoose-geojson-schemas/-/mongoose-geojson-schemas-0.11.6.tgz", - "integrity": "sha512-SZmN7ZuawpvVPtzpFiYa11q75PqPa5dVztMq9Anc8PWMW11oAm3fLzUwOMHiYoDoqYFtRLTiTCfSh64mUe2gRw==", - "dev": true, - "requires": { - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/geo-tools": ">=0.6.2", - "@turf/turf": ">=5.1.6", - "async": ">=3.1.0", - "geojson-validation": ">=0.2.1", - "lodash": ">=4.17.15" - } - }, - "mongoose-rest-actions": { - "version": "0.29.14", - "resolved": "https://registry.npmjs.org/mongoose-rest-actions/-/mongoose-rest-actions-0.29.14.tgz", - "integrity": "sha512-57bxa2nv28ugW/DaF1dBrYi3XKMGEY3qkgf6TAO2fjgy2BwWeyy9KPafW+/2JTpzqFZePlxgjel0grbI6TBjXw==", - "dev": true, - "requires": { - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/include": ">=0.2.10", - "@lykmapipo/mongoose-aggregatable": ">=0.2.15", - "@lykmapipo/mongoose-common": ">=0.28.9", - "@lykmapipo/mongoose-faker": ">=0.10.9", - "@lykmapipo/mongoose-taggable": ">=0.4.19", - "async": ">=3.1.0", - "inflection": ">=1.12.0", - "lodash": ">=4.17.15", - "mongoose-autopopulate": ">=0.10.0", - "mongoose-exists": ">=0.9.4", - "mongoose-hidden": ">=1.8.1", - "mongoose-regex-search": ">=0.8.13" - } - }, - "mongoose-valid8": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/mongoose-valid8/-/mongoose-valid8-1.6.7.tgz", - "integrity": "sha512-8n+VrECo6gqkVH5h3wx2R1Cm2dMntemDQpOLqwF7vGwlJW5zrTpNhqJZpyJjTPoF/k67+5V8kr1u1kleE1aUTQ==", - "dev": true, - "requires": { - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/phone": ">=0.5.15", - "lodash": ">=4.17.15", - "validator": ">=12.1.0" - } - } } }, "@codetanzania/ewea-internals": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@codetanzania/ewea-internals/-/ewea-internals-0.4.2.tgz", - "integrity": "sha512-tl8SnDQC4JXhPnm42FkXZEu6uXGXrvU1Ln7GG7fG7G1OCh7abRZyd3ViohkmLvTuKXeqYNdWV5viElxNfVpEkQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@codetanzania/ewea-internals/-/ewea-internals-0.5.0.tgz", + "integrity": "sha512-59456qFc03qHyNl19KVx03uWaqygFYnivmVFTNV2i6q8vW8tg/CofEuMsersaqtBrQZdYw/FrSeivki3NXP8bw==", "requires": { "@lykmapipo/common": ">=0.30.5", "async": ">=3.1.1", @@ -2014,18 +1915,6 @@ } } }, - "@lykmapipo/mongoose-faker": { - "version": "0.10.9", - "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-faker/-/mongoose-faker-0.10.9.tgz", - "integrity": "sha512-N1SWA3hk+Qs65npJj8IlqciZO3MQGkulBsrwk4sIfsZ7nP/hsmNfUWgUj4hlN0FCeNLkE8WNS/ZFi8p+zBEpQQ==", - "dev": true, - "requires": { - "@benmaruchu/faker": ">=4.3.0", - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/mongoose-common": ">=0.28.9", - "lodash": ">=4.17.15" - } - }, "@lykmapipo/mongoose-sequenceable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-sequenceable/-/mongoose-sequenceable-0.2.8.tgz", @@ -2039,21 +1928,6 @@ "mongoose-rest-actions": ">=0.29.15" } }, - "@lykmapipo/mongoose-taggable": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-taggable/-/mongoose-taggable-0.4.19.tgz", - "integrity": "sha512-pcYGU4he0bW8NkhfG9DK+mnipOskfgoBAxmnUtmz7SvUzJnQOFj14vr+Gi3J0EUgErVTJ6l8gA/Scb6J0NJArw==", - "dev": true, - "requires": { - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/mongoose-common": ">=0.28.9", - "async": ">=3.1.0", - "lodash": ">=4.17.15", - "moment": ">=2.24.0", - "stopwords-iso": ">=0.4.0", - "traverse": ">=0.6.6" - } - }, "@lykmapipo/mongoose-test-helpers": { "version": "0.7.36", "resolved": "https://registry.npmjs.org/@lykmapipo/mongoose-test-helpers/-/mongoose-test-helpers-0.7.36.tgz", @@ -12034,23 +11908,6 @@ } } }, - "mongoose-autopopulate": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/mongoose-autopopulate/-/mongoose-autopopulate-0.10.0.tgz", - "integrity": "sha512-2Uj4A8OvbllEEqUYBeTRP98/TAa7cWrsBxJkQ5IgIUUW1XuOL5FLUijCvdOKw/rQOhNvXmA87q9EpHLpIMLhyA==", - "dev": true - }, - "mongoose-exists": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/mongoose-exists/-/mongoose-exists-0.9.4.tgz", - "integrity": "sha512-coUEAi2spdr54GpVYn3o2asVf9trJAhs3VaAEABrknrd0SAlfxEtm9UBOXUv1X2HcPl83n2mdYyCHo8uIO3aOg==", - "dev": true, - "requires": { - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/mongoose-common": ">=0.28.9", - "lodash": ">=4.17.15" - } - }, "mongoose-geojson-schemas": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/mongoose-geojson-schemas/-/mongoose-geojson-schemas-0.11.8.tgz", @@ -12130,19 +11987,6 @@ "lodash": ">=4.17.15" } }, - "mongoose-regex-search": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/mongoose-regex-search/-/mongoose-regex-search-0.8.13.tgz", - "integrity": "sha512-sEoGRCoTpc8fbzzcD62dv1Ce7JUAIpBPgkjAIQRuuR2a2F4/MYurW01LoXl6KXJr8QG2WRqP6DLoL7uUM1pbyA==", - "dev": true, - "requires": { - "@lykmapipo/common": ">=0.30.3", - "@lykmapipo/env": ">=0.16.5", - "@lykmapipo/mongoose-common": ">=0.28.9", - "async": ">=3.1.0", - "lodash": ">=4.17.15" - } - }, "mongoose-rest-actions": { "version": "0.29.16", "resolved": "https://registry.npmjs.org/mongoose-rest-actions/-/mongoose-rest-actions-0.29.16.tgz", diff --git a/package.json b/package.json index 434cb10..9430eca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codetanzania/ewea-common", - "version": "0.5.2", + "version": "0.5.3", "description": "Common utilities for EWEA", "main": "lib/index.js", "module": "es/index.js", @@ -76,7 +76,7 @@ "@babel/register": "^7.8.3", "@benmaruchu/faker": "^4.3.0", "@codetanzania/emis-stakeholder": "^2.1.0", - "@codetanzania/ewea-event": "^0.4.1", + "@codetanzania/ewea-event": "^0.4.2", "@commitlint/cli": "^8.3.5", "@commitlint/config-conventional": "^8.3.4", "@commitlint/travis-cli": "^8.3.5", @@ -115,7 +115,7 @@ "mongoose": ">=5.9.1" }, "dependencies": { - "@codetanzania/ewea-internals": ">=0.4.2", + "@codetanzania/ewea-internals": ">=0.5.0", "@lykmapipo/common": ">=0.30.5", "@lykmapipo/env": ">=0.16.7", "@lykmapipo/express-common": ">=0.17.21", From 19b6072b6ed8c052aeb7866f3636334fd690371e Mon Sep 17 00:00:00 2001 From: lykmapipo Date: Wed, 19 Feb 2020 14:01:43 +0300 Subject: [PATCH 2/2] chore(release): compile latest source & release notes --- CHANGELOG.md | 6 + es/index.js | 701 ++++++++++++++++++++++++++++++++++++++++++++------- lib/index.js | 700 +++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 1219 insertions(+), 188 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9586eaf..ea8b8d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +#### 0.5.3 (2020-02-19) + +##### Chores + +* **deps:** force latest version & audit fix ([9ced9e3b](https://github.com/codetanzania/ewea-common/commit/9ced9e3ba3bf01daabe06b99ef5a24ee67dbc885)) + #### 0.5.2 (2020-02-19) ##### Chores diff --git a/es/index.js b/es/index.js index 326f945..15795f8 100644 --- a/es/index.js +++ b/es/index.js @@ -1,15 +1,15 @@ -import { PREDEFINE_RELATIONS, MODEL_NAME_PREDEFINE } from '@codetanzania/ewea-internals'; +import { PREDEFINE_RELATIONS, MODEL_NAME_PREDEFINE, PARTY_RELATIONS, EVENT_RELATIONS, MODEL_NAME_PARTY, MODEL_NAME_EVENT } from '@codetanzania/ewea-internals'; export * from '@codetanzania/ewea-internals'; import { waterfall } from 'async'; -import { connect as connect$1, syncIndexes as syncIndexes$1 } from '@lykmapipo/mongoose-common'; +import { connect as connect$1, syncIndexes as syncIndexes$1, model } from '@lykmapipo/mongoose-common'; import { createModels } from '@lykmapipo/file'; import { join, resolve } from 'path'; -import { toLower, mapKeys, split, forEach, isEmpty } from 'lodash'; -import { pluralize, mergeObjects, join as join$1, sortedUniq, compact } from '@lykmapipo/common'; +import { toLower, mapKeys, split, map, forEach, isArray, first, omit, keys, isEmpty, endsWith, isFunction } from 'lodash'; +import { pluralize, mergeObjects, join as join$1, compact, sortedUniq } from '@lykmapipo/common'; import { getString } from '@lykmapipo/env'; import { debug, warn } from '@lykmapipo/logger'; -import { readCsv } from '@lykmapipo/geo-tools'; -import { transformToPredefine, listPermissions, Predefine } from '@lykmapipo/predefine'; +import { readCsv, readJson } from '@lykmapipo/geo-tools'; +import { transformToPredefine, listPermissions } from '@lykmapipo/predefine'; import { Permission } from '@lykmapipo/permission'; /** @@ -205,10 +205,9 @@ const geoJsonPathFor = modelName => { * * jsonPathFor('events'); * => /home/ewea/seeds/events.json - * => /home/ewea/seeds/events.js */ const jsonPathFor = modelName => { - const fileName = `${pluralize(toLower(modelName))}`; + const fileName = `${pluralize(toLower(modelName))}.json`; const jsonFilePath = dataPathFor(fileName); return jsonFilePath; }; @@ -248,6 +247,49 @@ const transformSeedKeys = seed => { return transformed; }; +/** + * @function applyTransformsOn + * @name applyTransformsOn + * @description Transform and normalize seed + * @param {object|object[]} seed valid seed(s) + * @param {...Function} [transformers] transform to apply on seed + * @returns {object} transformed seed + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * applyTransformsOn({ Name: 'John Doe' }); + * => { name: 'John Doe' } + */ +const applyTransformsOn = (seed, ...transformers) => { + // copy seed + let data = compact([].concat(seed)); + + data = map(data, value => { + // copy value + let transformed = mergeObjects(value); + + // ensure transformers + const transforms = compact([transformSeedKeys].concat(transformers)); + + // apply transform sequentially + forEach(transforms, applyTransformOn => { + transformed = applyTransformOn(transformed); + }); + + // return transformed + return transformed; + }); + + // return + data = isArray(seed) ? data : first(data); + return data; +}; + /** * @function transformToPredefineSeed * @name transformToPredefineSeed @@ -270,7 +312,7 @@ const transformToPredefineSeed = seed => { const data = mergeObjects(seed); // normalize to predefine - const predefine = transformToPredefine(data); + let predefine = transformToPredefine(data); // transform relations const populate = {}; @@ -278,61 +320,118 @@ const transformToPredefineSeed = seed => { const hasRelation = key && seed[key]; if (hasRelation) { const options = mergeObjects(value); - const path = `relations.${key}`; - const model = options.ref || MODEL_NAME_PREDEFINE; + const path = `relations.${options.path || key}`; + const modelName = options.ref || MODEL_NAME_PREDEFINE; const array = options.array || false; const vals = sortedUniq(split(seed[key], ',')); const match = - model === MODEL_NAME_PREDEFINE + modelName === MODEL_NAME_PREDEFINE ? { 'strings.name.en': { $in: vals } } : { name: { $in: vals } }; - populate[path] = { model, match, array }; + populate[path] = { model: modelName, match, array }; } }); predefine.populate = populate; // return + predefine = omit(predefine, ...[...keys(PREDEFINE_RELATIONS), 'relations']); return predefine; }; /** - * @function applyTransformsOn - * @name applyTransformsOn - * @description Transform and normalize seed + * @function transformToPartySeed + * @name transformToPartySeed + * @description Transform and normalize given seed to party seed * @param {object} seed valid seed - * @param {...Function} [transformers] transform to apply on seed - * @returns {object} transformed seed + * @returns {object} valid party seed * @author lally elias * @license MIT - * @since 0.3.0 + * @since 0.6.0 * @version 0.1.0 * @static * @public * @example * - * applyTransformsOn({ Name: 'John Doe' }); + * transformToPartySeed({ Name: 'John Doe' }); * => { name: 'John Doe' } */ -const applyTransformsOn = (seed, ...transformers) => { +const transformToPartySeed = seed => { // copy seed let data = mergeObjects(seed); - // ensure transformers - const transforms = compact([transformSeedKeys].concat(transformers)); + // transform relations + const populate = {}; + forEach(PARTY_RELATIONS, (value, key) => { + const hasRelation = key && data[key]; + if (hasRelation) { + const options = mergeObjects(value); + const path = `${options.path || key}`; + const modelName = options.ref || MODEL_NAME_PREDEFINE; + const array = options.array || false; + const vals = sortedUniq(split(data[key], ',')); + const match = + modelName === MODEL_NAME_PREDEFINE + ? { 'strings.name.en': { $in: vals } } + : { name: { $in: vals } }; + populate[path] = { model: modelName, match, array }; + } + }); + data.populate = populate; + + // return + data = omit(data, ...[...keys(PARTY_RELATIONS), 'relations', 'namespace']); + return data; +}; + +/** + * @function transformToEventSeed + * @name transformToEventSeed + * @description Transform and normalize given seed to event seed + * @param {object} seed valid seed + * @returns {object} valid party seed + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * transformToEventSeed({ Name: 'John Doe' }); + * => { name: 'John Doe' } + */ +const transformToEventSeed = seed => { + // copy seed + let data = mergeObjects(seed); - // apply transform sequentially - forEach(transforms, applyTransformOn => { - data = applyTransformOn(data); + // transform relations + const populate = {}; + forEach(EVENT_RELATIONS, (value, key) => { + const hasRelation = key && data[key]; + if (hasRelation) { + const options = mergeObjects(value); + const path = `${options.path || key}`; + const modelName = options.ref || MODEL_NAME_PREDEFINE; + const array = options.array || false; + const vals = sortedUniq(split(data[key], ',')); + const match = + modelName === MODEL_NAME_PREDEFINE + ? { 'strings.name.en': { $in: vals } } + : { name: { $in: vals } }; + populate[path] = { model: modelName, match, array }; + } }); + data.populate = populate; // return + data = omit(data, ...[...keys(EVENT_RELATIONS), 'relations', 'namespace']); return data; }; /** - * @function seedCsv - * @name seedCsv - * @description Read csv seed and apply see transforms + * @function readCsvFile + * @name readCsvFile + * @description Read csv seed and apply seed transforms * @param {string} path valid csv path * @param {Function[]} [transformers] transforms to apply on seed * @param {Function} done callback to invoke on next seed @@ -345,9 +444,9 @@ const applyTransformsOn = (seed, ...transformers) => { * @public * @example * - * seedCsv(path, transforms, (error, { finished, feature, next }) => { ... }); + * readCsvFile(path, transforms, (error, { finished, feature, next }) => { ... }); */ -const seedCsv = (path, transformers, done) => { +const readCsvFile = (path, transformers, done) => { return readCsv({ path }, (error, { finished, feature, next }) => { let data = feature; if (!isEmpty(feature) && next && !finished) { @@ -357,11 +456,230 @@ const seedCsv = (path, transformers, done) => { }); }; +/** + * @function processCsvSeed + * @name processCsvSeed + * @description process each csv row (data) + * @param {object} [options] valid options + * @param {string} [options.Model=undefined] valid model name + * @param {object} [options.properties={}] valid extra properties to merge on each seed + * @param {string} [options.namespace=undefined] valid predefine namespace + * @param {boolean} [options.throws=false] whether to throw error + * @param {Function} done callback to invoke on success or error + * @returns {Function} call back function + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const options = { Model = undefined, properties = {}, namespace = undefined, throws = false } + * processCsvSeed((options,done) => (error,{finished,feature,next}) => { ... }); + */ +const processCsvSeed = ( + { Model = undefined, properties = {}, namespace = undefined, throws = false }, + done +) => (error, { finished, feature, next }) => { + // handle file read errors + if (error) { + return throws ? done(error) : done(); + } + // handle read finish + if (finished) { + return done(); + } + // process datas + if (feature && next) { + // seed data & next chunk from csv read stream + const data = mergeObjects(properties, { namespace }, feature); + return Model.seed(data, next); + } + // request next chunk from csv read stream + return next && next(); +}; + +/** + * @function seedFromCsv + * @name seedFromCsv + * @description Seed given model from csv file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {string} [optns.namespace] valid predefine namespace + * @param {boolean} [optns.throws=false] whether to throw error + * @param {string} [optns.filePath=undefined] valid full file path for csv seed + * @param {object} [optns.properties={}] extra properties to merge on each seed + * @param {Function[]} [optns.transformers] valid predefine transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ..., transformers: [ ... ] }; + * seedFromCsv(optns, error => { ... }); + */ +const seedFromCsv = (optns, done) => { + // normalize options + const { + filePath = undefined, + properties = {}, + modelName = undefined, + namespace = undefined, + throws = false, + transformers = [], + } = mergeObjects(optns); + + // do: seed data to model if exists + const Model = model(modelName); + if (Model) { + // prepare seed options + const isPredefine = + modelName === MODEL_NAME_PREDEFINE && !isEmpty(namespace); + const csvFilePath = filePath || csvPathFor(namespace || modelName); + const appliedTransformers = isPredefine + ? [transformToPredefineSeed, ...transformers] + : [...transformers]; + + // seed from csv + return readCsvFile( + csvFilePath, + appliedTransformers, + processCsvSeed({ Model, properties, throws }, done) + ); + } + + // backoff: no data model found + return done(); +}; + +/** + * @function seedFromJson + * @name seedFromJson + * @description Seed given model from json file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {string} [optns.namespace] valid predefine namespace + * @param {boolean} [optns.throws=false] whether to throw error + * @param {string} [optns.filePath=undefined] valid full file path for json seed + * @param {object} [optns.properties={}] extra properties to merge on each seed + * @param {Function[]} [optns.transformers] valid predefine transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ..., transformers: [ ... ] }; + * seedFromJson(optns, error => { ... }); + */ +const seedFromJson = (optns, done) => { + // normalize options + const { + filePath = undefined, + properties = {}, + modelName = undefined, + namespace = undefined, + throws = false, + transformers = [], + } = mergeObjects(optns); + + // do: seed data to model if exists + const Model = model(modelName); + if (Model) { + // prepare seed options + const isPredefine = + modelName === MODEL_NAME_PREDEFINE && !isEmpty(namespace); + const jsonFilePath = filePath || jsonPathFor(namespace || modelName); + const appliedTransformers = isPredefine + ? [transformToPredefineSeed, ...transformers] + : [...transformers]; + + // prepare json seed stages + const path = endsWith(jsonFilePath, '.json') + ? jsonFilePath + : `${jsonFilePath}.json`; + return readJson({ path, throws }, (error, data) => { + if (!isEmpty(data)) { + const transform = seed => { + const merged = mergeObjects(properties, { namespace }, seed); + return applyTransformsOn(merged, ...appliedTransformers); + }; + return Model.seed({ data, transform }, done); + } + return done(error, data); + }); + } + // backoff: no data model found + return done(); +}; + +/** + * @function seedFromSeeds + * @name seedFromSeeds + * @description Seed given model from seeds file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {boolean} [optns.throws=false] whether to throw error + * @param {Function} [optns.filter=undefined] seed data filter + * @param {Function} [optns.transform=undefined] seed data transformer + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ... }; + * seedFromSeeds(optns, error => { ... }); + */ +const seedFromSeeds = (optns, done) => { + // normalize options + const { + modelName = undefined, + throws = false, + filter, + transform, + } = mergeObjects(optns); + + // do: seed data to model if seeds exists + const Model = model(modelName); + const canSeed = Model && isFunction(Model.seed); + if (canSeed) { + // filter, transform & seed + return Model.seed({ filter, transform }, (error, results) => { + // reply with errors + if (throws) { + return done(error, results); + } + // ignore errors + return done(null, results); + }); + } + // backoff: no data model found + return done(); +}; + /** * @function seedPredefine * @name seedPredefine * @description Seed given predefine namespace - * @param {string} namespace valid predefine namespace + * @param {object} optns valid seed options + * @param {string} optns.namespace valid predefine namespace + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid predefine transformers * @param {Function} done callback to invoke on success or error * @returns {Error|undefined} error if fails else undefined * @author lally elias @@ -372,39 +690,128 @@ const seedCsv = (path, transformers, done) => { * @public * @example * - * seedPredefine(namespace, error => { ... }); - */ -const seedPredefine = (namespace, done) => { - const csvFilePath = csvPathFor(namespace); - const transformers = [transformToPredefineSeed]; - const stages = [ - then => { - seedCsv( - csvFilePath, - transformers, - (error, { finished, feature, next }) => { - // handle read errors - if (error) { - return then(error); - } - // handle read finish - if (finished) { - return then(); - } - // process features - if (feature && next) { - // seed feature - const data = mergeObjects(feature, { namespace }); - return Predefine.seed(data, (err, seeded) => { - return next(err, seeded); - }); - } - // request next chunk from stream - return next && next(); - } - ); - }, - ]; + * seedPredefine(optns, error => { ... }); + */ +const seedPredefine = (optns, done) => { + // normalize options + const { + modelName = MODEL_NAME_PREDEFINE, + namespace = undefined, + throws = false, + transformers = [], + } = mergeObjects(optns); + + // prepare namespace filter + const filter = seed => seed.namespace === namespace; + + // prepare options + const options = { modelName, namespace, throws, transformers, filter }; + + // prepare predefine seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed predefine + return waterfall(stages, done); +}; + +/** + * @function seedParty + * @name seedParty + * @description Seed given parties + * @param {object} optns valid seed options + * @param {string} optns.type valid party type + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid party transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedParty(optns, error => { ... }); + */ +const seedParty = (optns, done) => { + // normalize options + const { + modelName = MODEL_NAME_PARTY, + type = 'Focal', + throws = false, + transformers = [], + } = mergeObjects(optns); + + // prepare type filter + const filter = seed => seed.type === type; + + // prepare options + const options = { + modelName, + namespace: type, + properties: { type }, + type, + throws, + transformers: [transformToPartySeed, ...transformers], + filter, + }; + + // prepare party seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed party + return waterfall(stages, done); +}; + +/** + * @function seedEvent + * @name seedEvent + * @description Seed given events + * @param {object} optns valid seed options + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid event transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedEvent(optns, error => { ... }); + */ +const seedEvent = (optns, done) => { + // normalize options + const { + modelName = MODEL_NAME_EVENT, + throws = false, + transformers = [], + } = mergeObjects(optns); + + // prepare options + const options = { + modelName, + properties: {}, + throws, + transformers: [transformToEventSeed, ...transformers], + }; + + // prepare event seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed event return waterfall(stages, done); }; @@ -426,16 +833,22 @@ const seedPredefine = (namespace, done) => { */ const seedPermissions = done => { debug('Start Seeding Permissions Data'); - return waterfall( - [ - next => Permission.seed(error => next(error)), - next => Permission.seed(listPermissions(), error => next(error)), - ], - error => { - debug('Finish Seeding Permissions Data'); - return done(error); - } - ); + + // prepare permissions seed stages + const seedResourcePermissions = next => { + return Permission.seed(error => next(error)); + }; + const seedPredefineNamespacePermissions = next => { + const namespacePermissions = listPermissions(); + return Permission.seed(namespacePermissions, error => next(error)); + }; + const stages = [seedResourcePermissions, seedPredefineNamespacePermissions]; + + // do seed permissions + return waterfall(stages, error => { + debug('Finish Seeding Permissions Data'); + return done(error); + }); }; /** @@ -456,7 +869,8 @@ const seedPermissions = done => { */ const seedUnits = done => { debug('Start Seeding Units Data'); - return seedPredefine('Unit', error => { + const namespace = 'Unit'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Units Data'); return done(error); }); @@ -480,7 +894,8 @@ const seedUnits = done => { */ const seedAdministrativeLevels = done => { debug('Start Seeding Administrative Levels Data'); - return seedPredefine('AdministrativeLevel', error => { + const namespace = 'AdministrativeLevel'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Administrative Levels Data'); return done(error); }); @@ -504,7 +919,8 @@ const seedAdministrativeLevels = done => { */ const seedFeatureTypes = done => { debug('Start Seeding Feature Types Data'); - return seedPredefine('FeatureType', error => { + const namespace = 'FeatureType'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Feature Types Data'); return done(error); }); @@ -528,7 +944,8 @@ const seedFeatureTypes = done => { */ const seedEventIndicators = done => { debug('Start Seeding Event Indicators Data'); - return seedPredefine('EventIndicator', error => { + const namespace = 'EventIndicator'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Indicators Data'); return done(error); }); @@ -552,7 +969,8 @@ const seedEventIndicators = done => { */ const seedEventSeverities = done => { debug('Start Seeding Event Severities Data'); - return seedPredefine('EventSeverity', error => { + const namespace = 'EventSeverity'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Severities Data'); return done(error); }); @@ -576,7 +994,8 @@ const seedEventSeverities = done => { */ const seedEventCertainties = done => { debug('Start Seeding Event Certainties Data'); - return seedPredefine('EventCertainty', error => { + const namespace = 'EventCertainty'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Certainties Data'); return done(error); }); @@ -600,7 +1019,8 @@ const seedEventCertainties = done => { */ const seedEventStatuses = done => { debug('Start Seeding Event Statuses Data'); - return seedPredefine('EventStatus', error => { + const namespace = 'EventStatus'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Statuses Data'); return done(error); }); @@ -624,7 +1044,8 @@ const seedEventStatuses = done => { */ const seedEventUrgencies = done => { debug('Start Seeding Event Urgencies Data'); - return seedPredefine('EventUrgency', error => { + const namespace = 'EventUrgency'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Urgencies Data'); return done(error); }); @@ -648,7 +1069,8 @@ const seedEventUrgencies = done => { */ const seedPartyGroups = done => { debug('Start Seeding Party Groups Data'); - return seedPredefine('PartyGroup', error => { + const namespace = 'PartyGroup'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Party Groups Data'); return done(error); }); @@ -672,7 +1094,8 @@ const seedPartyGroups = done => { */ const seedPartyRoles = done => { debug('Start Seeding Party Roles Data'); - return seedPredefine('PartyRole', error => { + const namespace = 'PartyRole'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Party Roles Data'); return done(error); }); @@ -696,7 +1119,8 @@ const seedPartyRoles = done => { */ const seedEventGroups = done => { debug('Start Seeding Event Groups Data'); - return seedPredefine('EventGroup', error => { + const namespace = 'EventGroup'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Groups Data'); return done(error); }); @@ -720,7 +1144,8 @@ const seedEventGroups = done => { */ const seedEventTypes = done => { debug('Start Seeding Event Types Data'); - return seedPredefine('EventType', error => { + const namespace = 'EventType'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Types Data'); return done(error); }); @@ -744,7 +1169,8 @@ const seedEventTypes = done => { */ const seedEventFunctions = done => { debug('Start Seeding Event Functions Data'); - return seedPredefine('EventFunction', error => { + const namespace = 'EventFunction'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Functions Data'); return done(error); }); @@ -768,7 +1194,8 @@ const seedEventFunctions = done => { */ const seedEventActions = done => { debug('Start Seeding Event Actions Data'); - return seedPredefine('EventAction', error => { + const namespace = 'EventAction'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Actions Data'); return done(error); }); @@ -792,7 +1219,8 @@ const seedEventActions = done => { */ const seedEventQuestions = done => { debug('Start Seeding Event Questions Data'); - return seedPredefine('EventQuestion', error => { + const namespace = 'EventQuestion'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Questions Data'); return done(error); }); @@ -816,12 +1244,63 @@ const seedEventQuestions = done => { */ const seedAdministrativeAreas = done => { debug('Start Seeding Administrative Areas Data'); - return seedPredefine('AdministrativeArea', error => { + const namespace = 'AdministrativeArea'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Administrative Areas Data'); return done(error); }); }; +/** + * @function seedAgencies + * @name seedAgencies + * @description Seed agencies + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedAgencies(error => { ... }); + */ +const seedAgencies = done => { + debug('Start Seeding Agencies Data'); + const type = 'Agency'; + return seedParty({ type }, error => { + debug('Finish Seeding Agencies Data'); + return done(error); + }); +}; + +/** + * @function seedFocals + * @name seedFocals + * @description Seed agencies + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedFocals(error => { ... }); + */ +const seedFocals = done => { + debug('Start Seeding Focals Data'); + const type = 'Focal'; + return seedParty({ type }, error => { + debug('Finish Seeding Focals Data'); + return done(error); + }); +}; + /** * @function seedFeatures * @name seedFeatures @@ -840,7 +1319,8 @@ const seedAdministrativeAreas = done => { */ const seedFeatures = done => { debug('Start Seeding Features Data'); - return seedPredefine('Feature', error => { + const namespace = 'Feature'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Features Data'); return done(error); }); @@ -864,7 +1344,8 @@ const seedFeatures = done => { */ const seedEventCatalogues = done => { debug('Start Seeding Event Catalogues Data'); - return seedPredefine('EventCatalogue', error => { + const namespace = 'EventCatalogue'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Event Catalogues Data'); return done(error); }); @@ -888,12 +1369,37 @@ const seedEventCatalogues = done => { */ const seedNotificationTemplates = done => { debug('Start Seeding Notification Templates Data'); - return seedPredefine('NotificationTemplate', error => { + const namespace = 'NotificationTemplate'; + return seedPredefine({ namespace }, error => { debug('Finish Seeding Notification Templates Data'); return done(error); }); }; +/** + * @function seedEvents + * @name seedEvents + * @description seed events + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedEvents(error => { ... }); + */ +const seedEvents = done => { + debug('Start Seeding Events Data'); + return seedEvent({}, error => { + debug('Finish Seeding Events Data'); + return done(error); + }); +}; + /** * @function seed * @name seed @@ -930,11 +1436,12 @@ const seed = done => { seedEventActions, seedEventQuestions, seedAdministrativeAreas, - // seedParties(seedAgencies, seedFocals), + seedAgencies, + seedFocals, seedFeatures, seedEventCatalogues, seedNotificationTemplates, - // seedEvents, + seedEvents, // seedEventChangeLogs, ]; @@ -950,4 +1457,4 @@ const seed = done => { }); }; -export { applyTransformsOn, connect, csvPathFor, dataPathFor, geoJsonPathFor, jsonPathFor, pathFor, seed, seedAdministrativeAreas, seedAdministrativeLevels, seedCsv, seedEventActions, seedEventCatalogues, seedEventCertainties, seedEventFunctions, seedEventGroups, seedEventIndicators, seedEventQuestions, seedEventSeverities, seedEventStatuses, seedEventTypes, seedEventUrgencies, seedFeatureTypes, seedFeatures, seedNotificationTemplates, seedPartyGroups, seedPartyRoles, seedPathFor, seedPermissions, seedPredefine, seedUnits, shapeFilePathFor, syncIndexes, transformSeedKeys, transformToPredefineSeed }; +export { applyTransformsOn, connect, csvPathFor, dataPathFor, geoJsonPathFor, jsonPathFor, pathFor, processCsvSeed, readCsvFile, seed, seedAdministrativeAreas, seedAdministrativeLevels, seedAgencies, seedEvent, seedEventActions, seedEventCatalogues, seedEventCertainties, seedEventFunctions, seedEventGroups, seedEventIndicators, seedEventQuestions, seedEventSeverities, seedEventStatuses, seedEventTypes, seedEventUrgencies, seedEvents, seedFeatureTypes, seedFeatures, seedFocals, seedFromCsv, seedFromJson, seedFromSeeds, seedNotificationTemplates, seedParty, seedPartyGroups, seedPartyRoles, seedPathFor, seedPermissions, seedPredefine, seedUnits, shapeFilePathFor, syncIndexes, transformSeedKeys, transformToEventSeed, transformToPartySeed, transformToPredefineSeed }; diff --git a/lib/index.js b/lib/index.js index 424f77a..ecd46c4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -206,10 +206,9 @@ const geoJsonPathFor = modelName => { * * jsonPathFor('events'); * => /home/ewea/seeds/events.json - * => /home/ewea/seeds/events.js */ const jsonPathFor = modelName => { - const fileName = `${common.pluralize(lodash.toLower(modelName))}`; + const fileName = `${common.pluralize(lodash.toLower(modelName))}.json`; const jsonFilePath = dataPathFor(fileName); return jsonFilePath; }; @@ -249,6 +248,49 @@ const transformSeedKeys = seed => { return transformed; }; +/** + * @function applyTransformsOn + * @name applyTransformsOn + * @description Transform and normalize seed + * @param {object|object[]} seed valid seed(s) + * @param {...Function} [transformers] transform to apply on seed + * @returns {object} transformed seed + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * applyTransformsOn({ Name: 'John Doe' }); + * => { name: 'John Doe' } + */ +const applyTransformsOn = (seed, ...transformers) => { + // copy seed + let data = common.compact([].concat(seed)); + + data = lodash.map(data, value => { + // copy value + let transformed = common.mergeObjects(value); + + // ensure transformers + const transforms = common.compact([transformSeedKeys].concat(transformers)); + + // apply transform sequentially + lodash.forEach(transforms, applyTransformOn => { + transformed = applyTransformOn(transformed); + }); + + // return transformed + return transformed; + }); + + // return + data = lodash.isArray(seed) ? data : lodash.first(data); + return data; +}; + /** * @function transformToPredefineSeed * @name transformToPredefineSeed @@ -271,7 +313,7 @@ const transformToPredefineSeed = seed => { const data = common.mergeObjects(seed); // normalize to predefine - const predefine$1 = predefine.transformToPredefine(data); + let predefine$1 = predefine.transformToPredefine(data); // transform relations const populate = {}; @@ -279,61 +321,118 @@ const transformToPredefineSeed = seed => { const hasRelation = key && seed[key]; if (hasRelation) { const options = common.mergeObjects(value); - const path = `relations.${key}`; - const model = options.ref || eweaInternals.MODEL_NAME_PREDEFINE; + const path = `relations.${options.path || key}`; + const modelName = options.ref || eweaInternals.MODEL_NAME_PREDEFINE; const array = options.array || false; const vals = common.sortedUniq(lodash.split(seed[key], ',')); const match = - model === eweaInternals.MODEL_NAME_PREDEFINE + modelName === eweaInternals.MODEL_NAME_PREDEFINE ? { 'strings.name.en': { $in: vals } } : { name: { $in: vals } }; - populate[path] = { model, match, array }; + populate[path] = { model: modelName, match, array }; } }); predefine$1.populate = populate; // return + predefine$1 = lodash.omit(predefine$1, ...[...lodash.keys(eweaInternals.PREDEFINE_RELATIONS), 'relations']); return predefine$1; }; /** - * @function applyTransformsOn - * @name applyTransformsOn - * @description Transform and normalize seed + * @function transformToPartySeed + * @name transformToPartySeed + * @description Transform and normalize given seed to party seed * @param {object} seed valid seed - * @param {...Function} [transformers] transform to apply on seed - * @returns {object} transformed seed + * @returns {object} valid party seed * @author lally elias * @license MIT - * @since 0.3.0 + * @since 0.6.0 * @version 0.1.0 * @static * @public * @example * - * applyTransformsOn({ Name: 'John Doe' }); + * transformToPartySeed({ Name: 'John Doe' }); * => { name: 'John Doe' } */ -const applyTransformsOn = (seed, ...transformers) => { +const transformToPartySeed = seed => { // copy seed let data = common.mergeObjects(seed); - // ensure transformers - const transforms = common.compact([transformSeedKeys].concat(transformers)); + // transform relations + const populate = {}; + lodash.forEach(eweaInternals.PARTY_RELATIONS, (value, key) => { + const hasRelation = key && data[key]; + if (hasRelation) { + const options = common.mergeObjects(value); + const path = `${options.path || key}`; + const modelName = options.ref || eweaInternals.MODEL_NAME_PREDEFINE; + const array = options.array || false; + const vals = common.sortedUniq(lodash.split(data[key], ',')); + const match = + modelName === eweaInternals.MODEL_NAME_PREDEFINE + ? { 'strings.name.en': { $in: vals } } + : { name: { $in: vals } }; + populate[path] = { model: modelName, match, array }; + } + }); + data.populate = populate; + + // return + data = lodash.omit(data, ...[...lodash.keys(eweaInternals.PARTY_RELATIONS), 'relations', 'namespace']); + return data; +}; + +/** + * @function transformToEventSeed + * @name transformToEventSeed + * @description Transform and normalize given seed to event seed + * @param {object} seed valid seed + * @returns {object} valid party seed + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * transformToEventSeed({ Name: 'John Doe' }); + * => { name: 'John Doe' } + */ +const transformToEventSeed = seed => { + // copy seed + let data = common.mergeObjects(seed); - // apply transform sequentially - lodash.forEach(transforms, applyTransformOn => { - data = applyTransformOn(data); + // transform relations + const populate = {}; + lodash.forEach(eweaInternals.EVENT_RELATIONS, (value, key) => { + const hasRelation = key && data[key]; + if (hasRelation) { + const options = common.mergeObjects(value); + const path = `${options.path || key}`; + const modelName = options.ref || eweaInternals.MODEL_NAME_PREDEFINE; + const array = options.array || false; + const vals = common.sortedUniq(lodash.split(data[key], ',')); + const match = + modelName === eweaInternals.MODEL_NAME_PREDEFINE + ? { 'strings.name.en': { $in: vals } } + : { name: { $in: vals } }; + populate[path] = { model: modelName, match, array }; + } }); + data.populate = populate; // return + data = lodash.omit(data, ...[...lodash.keys(eweaInternals.EVENT_RELATIONS), 'relations', 'namespace']); return data; }; /** - * @function seedCsv - * @name seedCsv - * @description Read csv seed and apply see transforms + * @function readCsvFile + * @name readCsvFile + * @description Read csv seed and apply seed transforms * @param {string} path valid csv path * @param {Function[]} [transformers] transforms to apply on seed * @param {Function} done callback to invoke on next seed @@ -346,9 +445,9 @@ const applyTransformsOn = (seed, ...transformers) => { * @public * @example * - * seedCsv(path, transforms, (error, { finished, feature, next }) => { ... }); + * readCsvFile(path, transforms, (error, { finished, feature, next }) => { ... }); */ -const seedCsv = (path, transformers, done) => { +const readCsvFile = (path, transformers, done) => { return geoTools.readCsv({ path }, (error, { finished, feature, next }) => { let data = feature; if (!lodash.isEmpty(feature) && next && !finished) { @@ -358,11 +457,230 @@ const seedCsv = (path, transformers, done) => { }); }; +/** + * @function processCsvSeed + * @name processCsvSeed + * @description process each csv row (data) + * @param {object} [options] valid options + * @param {string} [options.Model=undefined] valid model name + * @param {object} [options.properties={}] valid extra properties to merge on each seed + * @param {string} [options.namespace=undefined] valid predefine namespace + * @param {boolean} [options.throws=false] whether to throw error + * @param {Function} done callback to invoke on success or error + * @returns {Function} call back function + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const options = { Model = undefined, properties = {}, namespace = undefined, throws = false } + * processCsvSeed((options,done) => (error,{finished,feature,next}) => { ... }); + */ +const processCsvSeed = ( + { Model = undefined, properties = {}, namespace = undefined, throws = false }, + done +) => (error, { finished, feature, next }) => { + // handle file read errors + if (error) { + return throws ? done(error) : done(); + } + // handle read finish + if (finished) { + return done(); + } + // process datas + if (feature && next) { + // seed data & next chunk from csv read stream + const data = common.mergeObjects(properties, { namespace }, feature); + return Model.seed(data, next); + } + // request next chunk from csv read stream + return next && next(); +}; + +/** + * @function seedFromCsv + * @name seedFromCsv + * @description Seed given model from csv file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {string} [optns.namespace] valid predefine namespace + * @param {boolean} [optns.throws=false] whether to throw error + * @param {string} [optns.filePath=undefined] valid full file path for csv seed + * @param {object} [optns.properties={}] extra properties to merge on each seed + * @param {Function[]} [optns.transformers] valid predefine transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ..., transformers: [ ... ] }; + * seedFromCsv(optns, error => { ... }); + */ +const seedFromCsv = (optns, done) => { + // normalize options + const { + filePath = undefined, + properties = {}, + modelName = undefined, + namespace = undefined, + throws = false, + transformers = [], + } = common.mergeObjects(optns); + + // do: seed data to model if exists + const Model = mongooseCommon.model(modelName); + if (Model) { + // prepare seed options + const isPredefine = + modelName === eweaInternals.MODEL_NAME_PREDEFINE && !lodash.isEmpty(namespace); + const csvFilePath = filePath || csvPathFor(namespace || modelName); + const appliedTransformers = isPredefine + ? [transformToPredefineSeed, ...transformers] + : [...transformers]; + + // seed from csv + return readCsvFile( + csvFilePath, + appliedTransformers, + processCsvSeed({ Model, properties, throws }, done) + ); + } + + // backoff: no data model found + return done(); +}; + +/** + * @function seedFromJson + * @name seedFromJson + * @description Seed given model from json file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {string} [optns.namespace] valid predefine namespace + * @param {boolean} [optns.throws=false] whether to throw error + * @param {string} [optns.filePath=undefined] valid full file path for json seed + * @param {object} [optns.properties={}] extra properties to merge on each seed + * @param {Function[]} [optns.transformers] valid predefine transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ..., transformers: [ ... ] }; + * seedFromJson(optns, error => { ... }); + */ +const seedFromJson = (optns, done) => { + // normalize options + const { + filePath = undefined, + properties = {}, + modelName = undefined, + namespace = undefined, + throws = false, + transformers = [], + } = common.mergeObjects(optns); + + // do: seed data to model if exists + const Model = mongooseCommon.model(modelName); + if (Model) { + // prepare seed options + const isPredefine = + modelName === eweaInternals.MODEL_NAME_PREDEFINE && !lodash.isEmpty(namespace); + const jsonFilePath = filePath || jsonPathFor(namespace || modelName); + const appliedTransformers = isPredefine + ? [transformToPredefineSeed, ...transformers] + : [...transformers]; + + // prepare json seed stages + const path = lodash.endsWith(jsonFilePath, '.json') + ? jsonFilePath + : `${jsonFilePath}.json`; + return geoTools.readJson({ path, throws }, (error, data) => { + if (!lodash.isEmpty(data)) { + const transform = seed => { + const merged = common.mergeObjects(properties, { namespace }, seed); + return applyTransformsOn(merged, ...appliedTransformers); + }; + return Model.seed({ data, transform }, done); + } + return done(error, data); + }); + } + // backoff: no data model found + return done(); +}; + +/** + * @function seedFromSeeds + * @name seedFromSeeds + * @description Seed given model from seeds file + * @param {object} optns valid seed options + * @param {string} [optns.modelName] valid model name + * @param {boolean} [optns.throws=false] whether to throw error + * @param {Function} [optns.filter=undefined] seed data filter + * @param {Function} [optns.transform=undefined] seed data transformer + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.6.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * const opts = { modelName: ... }; + * seedFromSeeds(optns, error => { ... }); + */ +const seedFromSeeds = (optns, done) => { + // normalize options + const { + modelName = undefined, + throws = false, + filter, + transform, + } = common.mergeObjects(optns); + + // do: seed data to model if seeds exists + const Model = mongooseCommon.model(modelName); + const canSeed = Model && lodash.isFunction(Model.seed); + if (canSeed) { + // filter, transform & seed + return Model.seed({ filter, transform }, (error, results) => { + // reply with errors + if (throws) { + return done(error, results); + } + // ignore errors + return done(null, results); + }); + } + // backoff: no data model found + return done(); +}; + /** * @function seedPredefine * @name seedPredefine * @description Seed given predefine namespace - * @param {string} namespace valid predefine namespace + * @param {object} optns valid seed options + * @param {string} optns.namespace valid predefine namespace + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid predefine transformers * @param {Function} done callback to invoke on success or error * @returns {Error|undefined} error if fails else undefined * @author lally elias @@ -373,39 +691,128 @@ const seedCsv = (path, transformers, done) => { * @public * @example * - * seedPredefine(namespace, error => { ... }); - */ -const seedPredefine = (namespace, done) => { - const csvFilePath = csvPathFor(namespace); - const transformers = [transformToPredefineSeed]; - const stages = [ - then => { - seedCsv( - csvFilePath, - transformers, - (error, { finished, feature, next }) => { - // handle read errors - if (error) { - return then(error); - } - // handle read finish - if (finished) { - return then(); - } - // process features - if (feature && next) { - // seed feature - const data = common.mergeObjects(feature, { namespace }); - return predefine.Predefine.seed(data, (err, seeded) => { - return next(err, seeded); - }); - } - // request next chunk from stream - return next && next(); - } - ); - }, - ]; + * seedPredefine(optns, error => { ... }); + */ +const seedPredefine = (optns, done) => { + // normalize options + const { + modelName = eweaInternals.MODEL_NAME_PREDEFINE, + namespace = undefined, + throws = false, + transformers = [], + } = common.mergeObjects(optns); + + // prepare namespace filter + const filter = seed => seed.namespace === namespace; + + // prepare options + const options = { modelName, namespace, throws, transformers, filter }; + + // prepare predefine seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed predefine + return async.waterfall(stages, done); +}; + +/** + * @function seedParty + * @name seedParty + * @description Seed given parties + * @param {object} optns valid seed options + * @param {string} optns.type valid party type + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid party transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedParty(optns, error => { ... }); + */ +const seedParty = (optns, done) => { + // normalize options + const { + modelName = eweaInternals.MODEL_NAME_PARTY, + type = 'Focal', + throws = false, + transformers = [], + } = common.mergeObjects(optns); + + // prepare type filter + const filter = seed => seed.type === type; + + // prepare options + const options = { + modelName, + namespace: type, + properties: { type }, + type, + throws, + transformers: [transformToPartySeed, ...transformers], + filter, + }; + + // prepare party seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed party + return async.waterfall(stages, done); +}; + +/** + * @function seedEvent + * @name seedEvent + * @description Seed given events + * @param {object} optns valid seed options + * @param {boolean} [optns.throws=false] whether to ignore error + * @param {Function[]} optns.transformers valid event transformers + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.3.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedEvent(optns, error => { ... }); + */ +const seedEvent = (optns, done) => { + // normalize options + const { + modelName = eweaInternals.MODEL_NAME_EVENT, + throws = false, + transformers = [], + } = common.mergeObjects(optns); + + // prepare options + const options = { + modelName, + properties: {}, + throws, + transformers: [transformToEventSeed, ...transformers], + }; + + // prepare event seed stages + const fromSeeds = next => seedFromSeeds(options, error => next(error)); + const fromJson = next => seedFromJson(options, error => next(error)); + const fromCsv = next => seedFromCsv(options, error => next(error)); + const stages = [fromSeeds, fromJson, fromCsv]; + + // do seed event return async.waterfall(stages, done); }; @@ -427,16 +834,22 @@ const seedPredefine = (namespace, done) => { */ const seedPermissions = done => { logger.debug('Start Seeding Permissions Data'); - return async.waterfall( - [ - next => permission.Permission.seed(error => next(error)), - next => permission.Permission.seed(predefine.listPermissions(), error => next(error)), - ], - error => { - logger.debug('Finish Seeding Permissions Data'); - return done(error); - } - ); + + // prepare permissions seed stages + const seedResourcePermissions = next => { + return permission.Permission.seed(error => next(error)); + }; + const seedPredefineNamespacePermissions = next => { + const namespacePermissions = predefine.listPermissions(); + return permission.Permission.seed(namespacePermissions, error => next(error)); + }; + const stages = [seedResourcePermissions, seedPredefineNamespacePermissions]; + + // do seed permissions + return async.waterfall(stages, error => { + logger.debug('Finish Seeding Permissions Data'); + return done(error); + }); }; /** @@ -457,7 +870,8 @@ const seedPermissions = done => { */ const seedUnits = done => { logger.debug('Start Seeding Units Data'); - return seedPredefine('Unit', error => { + const namespace = 'Unit'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Units Data'); return done(error); }); @@ -481,7 +895,8 @@ const seedUnits = done => { */ const seedAdministrativeLevels = done => { logger.debug('Start Seeding Administrative Levels Data'); - return seedPredefine('AdministrativeLevel', error => { + const namespace = 'AdministrativeLevel'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Administrative Levels Data'); return done(error); }); @@ -505,7 +920,8 @@ const seedAdministrativeLevels = done => { */ const seedFeatureTypes = done => { logger.debug('Start Seeding Feature Types Data'); - return seedPredefine('FeatureType', error => { + const namespace = 'FeatureType'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Feature Types Data'); return done(error); }); @@ -529,7 +945,8 @@ const seedFeatureTypes = done => { */ const seedEventIndicators = done => { logger.debug('Start Seeding Event Indicators Data'); - return seedPredefine('EventIndicator', error => { + const namespace = 'EventIndicator'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Indicators Data'); return done(error); }); @@ -553,7 +970,8 @@ const seedEventIndicators = done => { */ const seedEventSeverities = done => { logger.debug('Start Seeding Event Severities Data'); - return seedPredefine('EventSeverity', error => { + const namespace = 'EventSeverity'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Severities Data'); return done(error); }); @@ -577,7 +995,8 @@ const seedEventSeverities = done => { */ const seedEventCertainties = done => { logger.debug('Start Seeding Event Certainties Data'); - return seedPredefine('EventCertainty', error => { + const namespace = 'EventCertainty'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Certainties Data'); return done(error); }); @@ -601,7 +1020,8 @@ const seedEventCertainties = done => { */ const seedEventStatuses = done => { logger.debug('Start Seeding Event Statuses Data'); - return seedPredefine('EventStatus', error => { + const namespace = 'EventStatus'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Statuses Data'); return done(error); }); @@ -625,7 +1045,8 @@ const seedEventStatuses = done => { */ const seedEventUrgencies = done => { logger.debug('Start Seeding Event Urgencies Data'); - return seedPredefine('EventUrgency', error => { + const namespace = 'EventUrgency'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Urgencies Data'); return done(error); }); @@ -649,7 +1070,8 @@ const seedEventUrgencies = done => { */ const seedPartyGroups = done => { logger.debug('Start Seeding Party Groups Data'); - return seedPredefine('PartyGroup', error => { + const namespace = 'PartyGroup'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Party Groups Data'); return done(error); }); @@ -673,7 +1095,8 @@ const seedPartyGroups = done => { */ const seedPartyRoles = done => { logger.debug('Start Seeding Party Roles Data'); - return seedPredefine('PartyRole', error => { + const namespace = 'PartyRole'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Party Roles Data'); return done(error); }); @@ -697,7 +1120,8 @@ const seedPartyRoles = done => { */ const seedEventGroups = done => { logger.debug('Start Seeding Event Groups Data'); - return seedPredefine('EventGroup', error => { + const namespace = 'EventGroup'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Groups Data'); return done(error); }); @@ -721,7 +1145,8 @@ const seedEventGroups = done => { */ const seedEventTypes = done => { logger.debug('Start Seeding Event Types Data'); - return seedPredefine('EventType', error => { + const namespace = 'EventType'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Types Data'); return done(error); }); @@ -745,7 +1170,8 @@ const seedEventTypes = done => { */ const seedEventFunctions = done => { logger.debug('Start Seeding Event Functions Data'); - return seedPredefine('EventFunction', error => { + const namespace = 'EventFunction'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Functions Data'); return done(error); }); @@ -769,7 +1195,8 @@ const seedEventFunctions = done => { */ const seedEventActions = done => { logger.debug('Start Seeding Event Actions Data'); - return seedPredefine('EventAction', error => { + const namespace = 'EventAction'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Actions Data'); return done(error); }); @@ -793,7 +1220,8 @@ const seedEventActions = done => { */ const seedEventQuestions = done => { logger.debug('Start Seeding Event Questions Data'); - return seedPredefine('EventQuestion', error => { + const namespace = 'EventQuestion'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Questions Data'); return done(error); }); @@ -817,12 +1245,63 @@ const seedEventQuestions = done => { */ const seedAdministrativeAreas = done => { logger.debug('Start Seeding Administrative Areas Data'); - return seedPredefine('AdministrativeArea', error => { + const namespace = 'AdministrativeArea'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Administrative Areas Data'); return done(error); }); }; +/** + * @function seedAgencies + * @name seedAgencies + * @description Seed agencies + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedAgencies(error => { ... }); + */ +const seedAgencies = done => { + logger.debug('Start Seeding Agencies Data'); + const type = 'Agency'; + return seedParty({ type }, error => { + logger.debug('Finish Seeding Agencies Data'); + return done(error); + }); +}; + +/** + * @function seedFocals + * @name seedFocals + * @description Seed agencies + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedFocals(error => { ... }); + */ +const seedFocals = done => { + logger.debug('Start Seeding Focals Data'); + const type = 'Focal'; + return seedParty({ type }, error => { + logger.debug('Finish Seeding Focals Data'); + return done(error); + }); +}; + /** * @function seedFeatures * @name seedFeatures @@ -841,7 +1320,8 @@ const seedAdministrativeAreas = done => { */ const seedFeatures = done => { logger.debug('Start Seeding Features Data'); - return seedPredefine('Feature', error => { + const namespace = 'Feature'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Features Data'); return done(error); }); @@ -865,7 +1345,8 @@ const seedFeatures = done => { */ const seedEventCatalogues = done => { logger.debug('Start Seeding Event Catalogues Data'); - return seedPredefine('EventCatalogue', error => { + const namespace = 'EventCatalogue'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Event Catalogues Data'); return done(error); }); @@ -889,12 +1370,37 @@ const seedEventCatalogues = done => { */ const seedNotificationTemplates = done => { logger.debug('Start Seeding Notification Templates Data'); - return seedPredefine('NotificationTemplate', error => { + const namespace = 'NotificationTemplate'; + return seedPredefine({ namespace }, error => { logger.debug('Finish Seeding Notification Templates Data'); return done(error); }); }; +/** + * @function seedEvents + * @name seedEvents + * @description seed events + * @param {Function} done callback to invoke on success or error + * @returns {Error|undefined} error if fails else undefined + * @author lally elias + * @license MIT + * @since 0.4.0 + * @version 0.1.0 + * @static + * @public + * @example + * + * seedEvents(error => { ... }); + */ +const seedEvents = done => { + logger.debug('Start Seeding Events Data'); + return seedEvent({}, error => { + logger.debug('Finish Seeding Events Data'); + return done(error); + }); +}; + /** * @function seed * @name seed @@ -931,11 +1437,12 @@ const seed = done => { seedEventActions, seedEventQuestions, seedAdministrativeAreas, - // seedParties(seedAgencies, seedFocals), + seedAgencies, + seedFocals, seedFeatures, seedEventCatalogues, seedNotificationTemplates, - // seedEvents, + seedEvents, // seedEventChangeLogs, ]; @@ -966,10 +1473,13 @@ exports.dataPathFor = dataPathFor; exports.geoJsonPathFor = geoJsonPathFor; exports.jsonPathFor = jsonPathFor; exports.pathFor = pathFor; +exports.processCsvSeed = processCsvSeed; +exports.readCsvFile = readCsvFile; exports.seed = seed; exports.seedAdministrativeAreas = seedAdministrativeAreas; exports.seedAdministrativeLevels = seedAdministrativeLevels; -exports.seedCsv = seedCsv; +exports.seedAgencies = seedAgencies; +exports.seedEvent = seedEvent; exports.seedEventActions = seedEventActions; exports.seedEventCatalogues = seedEventCatalogues; exports.seedEventCertainties = seedEventCertainties; @@ -981,9 +1491,15 @@ exports.seedEventSeverities = seedEventSeverities; exports.seedEventStatuses = seedEventStatuses; exports.seedEventTypes = seedEventTypes; exports.seedEventUrgencies = seedEventUrgencies; +exports.seedEvents = seedEvents; exports.seedFeatureTypes = seedFeatureTypes; exports.seedFeatures = seedFeatures; +exports.seedFocals = seedFocals; +exports.seedFromCsv = seedFromCsv; +exports.seedFromJson = seedFromJson; +exports.seedFromSeeds = seedFromSeeds; exports.seedNotificationTemplates = seedNotificationTemplates; +exports.seedParty = seedParty; exports.seedPartyGroups = seedPartyGroups; exports.seedPartyRoles = seedPartyRoles; exports.seedPathFor = seedPathFor; @@ -993,4 +1509,6 @@ exports.seedUnits = seedUnits; exports.shapeFilePathFor = shapeFilePathFor; exports.syncIndexes = syncIndexes; exports.transformSeedKeys = transformSeedKeys; +exports.transformToEventSeed = transformToEventSeed; +exports.transformToPartySeed = transformToPartySeed; exports.transformToPredefineSeed = transformToPredefineSeed;