@things-factory/shell 5.0.14 → 6.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/client/elements/custom-alert.js +3 -0
  2. package/config/config.development.js +31 -22
  3. package/dist-server/graphql-local-client.d.ts +28 -0
  4. package/dist-server/index.d.ts +9 -0
  5. package/dist-server/index.js +1 -0
  6. package/dist-server/index.js.map +1 -1
  7. package/dist-server/initializers/database.d.ts +7 -0
  8. package/dist-server/initializers/database.js +38 -8
  9. package/dist-server/initializers/database.js.map +1 -1
  10. package/dist-server/initializers/naming-strategy.d.ts +6 -0
  11. package/dist-server/middlewares/domain-middleware.d.ts +1 -0
  12. package/dist-server/middlewares/index.d.ts +2 -0
  13. package/dist-server/migrations/1000000000000-SeedDomain.d.ts +5 -0
  14. package/dist-server/migrations/1000000000000-SeedDomain.js +4 -4
  15. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  16. package/dist-server/migrations/index.d.ts +1 -0
  17. package/dist-server/pubsub-log-transport.d.ts +8 -0
  18. package/dist-server/pubsub.d.ts +2 -0
  19. package/dist-server/routers/domain-router.d.ts +2 -0
  20. package/dist-server/routers/global-router.d.ts +2 -0
  21. package/dist-server/routers/index.d.ts +2 -0
  22. package/dist-server/schema.d.ts +2 -0
  23. package/dist-server/server-dev.d.ts +1 -0
  24. package/dist-server/server-dev.js +16 -12
  25. package/dist-server/server-dev.js.map +1 -1
  26. package/dist-server/server.d.ts +1 -0
  27. package/dist-server/server.js +9 -6
  28. package/dist-server/server.js.map +1 -1
  29. package/dist-server/service/common-types/index.d.ts +6 -0
  30. package/dist-server/service/common-types/list-param.d.ts +19 -0
  31. package/dist-server/service/common-types/list-param.js +1 -1
  32. package/dist-server/service/common-types/list-param.js.map +1 -1
  33. package/dist-server/service/common-types/log.d.ts +6 -0
  34. package/dist-server/service/common-types/object-ref.d.ts +5 -0
  35. package/dist-server/service/common-types/scalar-any.d.ts +2 -0
  36. package/dist-server/service/common-types/scalar-date.d.ts +2 -0
  37. package/dist-server/service/common-types/scalar-object.d.ts +1 -0
  38. package/dist-server/service/directive-transaction/index.d.ts +1 -0
  39. package/dist-server/service/directive-transaction/transaction.d.ts +3 -0
  40. package/dist-server/service/directive-transaction/transaction.js +2 -2
  41. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  42. package/dist-server/service/domain/domain-resolver.d.ts +17 -0
  43. package/dist-server/service/domain/domain-resolver.js +14 -13
  44. package/dist-server/service/domain/domain-resolver.js.map +1 -1
  45. package/dist-server/service/domain/domain-types.d.ts +21 -0
  46. package/dist-server/service/domain/domain.d.ts +16 -0
  47. package/dist-server/service/domain/index.d.ts +4 -0
  48. package/dist-server/service/index.d.ts +14 -0
  49. package/dist-server/service/subscription-data/data-resolver.d.ts +6 -0
  50. package/dist-server/service/subscription-data/data-types.d.ts +6 -0
  51. package/dist-server/service/subscription-data/index.d.ts +3 -0
  52. package/dist-server/tsconfig.tsbuildinfo +1 -1
  53. package/dist-server/utils/condition-builder.d.ts +17 -0
  54. package/dist-server/utils/get-domain.d.ts +10 -0
  55. package/dist-server/utils/get-domain.js +2 -2
  56. package/dist-server/utils/get-domain.js.map +1 -1
  57. package/dist-server/utils/get-query-builder-from-list-params.d.ts +21 -0
  58. package/dist-server/utils/index.d.ts +7 -0
  59. package/dist-server/utils/list-param-adjuster.d.ts +2 -0
  60. package/dist-server/utils/list-params-converter.d.ts +16 -0
  61. package/dist-server/utils/list-params-converter.js.map +1 -1
  62. package/dist-server/utils/list-query-builder.d.ts +7 -0
  63. package/dist-server/utils/publish-progress.d.ts +6 -0
  64. package/dist-server/webpack/koa-webpack/client.d.ts +1 -0
  65. package/dist-server/webpack/koa-webpack/index.d.ts +2 -0
  66. package/dist-server/webpack/koa-webpack/middleware.d.ts +0 -0
  67. package/dist-server/webpack/koa-webpack/validate.d.ts +1 -0
  68. package/ormconfig.js +2 -3
  69. package/package.json +8 -7
  70. package/server/index.ts +1 -0
  71. package/server/initializers/database.ts +49 -9
  72. package/server/migrations/1000000000000-SeedDomain.ts +4 -2
  73. package/server/server-dev.ts +29 -16
  74. package/server/server.ts +8 -8
  75. package/server/service/common-types/list-param.ts +4 -3
  76. package/server/service/directive-transaction/transaction.ts +3 -2
  77. package/server/service/domain/domain-resolver.ts +7 -6
  78. package/server/utils/get-domain.ts +2 -2
  79. package/server/utils/list-params-converter.ts +1 -1
@@ -0,0 +1,17 @@
1
+ export declare const buildCondition: (alias: string, fieldName: string, operator: string, value: any, relation: boolean | string, seq: number) => {
2
+ clause: string;
3
+ parameters: {
4
+ [x: string]: any;
5
+ };
6
+ value?: undefined;
7
+ } | {
8
+ clause: string;
9
+ value: {
10
+ [x: string]: string;
11
+ };
12
+ parameters?: undefined;
13
+ } | {
14
+ clause: string;
15
+ parameters?: undefined;
16
+ value?: undefined;
17
+ };
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import { URL } from 'url';
3
+ import { Domain } from '../service/domain/domain';
4
+ export declare function getUrlFromContext(context: any, path?: string): URL;
5
+ export declare function getDomainFromURL(context: any): Promise<Domain>;
6
+ export declare function getCookieDomainFromHostname(hostname: any): any;
7
+ export declare function getContextPath(subdomain: any): string;
8
+ export declare function getRedirectSubdomainPath(context: any, subdomain: any, redirectTo?: string): string;
9
+ export declare function findSubdomainFromPath(context: any, path: any): any;
10
+ export declare function getSiteRootPath(context: any): string;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSiteRootPath = exports.findSubdomainFromPath = exports.getRedirectSubdomainPath = exports.getContextPath = exports.getCookieDomainFromHostname = exports.getDomainFromURL = exports.getUrlFromContext = void 0;
4
- const typeorm_1 = require("typeorm");
5
4
  const url_1 = require("url");
6
5
  const env_1 = require("@things-factory/env");
7
6
  const utils_1 = require("@things-factory/utils");
7
+ const database_1 = require("../initializers/database");
8
8
  const domain_1 = require("../service/domain/domain");
9
9
  const useVirtualHostBasedDomain = !!env_1.config.get('useVirtualHostBasedDomain');
10
10
  const protocol = env_1.config.get('protocol');
@@ -56,7 +56,7 @@ async function getDomainFromURL(context) {
56
56
  const { header } = context;
57
57
  const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context);
58
58
  if (subdomain) {
59
- return await (0, typeorm_1.getRepository)(domain_1.Domain).findOne({ subdomain }, { cache: true });
59
+ return await (0, database_1.getRepository)(domain_1.Domain).findOne({ where: { subdomain }, cache: true });
60
60
  }
61
61
  }
62
62
  exports.getDomainFromURL = getDomainFromURL;
@@ -1 +1 @@
1
- {"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from 'typeorm'\nimport { URL } from 'url'\n\nimport { config } from '@things-factory/env'\nimport { getPathInfo } from '@things-factory/utils'\n\nimport { Domain } from '../service/domain/domain'\n\nconst useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')\nconst protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst subdomainOffset = config.getNumber('subdomainOffset', 2)\n\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host } = context\n const { referer } = context.header\n\n var base = href\n\n if (method !== 'GET' && referer) {\n var { host: refererHost } = new URL(referer)\n if (refererHost === host) {\n base = referer\n }\n }\n\n let url: URL = new URL(path, base)\n url.protocol = protocol || url.protocol\n return url\n}\n\nfunction getSubdomainsFromHost(context: any) {\n const { request } = context\n var subdomains = request.headers.host.split('.').reverse()\n return subdomains.slice(subdomainOffset)\n}\n\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var domain = getPathInfo(path || '')?.domain\n if (domain) {\n return domain\n }\n\n var {\n host,\n header: { referer }\n } = context\n\n if (referer) {\n var { host: refererHost, pathname } = new URL(referer)\n if (refererHost === host) {\n return getPathInfo(pathname || '')?.domain\n }\n }\n}\n\nfunction getSubdomainFromVhost(context: any) {\n const subdomain = (context.subdomains || getSubdomainsFromHost(context)).slice(-1)[0]\n\n return subdomain\n}\n\nfunction getSubdomainFromURL(context) {\n return fixed || (useVirtualHostBasedDomain ? getSubdomainFromVhost(context) : getSubdomainFromPath(context))\n}\n\nexport async function getDomainFromURL(context: any): Promise<Domain> {\n const { header } = context\n\n const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({ subdomain }, { cache: true })\n }\n}\n\nexport function getCookieDomainFromHostname(hostname) {\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').slice(-subdomainOffset).join('.')\n }\n}\n\nexport function getContextPath(subdomain) {\n return fixed || useVirtualHostBasedDomain ? '' : '/domain/' + subdomain\n}\n\nexport function getRedirectSubdomainPath(context, subdomain, redirectTo = '/') {\n if (fixed) {\n return redirectTo || '/'\n }\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n const splitHost = hostname.split('.').reverse()\n splitHost[subdomainOffset] = subdomain\n parsed.hostname = splitHost\n .reverse()\n .filter(a => a)\n .join('.')\n } else {\n const contextPath = `/domain/${subdomain}`\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n }\n\n return parsed.toString()\n}\n\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').reverse()[subdomainOffset]\n }\n\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n return match && match[1]\n}\n\nexport function getSiteRootPath(context) {\n if (useVirtualHostBasedDomain) {\n var { protocol, host } = context\n protocol = protocol.replace(':', '')\n\n let domainname = host.split('.').slice(-subdomainOffset).join('.')\n return protocol + '://' + domainname + '/'\n } else {\n return '/'\n }\n}\n"]}
1
+ {"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL } from 'url'\n\nimport { config } from '@things-factory/env'\nimport { getPathInfo } from '@things-factory/utils'\n\nimport { getRepository } from '../initializers/database'\nimport { Domain } from '../service/domain/domain'\n\nconst useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')\nconst protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst subdomainOffset = config.getNumber('subdomainOffset', 2)\n\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host } = context\n const { referer } = context.header\n\n var base = href\n\n if (method !== 'GET' && referer) {\n var { host: refererHost } = new URL(referer)\n if (refererHost === host) {\n base = referer\n }\n }\n\n let url: URL = new URL(path, base)\n url.protocol = protocol || url.protocol\n return url\n}\n\nfunction getSubdomainsFromHost(context: any) {\n const { request } = context\n var subdomains = request.headers.host.split('.').reverse()\n return subdomains.slice(subdomainOffset)\n}\n\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var domain = getPathInfo(path || '')?.domain\n if (domain) {\n return domain\n }\n\n var {\n host,\n header: { referer }\n } = context\n\n if (referer) {\n var { host: refererHost, pathname } = new URL(referer)\n if (refererHost === host) {\n return getPathInfo(pathname || '')?.domain\n }\n }\n}\n\nfunction getSubdomainFromVhost(context: any) {\n const subdomain = (context.subdomains || getSubdomainsFromHost(context)).slice(-1)[0]\n\n return subdomain\n}\n\nfunction getSubdomainFromURL(context) {\n return fixed || (useVirtualHostBasedDomain ? getSubdomainFromVhost(context) : getSubdomainFromPath(context))\n}\n\nexport async function getDomainFromURL(context: any): Promise<Domain> {\n const { header } = context\n\n const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })\n }\n}\n\nexport function getCookieDomainFromHostname(hostname) {\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').slice(-subdomainOffset).join('.')\n }\n}\n\nexport function getContextPath(subdomain) {\n return fixed || useVirtualHostBasedDomain ? '' : '/domain/' + subdomain\n}\n\nexport function getRedirectSubdomainPath(context, subdomain, redirectTo = '/') {\n if (fixed) {\n return redirectTo || '/'\n }\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n const splitHost = hostname.split('.').reverse()\n splitHost[subdomainOffset] = subdomain\n parsed.hostname = splitHost\n .reverse()\n .filter(a => a)\n .join('.')\n } else {\n const contextPath = `/domain/${subdomain}`\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n }\n\n return parsed.toString()\n}\n\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { hostname, pathname } = parsed\n\n if (useVirtualHostBasedDomain) {\n return hostname.split('.').reverse()[subdomainOffset]\n }\n\n const match = pathname.match(/^\\/domain\\/([^\\/]+)/)\n return match && match[1]\n}\n\nexport function getSiteRootPath(context) {\n if (useVirtualHostBasedDomain) {\n var { protocol, host } = context\n protocol = protocol.replace(':', '')\n\n let domainname = host.split('.').slice(-subdomainOffset).join('.')\n return protocol + '://' + domainname + '/'\n } else {\n return '/'\n }\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { Repository, SelectQueryBuilder } from 'typeorm';
2
+ import { ListParam } from '../service/common-types/list-param';
3
+ import { Domain } from '../service/domain/domain';
4
+ /**
5
+ *
6
+ * @param options
7
+ * @returns
8
+ */
9
+ export declare function getQueryBuilderFromListParams<Type>(options: {
10
+ repository: Repository<Type>;
11
+ params: ListParam;
12
+ domain?: Domain;
13
+ alias?: string;
14
+ searchables?: string[];
15
+ filtersMap?: {
16
+ [name: string]: {
17
+ columnName: string;
18
+ relationColumn?: string;
19
+ };
20
+ };
21
+ }): SelectQueryBuilder<Type>;
@@ -0,0 +1,7 @@
1
+ export * from './get-domain';
2
+ export * from './condition-builder';
3
+ export * from './list-query-builder';
4
+ export * from './list-params-converter';
5
+ export * from './publish-progress';
6
+ export * from './get-query-builder-from-list-params';
7
+ export * from './list-param-adjuster';
@@ -0,0 +1,2 @@
1
+ import { Filter } from '../service/common-types';
2
+ export declare function adjustFilters(filters: Filter[], filtersChange: Filter[]): Filter[];
@@ -0,0 +1,16 @@
1
+ import { FindOperator } from 'typeorm';
2
+ import { ListParam } from '../service/common-types';
3
+ import { Domain } from '../service/domain/domain';
4
+ export declare function convertListParams(params: ListParam, options?: string | {
5
+ domain?: string | Domain;
6
+ searchables?: string[];
7
+ }): {
8
+ where?: {
9
+ [name: string]: FindOperator<any>;
10
+ };
11
+ order?: {
12
+ [name: string]: 'DESC' | 'ASC';
13
+ };
14
+ skip?: number;
15
+ take?: number;
16
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types'\nimport { Domain } from '../service/domain/domain'\nimport { adjustFilters } from './list-param-adjuster'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\nfunction getOperatorFunction({ operator, value }: { operator: string; value: any }): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce((where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n }, {} as { [name: string]: FindOperator<any> })\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
1
+ {"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types'\nimport { Domain } from '../service/domain/domain'\nimport { adjustFilters } from './list-param-adjuster'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\nfunction getOperatorFunction({ operator, value }: Filter): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce((where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n }, {} as { [name: string]: FindOperator<any> })\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @deprecated The name of this function does not imply an exact purpose and it is not possible to correspond to a foreign key using the meta information of the table column, so it is recommended to replace it with the getQueryBuilderFromListParams function.
3
+ */
4
+ export declare const buildQuery: (queryBuilder: any, params: any, context: any, options?: boolean | {
5
+ domainRef?: boolean;
6
+ searchables?: string[];
7
+ }) => void;
@@ -0,0 +1,6 @@
1
+ export declare function publishProgress({ domain, tag, progress, message }: {
2
+ domain: any;
3
+ tag: any;
4
+ progress: any;
5
+ message: any;
6
+ }): void;
@@ -0,0 +1 @@
1
+ declare const webpackHotClient: any;
@@ -0,0 +1,2 @@
1
+ declare const _default: (opts: any) => Promise<any>;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ declare const Joi: any;
package/ormconfig.js CHANGED
@@ -1,4 +1,4 @@
1
- const { orderedModuleNames, config, loader } = require('@things-factory/env')
1
+ const { orderedModuleNames, loader } = require('@things-factory/env')
2
2
  const { NamingStrategy } = require('@things-factory/shell')
3
3
 
4
4
  const debug = require('debug')('things-factory:shell:ormconfig')
@@ -27,6 +27,5 @@ module.exports = {
27
27
  namingStrategy: new NamingStrategy(),
28
28
  entities,
29
29
  migrations,
30
- subscribers,
31
- ...config.get('ormconfig')
30
+ subscribers
32
31
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/shell",
3
- "version": "5.0.14",
3
+ "version": "6.0.0-alpha.0",
4
4
  "description": "Core module for framework",
5
5
  "bin": {
6
6
  "things-factory": "bin/things-factory",
@@ -45,16 +45,17 @@
45
45
  "@material/mwc-icon-button": "^0.26.1",
46
46
  "@material/mwc-slider": "^0.26.1",
47
47
  "@material/mwc-textfield": "^0.26.1",
48
+ "@open-wc/scoped-elements": "^2.1.3",
48
49
  "@operato/board": "^1.0.1",
49
50
  "@operato/graphql": "^1.0.0",
50
51
  "@operato/help": "^1.0.1",
51
52
  "@operato/layout": "^1.0.1",
52
53
  "@operato/shell": "^1.0.1",
53
54
  "@operato/utils": "^1.0.1",
54
- "@things-factory/ejs-remote": "^5.0.0",
55
- "@things-factory/env": "^5.0.0",
56
- "@things-factory/styles": "^5.0.0",
57
- "@things-factory/utils": "^5.0.1",
55
+ "@things-factory/ejs-remote": "^6.0.0-alpha.0",
56
+ "@things-factory/env": "^6.0.0-alpha.0",
57
+ "@things-factory/styles": "^6.0.0-alpha.0",
58
+ "@things-factory/utils": "^6.0.0-alpha.0",
58
59
  "@webcomponents/webcomponentsjs": "^2.6.0",
59
60
  "@webpack-contrib/schema-utils": "^1.0.0-beta.0",
60
61
  "apollo-server-core": "^3.10.0",
@@ -116,7 +117,7 @@
116
117
  "scrollbooster": "^3.0.2",
117
118
  "sweetalert2": "^10.9.0",
118
119
  "type-graphql": "npm:type-graphql-v2-fork@2.0.0-alpha2",
119
- "typeorm": "^0.2.45",
120
+ "typeorm": "^0.3.9",
120
121
  "uuid": "^3.4.0",
121
122
  "web-animations-js": "^2.3.2",
122
123
  "web-push": "^3.5.0",
@@ -131,5 +132,5 @@
131
132
  "pg": "^8.7.3",
132
133
  "sqlite3": "^5.0.8"
133
134
  },
134
- "gitHead": "9ceaa39746fcf42953e429fab2001353cd821ded"
135
+ "gitHead": "e5b9823ab3ebc5d6ae5bcb4b5aa60c1306e4dd7e"
135
136
  }
package/server/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './migrations'
2
2
  export * from './initializers/naming-strategy'
3
+ export * from './initializers/database'
3
4
  export * from './utils'
4
5
  export * from './pubsub'
5
6
  export * from './pubsub-log-transport'
@@ -1,7 +1,8 @@
1
- const path = require('path')
1
+ import { createConnection, DataSource, EntityTarget, Repository } from 'typeorm'
2
+
3
+ import { appRootPath, config, logger } from '@things-factory/env'
2
4
 
3
- import { createConnection } from 'typeorm'
4
- import { logger, appRootPath } from '@things-factory/env'
5
+ const path = require('path')
5
6
 
6
7
  var ormconfig
7
8
  try {
@@ -10,18 +11,57 @@ try {
10
11
  ormconfig = require('@things-factory/shell/ormconfig')
11
12
  }
12
13
 
14
+ const dataSources: { [name: string]: DataSource } = {}
15
+
16
+ export function getDataSource(name?: string): DataSource {
17
+ return dataSources[name || 'default']
18
+ }
19
+
20
+ export function addDataSource(name: string, dataSource: DataSource) {
21
+ dataSources[name] = dataSource
22
+ }
23
+
24
+ export function removeDataSource(name: string) {
25
+ delete dataSources[name]
26
+ }
27
+
28
+ export function getDataSourceNames() {
29
+ return Object.keys(dataSources)
30
+ }
31
+
32
+ export function getRepository<X>(target: EntityTarget<X>): Repository<X> {
33
+ return getDataSource('default').getRepository<X>(target)
34
+ }
35
+
13
36
  export const databaseInitializer = async () => {
14
37
  try {
15
- const connection = await createConnection(ormconfig)
16
- logger.info('Database connection established')
38
+ const dataSource = await createConnection({
39
+ ...ormconfig,
40
+ ...config.get('ormconfig')
41
+ })
42
+
43
+ addDataSource('default', dataSource)
44
+
45
+ logger.info('Default DataSource established')
17
46
 
18
47
  if (ormconfig.type == 'sqlite' && ormconfig.synchronize == false) {
19
- await connection.query('PRAGMA foreign_keys=OFF')
20
- await connection.synchronize()
21
- await connection.query('PRAGMA foreign_keys=ON')
48
+ await dataSource.query('PRAGMA foreign_keys=OFF')
49
+ await dataSource.synchronize()
50
+ await dataSource.query('PRAGMA foreign_keys=ON')
22
51
  }
23
52
 
24
- return connection
53
+ if (config.get('ormconfig4Tx')) {
54
+ const dataSource4Tx = new DataSource({
55
+ ...ormconfig,
56
+ ...config.get('ormconfig4Tx')
57
+ })
58
+ dataSource4Tx.initialize()
59
+ addDataSource('tx', dataSource4Tx)
60
+
61
+ logger.info('Transaction DataSource established')
62
+ } else {
63
+ addDataSource('tx', dataSource)
64
+ }
25
65
  } catch (e) {
26
66
  logger.error(e)
27
67
  }
@@ -1,4 +1,6 @@
1
- import { MigrationInterface, QueryRunner, getRepository } from 'typeorm'
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ import { getRepository } from '../initializers/database'
2
4
  import { Domain } from '../service/domain/domain'
3
5
 
4
6
  const SEED_DOMAINS = [
@@ -27,7 +29,7 @@ export class SeedDomain1000000000000 implements MigrationInterface {
27
29
 
28
30
  return await Promise.all(
29
31
  SEED_DOMAINS.reverse().map(async domain => {
30
- let recode = await repository.findOne({ subdomain: domain.subdomain })
32
+ let recode = await repository.findOneBy({ subdomain: domain.subdomain })
31
33
  await repository.remove(recode)
32
34
  })
33
35
  )
@@ -4,7 +4,7 @@
4
4
  process.env.NODE_ENV = 'development'
5
5
  process.setMaxListeners(0)
6
6
 
7
- import { ApolloServerPluginDrainHttpServer, ApolloServerPluginLandingPageGraphQLPlayground } from 'apollo-server-core'
7
+ import { ApolloServerPluginDrainHttpServer, ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core'
8
8
  import { ApolloServer } from 'apollo-server-koa'
9
9
  import bytesFormat from 'bytes'
10
10
  import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.js'
@@ -27,6 +27,8 @@ import { GraphqlLocalClient } from './graphql-local-client'
27
27
  import { databaseInitializer } from './initializers/database'
28
28
  import { domainPrivateRouter, domainPublicRouter, globalPrivateRouter, globalPublicRouter } from './routers'
29
29
  import { schema } from './schema'
30
+ import { Domain } from './service'
31
+ import { EntityManager } from 'typeorm'
30
32
 
31
33
  process.on('uncaughtException', error => {
32
34
  logger.error(error)
@@ -68,11 +70,21 @@ const fileUploadOption = {
68
70
  maxFiles: fileUpload.maxFiles || 10
69
71
  }
70
72
 
73
+ interface ICustomAppState {
74
+ domain: Domain
75
+ user: any
76
+ tx: EntityManager
77
+ }
78
+
79
+ interface ICustomAppContext {
80
+ t: any
81
+ }
82
+
71
83
  /* bootstrap */
72
84
  const bootstrap = async () => {
73
85
  await databaseInitializer()
74
86
 
75
- const app = new Koa()
87
+ const app = new Koa<ICustomAppState, ICustomAppContext>()
76
88
 
77
89
  app.use(
78
90
  cors({
@@ -124,9 +136,13 @@ const bootstrap = async () => {
124
136
  var { extra, connectionParams } = ctx
125
137
  var { request } = extra
126
138
 
127
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
128
- var accessToken = url.searchParams.get('access_token')
129
- connectionParams['headers']['authorization'] = accessToken
139
+ if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
140
+ var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
141
+ var accessToken = url.searchParams.get('access_token')
142
+ if (accessToken) {
143
+ connectionParams['headers']['authorization'] = accessToken
144
+ }
145
+ }
130
146
 
131
147
  request.headers = {
132
148
  ...request.headers,
@@ -170,13 +186,11 @@ const bootstrap = async () => {
170
186
  return ctx
171
187
  }
172
188
  },
189
+ csrfPrevention: true,
173
190
  plugins: [
174
- ApolloServerPluginLandingPageGraphQLPlayground({
175
- settings: {
176
- 'request.credentials': 'same-origin'
177
- }
178
- }),
191
+ // Proper shutdown for the HTTP server.
179
192
  ApolloServerPluginDrainHttpServer({ httpServer }),
193
+ // Proper shutdown for the WebSocket server.
180
194
  {
181
195
  async serverWillStart() {
182
196
  return {
@@ -185,7 +199,10 @@ const bootstrap = async () => {
185
199
  }
186
200
  }
187
201
  }
188
- }
202
+ },
203
+ ApolloServerPluginLandingPageLocalDefault({
204
+ embed: true
205
+ })
189
206
  ],
190
207
  cache: 'bounded'
191
208
  })
@@ -226,11 +243,7 @@ const bootstrap = async () => {
226
243
  app.use(koaBodyParser(bodyParserOption))
227
244
  app.use(graphqlUploadKoa(fileUploadOption))
228
245
 
229
- app.use(
230
- server.getMiddleware({
231
- path: '/graphql'
232
- })
233
- )
246
+ server.applyMiddleware({ app, path: '/graphql' })
234
247
 
235
248
  /* routers */
236
249
  process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
package/server/server.ts CHANGED
@@ -113,9 +113,13 @@ const bootstrap = async () => {
113
113
  var { extra, connectionParams } = ctx
114
114
  var { request } = extra
115
115
 
116
- var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
117
- var accessToken = url.searchParams.get('access_token')
118
- connectionParams['headers']['authorization'] = accessToken
116
+ if (((connectionParams['headers'] as any) || connectionParams)?.referer) {
117
+ var url = new URL(((connectionParams['headers'] as any) || connectionParams).referer)
118
+ var accessToken = url.searchParams.get('access_token')
119
+ if (accessToken) {
120
+ connectionParams['headers']['authorization'] = accessToken
121
+ }
122
+ }
119
123
 
120
124
  request.headers = {
121
125
  ...request.headers,
@@ -198,11 +202,7 @@ const bootstrap = async () => {
198
202
  app.use(koaBodyParser(bodyParserOption))
199
203
  app.use(graphqlUploadKoa(fileUploadOption))
200
204
 
201
- app.use(
202
- server.getMiddleware({
203
- path: '/graphql'
204
- })
205
- )
205
+ server.applyMiddleware({ app, path: '/graphql' })
206
206
 
207
207
  /* routers */
208
208
  process.emit('bootstrap-module-global-public-route' as any, app, globalPublicRouter)
@@ -1,4 +1,5 @@
1
- import { ArgsType, InputType, Field, Int } from 'type-graphql'
1
+ import { ArgsType, Field, InputType, Int } from 'type-graphql'
2
+
2
3
  import { ScalarAny } from './scalar-any'
3
4
 
4
5
  @InputType()
@@ -27,8 +28,8 @@ export class Filter {
27
28
  @Field()
28
29
  operator: string
29
30
 
30
- @Field(type => ScalarAny)
31
- value: any
31
+ @Field(type => ScalarAny, { nullable: true })
32
+ value?: any
32
33
 
33
34
  @Field({ nullable: true })
34
35
  relation?: boolean
@@ -1,9 +1,10 @@
1
1
  import { defaultFieldResolver, GraphQLSchema } from 'graphql'
2
2
  import gql from 'graphql-tag'
3
- import { getConnection } from 'typeorm'
4
3
 
5
4
  import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
6
5
 
6
+ import { getDataSource } from '../../initializers/database'
7
+
7
8
  const DIRECTIVE = 'transaction'
8
9
 
9
10
  export const transactionDirectiveTypeDefs = gql`
@@ -17,7 +18,7 @@ export const transactionDirectiveResolver = (schema: GraphQLSchema) =>
17
18
  const { resolve = defaultFieldResolver } = fieldConfig
18
19
 
19
20
  fieldConfig.resolve = async function (source, args, context, info) {
20
- return await getConnection().transaction(async tx => {
21
+ return await getDataSource('tx').transaction(async tx => {
21
22
  /* local-graphql-client로부터 invoke인 경우에는 context.req, context.res 가 없으므로, 빈 오브젝트로 대체해준다. */
22
23
  let wrap = context.app.createContext(context.req || {}, context.res || {})
23
24
 
@@ -1,8 +1,9 @@
1
1
  import { Arg, Args, Ctx, Directive, Mutation, Query, Resolver } from 'type-graphql'
2
- import { getRepository, In, Repository } from 'typeorm'
2
+ import { In, Repository } from 'typeorm'
3
3
 
4
4
  import { slugger } from '@things-factory/utils'
5
5
 
6
+ import { getRepository } from '../../initializers/database'
6
7
  import { buildQuery } from '../../utils/list-query-builder'
7
8
  import { ListParam } from '../common-types/list-param'
8
9
  import { Domain } from './domain'
@@ -15,12 +16,12 @@ export class DomainResolver {
15
16
  async domain(@Arg('id') id: string): Promise<Domain> {
16
17
  const repository = getRepository(Domain)
17
18
 
18
- return await repository.findOne({ id })
19
+ return await repository.findOneBy({ id })
19
20
  }
20
21
 
21
22
  @Directive('@privilege(category: "system", privilege: "query", superUserGranted: true)')
22
23
  @Query(returns => DomainList, { description: 'To fetch multiple domain' })
23
- async domains(@Args() params: ListParam, @Ctx() context): Promise<DomainList> {
24
+ async domains(@Args() params: ListParam, @Ctx() context: any): Promise<DomainList> {
24
25
  const queryBuilder = getRepository(Domain).createQueryBuilder()
25
26
 
26
27
  buildQuery(queryBuilder, params || {}, context, {
@@ -37,7 +38,7 @@ export class DomainResolver {
37
38
  const domainRepository: Repository<Domain> = getRepository(Domain)
38
39
  const targetSubdomain: string = slugger(name)
39
40
 
40
- const oldDomain = await domainRepository.findOne({ subdomain: targetSubdomain })
41
+ const oldDomain = await domainRepository.findOneBy({ subdomain: targetSubdomain })
41
42
  if (oldDomain) {
42
43
  throw new Error('domain is duplicated')
43
44
  }
@@ -52,7 +53,7 @@ export class DomainResolver {
52
53
  const domainRepo: Repository<Domain> = getRepository(Domain)
53
54
  const subdomain: string = slugger(name)
54
55
 
55
- const domain: Domain = await domainRepo.findOne({ subdomain })
56
+ const domain: Domain = await domainRepo.findOneBy({ subdomain })
56
57
  if (domain) {
57
58
  throw new Error('domain is duplicated')
58
59
  }
@@ -79,7 +80,7 @@ export class DomainResolver {
79
80
  @Mutation(returns => Domain, { description: 'To update domain' })
80
81
  async updateDomain(@Arg('name') name: string, @Arg('patch', () => DomainPatch) patch: DomainPatch) {
81
82
  const repository = getRepository(Domain)
82
- const domain: Domain = await repository.findOne({ name })
83
+ const domain: Domain = await repository.findOneBy({ name })
83
84
 
84
85
  return await repository.save({
85
86
  ...domain,
@@ -1,9 +1,9 @@
1
- import { getRepository } from 'typeorm'
2
1
  import { URL } from 'url'
3
2
 
4
3
  import { config } from '@things-factory/env'
5
4
  import { getPathInfo } from '@things-factory/utils'
6
5
 
6
+ import { getRepository } from '../initializers/database'
7
7
  import { Domain } from '../service/domain/domain'
8
8
 
9
9
  const useVirtualHostBasedDomain = !!config.get('useVirtualHostBasedDomain')
@@ -72,7 +72,7 @@ export async function getDomainFromURL(context: any): Promise<Domain> {
72
72
  const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)
73
73
 
74
74
  if (subdomain) {
75
- return await getRepository(Domain).findOne({ subdomain }, { cache: true })
75
+ return await getRepository(Domain).findOne({ where: { subdomain }, cache: true })
76
76
  }
77
77
  }
78
78