dev-config.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. /* eslint-disable no-console */
  2. import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
  3. import { AssetServerPlugin } from '@vendure/asset-server-plugin';
  4. import { ADMIN_API_PATH, API_PORT, SHOP_API_PATH } from '@vendure/common/lib/shared-constants';
  5. import {
  6. Asset,
  7. DefaultJobQueuePlugin,
  8. DefaultLogger,
  9. DefaultSearchPlugin,
  10. dummyPaymentHandler,
  11. LanguageCode,
  12. LogLevel,
  13. VendureConfig,
  14. } from '@vendure/core';
  15. import { ElasticsearchPlugin } from '@vendure/elasticsearch-plugin';
  16. import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';
  17. import { BullMQJobQueuePlugin } from '@vendure/job-queue-plugin/package/bullmq';
  18. import 'dotenv/config';
  19. import { compileUiExtensions } from '@vendure/ui-devkit/compiler';
  20. import path from 'path';
  21. import { DataSourceOptions } from 'typeorm';
  22. import { MultivendorPlugin } from './test-plugins/multivendor-plugin/multivendor.plugin';
  23. /**
  24. * Config settings used during development
  25. */
  26. export const devConfig: VendureConfig = {
  27. apiOptions: {
  28. port: API_PORT,
  29. adminApiPath: ADMIN_API_PATH,
  30. adminApiPlayground: {
  31. settings: {
  32. 'request.credentials': 'include',
  33. } as any,
  34. },
  35. adminApiDebug: true,
  36. shopApiPath: SHOP_API_PATH,
  37. shopApiPlayground: {
  38. settings: {
  39. 'request.credentials': 'include',
  40. } as any,
  41. },
  42. shopApiDebug: true,
  43. },
  44. authOptions: {
  45. disableAuth: false,
  46. tokenMethod: ['bearer', 'cookie'] as const,
  47. requireVerification: true,
  48. customPermissions: [],
  49. cookieOptions: {
  50. secret: 'abc',
  51. },
  52. },
  53. dbConnectionOptions: {
  54. synchronize: false,
  55. logging: false,
  56. migrations: [path.join(__dirname, 'migrations/*.ts')],
  57. ...getDbConfig(),
  58. },
  59. paymentOptions: {
  60. paymentMethodHandlers: [dummyPaymentHandler],
  61. },
  62. /* customFields: {
  63. ProductVariant: [
  64. {
  65. name: 'weight',
  66. type: 'int',
  67. defaultValue: 0,
  68. nullable: false,
  69. min: 0,
  70. step: 1,
  71. public: true,
  72. label: [{ languageCode: LanguageCode.en, value: 'Weight' }],
  73. ui: { component: 'number-form-input', suffix: 'g' },
  74. },
  75. {
  76. name: 'rrp',
  77. type: 'int',
  78. nullable: true,
  79. min: 0,
  80. step: 1,
  81. public: true,
  82. label: [{ languageCode: LanguageCode.en, value: 'RRP' }],
  83. ui: { component: 'currency-form-input' },
  84. },
  85. {
  86. name: 'gtin',
  87. type: 'string',
  88. nullable: true,
  89. public: true,
  90. label: [{ languageCode: LanguageCode.en, value: 'GTIN (barcode)' }],
  91. },
  92. {
  93. name: 'additionalInformation',
  94. type: 'text',
  95. nullable: true,
  96. public: true,
  97. label: [{ languageCode: LanguageCode.en, value: 'Additional Information' }],
  98. ui: { component: 'json-editor-form-input' },
  99. },
  100. ],
  101. Product: [
  102. {
  103. name: 'searchKeywords',
  104. label: [{ languageCode: LanguageCode.en, value: 'Search keywords' }],
  105. type: 'string',
  106. defaultValue: '',
  107. public: false,
  108. },
  109. {
  110. name: 'pageType',
  111. label: [{ languageCode: LanguageCode.en, value: 'Page type' }],
  112. type: 'string',
  113. defaultValue: 'default',
  114. public: true,
  115. options: [
  116. { value: 'default', label: [{ languageCode: LanguageCode.en, value: 'Default' }] },
  117. {
  118. value: 'colour-chart',
  119. label: [{ languageCode: LanguageCode.en, value: 'Colour chart' }],
  120. },
  121. {
  122. value: 'select-menu',
  123. label: [{ languageCode: LanguageCode.en, value: 'Select menu' }],
  124. },
  125. { value: 'gift-card', label: [{ languageCode: LanguageCode.en, value: 'Gift card' }] },
  126. ],
  127. ui: { tab: 'Display' },
  128. },
  129. {
  130. name: 'keyFeatures',
  131. label: [{ languageCode: LanguageCode.en, value: 'Key features' }],
  132. type: 'text',
  133. public: true,
  134. nullable: true,
  135. ui: { component: 'rich-text-form-input' },
  136. },
  137. {
  138. name: 'videoUrls',
  139. label: [{ languageCode: LanguageCode.en, value: 'Video urls' }],
  140. type: 'string',
  141. list: true,
  142. public: true,
  143. nullable: false,
  144. defaultValue: [],
  145. },
  146. {
  147. name: 'variantOrdering',
  148. label: [{ languageCode: LanguageCode.en, value: 'Variant ordering' }],
  149. type: 'string',
  150. defaultValue: 'default',
  151. public: true,
  152. options: [
  153. { value: 'default', label: [{ languageCode: LanguageCode.en, value: 'Default' }] },
  154. {
  155. value: 'alphabetical',
  156. label: [{ languageCode: LanguageCode.en, value: 'Alphabetical' }],
  157. },
  158. {
  159. value: 'brush-size',
  160. label: [{ languageCode: LanguageCode.en, value: 'Brush size (000, 00, 0, 1, ...)' }],
  161. },
  162. {
  163. value: 'dimension',
  164. label: [
  165. { languageCode: LanguageCode.en, value: 'Dimension (5" x 5", 10" x 12",...)' },
  166. ],
  167. },
  168. ],
  169. ui: { tab: 'Display' },
  170. },
  171. {
  172. name: 'seoTitle',
  173. type: 'localeString',
  174. public: true,
  175. label: [{ languageCode: LanguageCode.en, value: 'SEO Title' }],
  176. nullable: true,
  177. ui: { tab: 'SEO' },
  178. },
  179. {
  180. name: 'seoDescription',
  181. type: 'localeString',
  182. public: true,
  183. label: [{ languageCode: LanguageCode.en, value: 'SEO Description' }],
  184. nullable: true,
  185. ui: { tab: 'SEO', component: 'textarea-form-input' },
  186. },
  187. {
  188. name: 'seoImage',
  189. type: 'relation',
  190. entity: Asset,
  191. public: true,
  192. label: [{ languageCode: LanguageCode.en, value: 'SEO Image' }],
  193. nullable: true,
  194. ui: { tab: 'SEO' },
  195. },
  196. {
  197. name: 'boost',
  198. type: 'int',
  199. public: true,
  200. defaultValue: 0,
  201. min: 0,
  202. max: 5,
  203. label: [{ languageCode: LanguageCode.en, value: 'Boost in list pages' }],
  204. nullable: true,
  205. },
  206. {
  207. name: 'minimumOrderQuantity',
  208. type: 'int',
  209. public: true,
  210. min: 0,
  211. label: [{ languageCode: LanguageCode.en, value: 'Minimum order quantity' }],
  212. description: [
  213. {
  214. languageCode: LanguageCode.en,
  215. value: 'If set, the customer must order at least this number of any variants of this product',
  216. },
  217. ],
  218. nullable: true,
  219. },
  220. ],
  221. Collection: [
  222. {
  223. name: 'excludeFromNavMenu',
  224. label: [{ languageCode: LanguageCode.en, value: 'Exclude from nav menu' }],
  225. type: 'boolean',
  226. defaultValue: false,
  227. public: true,
  228. },
  229. {
  230. name: 'excludeFromSubCollections',
  231. label: [{ languageCode: LanguageCode.en, value: 'Exclude from sub collections' }],
  232. type: 'boolean',
  233. defaultValue: false,
  234. public: true,
  235. },
  236. {
  237. name: 'noIndex',
  238. label: [{ languageCode: LanguageCode.en, value: 'Do not allow crawlers to index' }],
  239. type: 'boolean',
  240. defaultValue: false,
  241. public: true,
  242. ui: { tab: 'SEO' },
  243. },
  244. {
  245. name: 'searchKeywords',
  246. label: [{ languageCode: LanguageCode.en, value: 'Search keywords' }],
  247. type: 'string',
  248. defaultValue: '',
  249. public: false,
  250. },
  251. {
  252. name: 'layout',
  253. type: 'string',
  254. public: true,
  255. nullable: false,
  256. defaultValue: 'fullWidth',
  257. label: [{ languageCode: LanguageCode.en, value: 'Layout mode' }],
  258. options: [
  259. { value: 'default', label: [{ languageCode: LanguageCode.en, value: 'Default' }] },
  260. { value: 'fullWidth', label: [{ languageCode: LanguageCode.en, value: 'Full width' }] },
  261. ],
  262. },
  263. {
  264. name: 'seoTitle',
  265. type: 'localeString',
  266. public: true,
  267. label: [{ languageCode: LanguageCode.en, value: 'SEO Meta Title' }],
  268. nullable: true,
  269. ui: { tab: 'SEO' },
  270. },
  271. {
  272. name: 'seoDescription',
  273. type: 'localeString',
  274. public: true,
  275. label: [{ languageCode: LanguageCode.en, value: 'SEO Meta Description' }],
  276. nullable: true,
  277. ui: { tab: 'SEO', component: 'textarea-form-input' },
  278. },
  279. {
  280. name: 'seoImage',
  281. type: 'relation',
  282. entity: Asset,
  283. public: true,
  284. label: [{ languageCode: LanguageCode.en, value: 'SEO Meta Image' }],
  285. nullable: true,
  286. ui: { tab: 'SEO' },
  287. },
  288. {
  289. name: 'extendedDescription',
  290. type: 'text',
  291. public: true,
  292. label: [{ languageCode: LanguageCode.en, value: 'Extended description' }],
  293. nullable: true,
  294. ui: { tab: 'SEO', component: 'rich-text-form-input' },
  295. },
  296. {
  297. name: 'isOfferCollection',
  298. type: 'boolean',
  299. public: true,
  300. label: [{ languageCode: LanguageCode.en, value: 'Is offer collecion' }],
  301. nullable: true,
  302. defaultValue: false,
  303. ui: { tab: 'Offers' },
  304. },
  305. {
  306. name: 'offerName',
  307. type: 'string',
  308. public: true,
  309. label: [{ languageCode: LanguageCode.en, value: 'Offer name' }],
  310. nullable: true,
  311. ui: { tab: 'Offers' },
  312. },
  313. {
  314. name: 'offerDescription',
  315. type: 'string',
  316. public: true,
  317. label: [{ languageCode: LanguageCode.en, value: 'Offer description' }],
  318. nullable: true,
  319. ui: { tab: 'Offers', component: 'rich-text-form-input' },
  320. },
  321. {
  322. name: 'displayRrpDiscount',
  323. type: 'boolean',
  324. public: true,
  325. label: [{ languageCode: LanguageCode.en, value: 'Display RRP discount' }],
  326. description: [
  327. {
  328. languageCode: LanguageCode.en,
  329. value: 'When enabled, the RRP discount of included products will be displayed in the storefront',
  330. },
  331. ],
  332. nullable: true,
  333. ui: { tab: 'Offers' },
  334. },
  335. ],
  336. }, */
  337. logger: new DefaultLogger({ level: LogLevel.Verbose }),
  338. importExportOptions: {
  339. importAssetsDir: path.join(__dirname, 'import-assets'),
  340. },
  341. plugins: [
  342. // MultivendorPlugin,
  343. AssetServerPlugin.init({
  344. route: 'assets',
  345. assetUploadDir: path.join(__dirname, 'assets'),
  346. }),
  347. DefaultSearchPlugin.init({ bufferUpdates: false, indexStockStatus: false }),
  348. BullMQJobQueuePlugin.init({}),
  349. // DefaultJobQueuePlugin.init({}),
  350. // JobQueueTestPlugin.init({ queueCount: 10 }),
  351. // ElasticsearchPlugin.init({
  352. // host: 'http://localhost',
  353. // port: 9200,
  354. // bufferUpdates: true,
  355. // }),
  356. EmailPlugin.init({
  357. devMode: true,
  358. route: 'mailbox',
  359. handlers: defaultEmailHandlers,
  360. templatePath: path.join(__dirname, '../email-plugin/templates'),
  361. outputPath: path.join(__dirname, 'test-emails'),
  362. globalTemplateVars: {
  363. verifyEmailAddressUrl: 'http://localhost:4201/verify',
  364. passwordResetUrl: 'http://localhost:4201/reset-password',
  365. changeEmailAddressUrl: 'http://localhost:4201/change-email-address',
  366. },
  367. }),
  368. AdminUiPlugin.init({
  369. route: 'admin',
  370. port: 5001,
  371. // Un-comment to compile a custom admin ui
  372. // app: compileUiExtensions({
  373. // outputPath: path.join(__dirname, './custom-admin-ui'),
  374. // extensions: [
  375. // {
  376. // extensionPath: path.join(__dirname, 'test-plugins/with-ui-extension/ui'),
  377. // ngModules: [
  378. // {
  379. // type: 'lazy',
  380. // route: 'greet',
  381. // ngModuleFileName: 'greeter.module.ts',
  382. // ngModuleName: 'GreeterModule',
  383. // },
  384. // ],
  385. // },
  386. // ],
  387. // devMode: true,
  388. // }),
  389. }),
  390. ],
  391. };
  392. function getDbConfig(): DataSourceOptions {
  393. const dbType = process.env.DB || 'mysql';
  394. switch (dbType) {
  395. case 'postgres':
  396. console.log('Using postgres connection');
  397. return {
  398. synchronize: false,
  399. type: 'postgres',
  400. host: process.env.DB_HOST || 'localhost',
  401. port: Number(process.env.DB_PORT) || 5432,
  402. username: process.env.DB_USERNAME || 'postgres',
  403. password: process.env.DB_PASSWORD || 'postgres',
  404. database: process.env.DB_NAME || 'vendure',
  405. schema: process.env.DB_SCHEMA || 'public',
  406. };
  407. case 'sqlite':
  408. console.log('Using sqlite connection');
  409. return {
  410. synchronize: false,
  411. type: 'better-sqlite3',
  412. database: path.join(__dirname, 'vendure.sqlite'),
  413. };
  414. case 'sqljs':
  415. console.log('Using sql.js connection');
  416. return {
  417. type: 'sqljs',
  418. autoSave: true,
  419. database: new Uint8Array([]),
  420. location: path.join(__dirname, 'vendure.sqlite'),
  421. };
  422. case 'mysql':
  423. default:
  424. console.log('Using mysql connection');
  425. return {
  426. synchronize: true,
  427. type: 'mariadb',
  428. host: '127.0.0.1',
  429. port: 3306,
  430. username: 'root',
  431. password: '',
  432. database: 'vendure2-dev',
  433. };
  434. }
  435. }