Y4W4MACPKH3IVO6JIQYGN4V5LR6EM6RPZEJ4RHH6ZBZUDA63AGRQC NMMR2KTK6PLGLUPKJQUUIA4KKMTKBOPNHPYD3HRHIGUV6ZYANYWQC SE6MCCXTIXSGMAH5EL7EPDXIQKV6THCCY2H4OQJJQOHCUQAWE5VQC T2BEPW7GP45VJBMXIPJ2RX6W2FNULCLZWLSRW2LFF43WWGUM24DQC QHLBAGVYOB6KEAHAJMUTN236VSPFNOYAIKAPQJPF75YBBUXLU5PQC YHCZCZJ2VJPIBOSIHZIBRHITOU47MOA52LYIIFGV7YIPP7ZC4XCQC 4WREYORZT3SWUXADWHSS6B4PQSP3QSLH77CGNKRH6IRKUMX4TARAC VO5G3FF3NDOKCIF2OU7G257R3XIPTFDCAMDTOVKHKOB5Z3I55KDQC # prerequisites* nodejs >= 13.8* imagemagick >= 7* jpegtran from libjpeg 9d, libjpeg-turbo >= 2.0.4 or mozjpeg >= 3.3.1* postgresql >= 12* git >= 2.25* [periods](https://github.com/xocolatl/periods) >= 1.1## periods installation if package not available```git clone https://github.com/xocolatl/periods.gitcd periods#apt-get install postgresql-server-dev-12make install #sudo if not root```
nano .env #if port 80 doesn't work, try 9001. get google maps API key from kevinnodemon server.js # or node server.js
nano .env #if port 80 doesn't work, try 9001. get google maps and cloudinary credentials from kevinnodemon server.js # or node server.js can pass --inspect to nodemon or node and use chrome debugger :)
`product_with_history` and any other columns suffixed with `with_history` are intentionally not foreign keys, since `temporal_tables` guarantees the validity. see http://clarkdave.net/2015/02/historical-records-with-postgresql-and-temporal-tables-and-sql-2011/
the history tables do not have any foreign keys because [periods](https://github.com/xocolatl/periods) guarantees the validity.
}},"ajv": {"version": "6.11.0","resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz","integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==","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"
"assert-plus": {"version": "1.0.0","resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz","integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="},"asynckit": {"version": "0.4.0","resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz","integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="},"aws-sign2": {"version": "0.7.0","resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz","integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="},"aws4": {"version": "1.9.1","resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz","integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="},
},"combined-stream": {"version": "1.0.8","resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz","integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==","requires": {"delayed-stream": "~1.0.0"}
},"extend": {"version": "3.0.2","resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz","integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="},"extsprintf": {"version": "1.3.0","resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz","integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
"fast-deep-equal": {"version": "3.1.1","resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz","integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="},"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=="},"forever-agent": {"version": "0.6.1","resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz","integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="},"form-data": {"version": "2.3.3","resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz","integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==","requires": {"asynckit": "^0.4.0","combined-stream": "^1.0.6","mime-types": "^2.1.12"}},
}},"har-schema": {"version": "2.0.0","resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz","integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="},"har-validator": {"version": "5.1.3","resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz","integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==","requires": {"ajv": "^6.5.5","har-schema": "^2.0.0"
},"isstream": {"version": "0.1.2","resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz","integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="},"jsbn": {"version": "0.1.1","resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz","integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="},"json-schema": {"version": "0.2.3","resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz","integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
"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=="},"json-stringify-safe": {"version": "5.0.1","resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz","integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="},"jsprim": {"version": "1.4.1","resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz","integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=","requires": {"assert-plus": "1.0.0","extsprintf": "1.3.0","json-schema": "0.2.3","verror": "1.10.0"}},
"mime-db": {"version": "1.43.0","resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz","integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="},"mime-types": {"version": "2.1.26","resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz","integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==","requires": {"mime-db": "1.43.0"}},
}}},"request": {"version": "2.88.0","resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz","integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==","requires": {"aws-sign2": "~0.7.0","aws4": "^1.8.0","caseless": "~0.12.0","combined-stream": "~1.0.6","extend": "~3.0.2","forever-agent": "~0.6.1","form-data": "~2.3.2","har-validator": "~5.1.0","http-signature": "~1.2.0","is-typedarray": "~1.0.0","isstream": "~0.1.2","json-stringify-safe": "~5.0.1","mime-types": "~2.1.19","oauth-sign": "~0.9.0","performance-now": "^2.1.0","qs": "~6.5.2","safe-buffer": "^5.1.2","tough-cookie": "~2.4.3","tunnel-agent": "^0.6.0","uuid": "^3.3.2"},"dependencies": {"punycode": {"version": "1.4.1","resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz","integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="},"tough-cookie": {"version": "2.4.3","resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz","integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==","requires": {"psl": "^1.1.24","punycode": "^1.4.1"}
"sshpk": {"version": "1.16.1","resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz","integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==","requires": {"asn1": "~0.2.3","assert-plus": "^1.0.0","bcrypt-pbkdf": "^1.0.0","dashdash": "^1.12.0","ecc-jsbn": "~0.1.1","getpass": "^0.1.1","jsbn": "~0.1.0","safer-buffer": "^2.0.2","tweetnacl": "~0.14.0"}},
},"tunnel-agent": {"version": "0.6.0","resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz","integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=","requires": {"safe-buffer": "^5.0.1"}},"tweetnacl": {"version": "0.14.5","resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz","integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="