@things-factory/shell 9.0.0-beta.30 → 9.0.0-beta.34
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.
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-server/utils/get-domain.d.ts +6 -0
- package/dist-server/utils/get-domain.js +14 -0
- package/dist-server/utils/get-domain.js.map +1 -1
- package/package.json +3 -2
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +2 -1
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
@@ -39,6 +39,12 @@ export declare function getRedirectSubdomainPath(context: any, domain: Partial<D
|
|
39
39
|
* @returns {string} The found subdomain.
|
40
40
|
*/
|
41
41
|
export declare function findSubdomainFromPath(context: any, path: any): any;
|
42
|
+
/**
|
43
|
+
* Retrieves the route prefix for a specific domain type.
|
44
|
+
*
|
45
|
+
* @returns {string} The route prefix associated with the domain type.
|
46
|
+
*/
|
47
|
+
export declare function getRoutePrefixForDomainType(): string;
|
42
48
|
/**
|
43
49
|
* Generates a site root path based on the current environment.
|
44
50
|
*
|
@@ -5,6 +5,7 @@ exports.getDomainFromURL = getDomainFromURL;
|
|
5
5
|
exports.getContextPath = getContextPath;
|
6
6
|
exports.getRedirectSubdomainPath = getRedirectSubdomainPath;
|
7
7
|
exports.findSubdomainFromPath = findSubdomainFromPath;
|
8
|
+
exports.getRoutePrefixForDomainType = getRoutePrefixForDomainType;
|
8
9
|
exports.getSiteRootPath = getSiteRootPath;
|
9
10
|
const url_1 = require("url");
|
10
11
|
const env_1 = require("@things-factory/env");
|
@@ -14,6 +15,11 @@ const domain_1 = require("../service/domain/domain");
|
|
14
15
|
const protocol = env_1.config.get('protocol');
|
15
16
|
const fixed = env_1.config.get('subdomain');
|
16
17
|
const domainTypes = env_1.config.get('domainTypes') || ['domain'];
|
18
|
+
/* 하위 호환성을 위해서, domain prefix가 없는 경우, domain을 추가해준다. */
|
19
|
+
if (domainTypes.indexOf('domain') < 0) {
|
20
|
+
domainTypes.push('domain');
|
21
|
+
}
|
22
|
+
const routePrefixForDomainType = `:domainType(${domainTypes.join('|')})`;
|
17
23
|
/**
|
18
24
|
* Creates a URL based on the given context and path.
|
19
25
|
*
|
@@ -172,6 +178,14 @@ function findSubdomainFromPath(context, path) {
|
|
172
178
|
const match = pathname.match(new RegExp(`^/${getSubdomainTypeFromURL(context)}/([^\/]+)`));
|
173
179
|
return match && match[1];
|
174
180
|
}
|
181
|
+
/**
|
182
|
+
* Retrieves the route prefix for a specific domain type.
|
183
|
+
*
|
184
|
+
* @returns {string} The route prefix associated with the domain type.
|
185
|
+
*/
|
186
|
+
function getRoutePrefixForDomainType() {
|
187
|
+
return routePrefixForDomainType;
|
188
|
+
}
|
175
189
|
/**
|
176
190
|
* Generates a site root path based on the current environment.
|
177
191
|
*
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { In } from 'typeorm'\nimport { 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 protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst domainTypes = config.get('domainTypes') || ['domain']\n\n/**\n * Creates a URL based on the given context and path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to be added to the created URL (optional).\n * @returns {URL} The generated URL object.\n */\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host, header } = context\n const { referer } = 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\n const originalProtocol = context.headers['x-forwarded-proto']\n const originalHost = context.headers['x-forwarded-host']\n const originalPort = context.headers['x-forwarded-port']\n\n if (protocol || originalProtocol) {\n url.protocol = protocol || originalProtocol\n }\n\n if (originalHost) {\n url.host = originalHost\n if (originalPort) {\n url.port = originalPort\n }\n }\n\n return url\n}\n\n/**\n * Extracts a subdomain from the path.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var subdomain = getPathInfo(path || '', domainTypes)?.subdomain\n if (subdomain) {\n return subdomain\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.subdomain\n }\n}\n\n/**\n * Extracts the subdomain type from the given context's path or referer header.\n *\n * @param context - The context object containing path and header information.\n * @returns The subdomain type if found, otherwise undefined.\n */\nfunction getSubdomainTypeFromPath(context: any) {\n var { path } = context\n\n var prefix = getPathInfo(path || '', domainTypes)?.prefix\n if (prefix) {\n return prefix\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.prefix\n }\n}\n\n/**\n * Extracts a subdomain from the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromURL(context) {\n return fixed || getSubdomainFromPath(context)\n}\n\nfunction getSubdomainTypeFromURL(context) {\n return fixed ? '' : getSubdomainTypeFromPath(context)\n}\n\n/**\n * Asynchronously searches for a domain object based on the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {Promise<Domain>} A promise that resolves to the domain object.\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 const extType = header['x-things-factory-type'] || getSubdomainTypeFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({\n where:\n fixed || extType == 'domain' || !extType\n ? {\n subdomain\n }\n : {\n subdomain,\n extType\n },\n cache: true\n })\n }\n}\n\n/**\n * Generates a context path based on the subdomain.\n *\n * @param subdomain {string} The subdomain.\n * @returns {string} The generated context path.\n */\nexport function getContextPath(domain: Domain) {\n const type = domain?.extType || 'domain'\n return fixed || !domain ? '' : `${type}/${domain?.subdomain}/`\n}\n\n/**\n * Generates a redirection path considering the subdomain.\n *\n * @param context {Object} An object containing the current request context information.\n * @param subdomain {Domain} The target domain.\n * @param redirectTo {string} The path to redirect to (optional).\n * @returns {string} The generated redirection path.\n */\nexport function getRedirectSubdomainPath(context, domain: Partial<Domain>, redirectTo: string = '/') {\n if (fixed || !domain) {\n return redirectTo || '/'\n }\n\n const type = domain.extType || 'domain'\n const subdomain = domain.subdomain || fixed\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n const contextPath = `/${type}/${subdomain}`\n const match = pathname.match(new RegExp(`^/${type}/([^\\/]+)`))\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n\n return parsed.toString()\n}\n\n/**\n * Finds a subdomain from the given path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to search in.\n * @returns {string} The found subdomain.\n */\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { pathname } = parsed\n\n const match = pathname.match(new RegExp(`^/${getSubdomainTypeFromURL(context)}/([^\\/]+)`))\n return match && match[1]\n}\n\n/**\n * Generates a site root path based on the current environment.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The generated site root path.\n */\nexport function getSiteRootPath(context) {\n return '/'\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 protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst domainTypes = config.get('domainTypes') || ['domain']\n\n/* 하위 호환성을 위해서, domain prefix가 없는 경우, domain을 추가해준다. */\nif (domainTypes.indexOf('domain') < 0) {\n domainTypes.push('domain')\n}\n\nconst routePrefixForDomainType = `:domainType(${domainTypes.join('|')})`\n\n/**\n * Creates a URL based on the given context and path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to be added to the created URL (optional).\n * @returns {URL} The generated URL object.\n */\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host, header } = context\n const { referer } = 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\n const originalProtocol = context.headers['x-forwarded-proto']\n const originalHost = context.headers['x-forwarded-host']\n const originalPort = context.headers['x-forwarded-port']\n\n if (protocol || originalProtocol) {\n url.protocol = protocol || originalProtocol\n }\n\n if (originalHost) {\n url.host = originalHost\n if (originalPort) {\n url.port = originalPort\n }\n }\n\n return url\n}\n\n/**\n * Extracts a subdomain from the path.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var subdomain = getPathInfo(path || '', domainTypes)?.subdomain\n if (subdomain) {\n return subdomain\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.subdomain\n }\n}\n\n/**\n * Extracts the subdomain type from the given context's path or referer header.\n *\n * @param context - The context object containing path and header information.\n * @returns The subdomain type if found, otherwise undefined.\n */\nfunction getSubdomainTypeFromPath(context: any) {\n var { path } = context\n\n var prefix = getPathInfo(path || '', domainTypes)?.prefix\n if (prefix) {\n return prefix\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.prefix\n }\n}\n\n/**\n * Extracts a subdomain from the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromURL(context) {\n return fixed || getSubdomainFromPath(context)\n}\n\nfunction getSubdomainTypeFromURL(context) {\n return fixed ? '' : getSubdomainTypeFromPath(context)\n}\n\n/**\n * Asynchronously searches for a domain object based on the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {Promise<Domain>} A promise that resolves to the domain object.\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 const extType = header['x-things-factory-type'] || getSubdomainTypeFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({\n where:\n fixed || extType == 'domain' || !extType\n ? {\n subdomain\n }\n : {\n subdomain,\n extType\n },\n cache: true\n })\n }\n}\n\n/**\n * Generates a context path based on the subdomain.\n *\n * @param subdomain {string} The subdomain.\n * @returns {string} The generated context path.\n */\nexport function getContextPath(domain: Domain) {\n const type = domain?.extType || 'domain'\n return fixed || !domain ? '' : `${type}/${domain?.subdomain}/`\n}\n\n/**\n * Generates a redirection path considering the subdomain.\n *\n * @param context {Object} An object containing the current request context information.\n * @param subdomain {Domain} The target domain.\n * @param redirectTo {string} The path to redirect to (optional).\n * @returns {string} The generated redirection path.\n */\nexport function getRedirectSubdomainPath(context, domain: Partial<Domain>, redirectTo: string = '/') {\n if (fixed || !domain) {\n return redirectTo || '/'\n }\n\n const type = domain.extType || 'domain'\n const subdomain = domain.subdomain || fixed\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n const contextPath = `/${type}/${subdomain}`\n const match = pathname.match(new RegExp(`^/${type}/([^\\/]+)`))\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n\n return parsed.toString()\n}\n\n/**\n * Finds a subdomain from the given path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to search in.\n * @returns {string} The found subdomain.\n */\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { pathname } = parsed\n\n const match = pathname.match(new RegExp(`^/${getSubdomainTypeFromURL(context)}/([^\\/]+)`))\n return match && match[1]\n}\n\n/**\n * Retrieves the route prefix for a specific domain type.\n *\n * @returns {string} The route prefix associated with the domain type.\n */\nexport function getRoutePrefixForDomainType() {\n return routePrefixForDomainType\n}\n\n/**\n * Generates a site root path based on the current environment.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The generated site root path.\n */\nexport function getSiteRootPath(context) {\n return '/'\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/shell",
|
3
|
-
"version": "9.0.0-beta.
|
3
|
+
"version": "9.0.0-beta.34",
|
4
4
|
"description": "Core module for framework",
|
5
5
|
"bin": {
|
6
6
|
"things-factory": "bin/things-factory",
|
@@ -108,6 +108,7 @@
|
|
108
108
|
"pwa-helpers": "^0.9.1",
|
109
109
|
"react": "^18.2.0",
|
110
110
|
"react-dom": "^18.2.0",
|
111
|
+
"reflect-metadata": "^0.2.2",
|
111
112
|
"regenerator-runtime": "^0.13.2",
|
112
113
|
"reselect": "^4.0.0",
|
113
114
|
"sass": "^1.50.1",
|
@@ -128,5 +129,5 @@
|
|
128
129
|
"pg": "^8.7.3",
|
129
130
|
"sqlite3": "^5.0.8"
|
130
131
|
},
|
131
|
-
"gitHead": "
|
132
|
+
"gitHead": "7ef678cd5b5d677c28ea0586213c19d3c00d2421"
|
132
133
|
}
|
package/translations/en.json
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
"field.theme": "theme",
|
26
26
|
"prompt.sure to navigate away?": "You have unsaved changes. Are you sure you want to navigate away?",
|
27
27
|
"text.are_you_sure": "are you sure?",
|
28
|
+
"text.data_created_successfully": "data created successfully",
|
28
29
|
"text.data_deleted_successfully": "data deleted successfully",
|
29
30
|
"text.data_updated_successfully": "data updated successfully",
|
30
31
|
"text.data_uploaded_successfully": "data uploaded successfully",
|
package/translations/ja.json
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
"field.theme": "テーマ",
|
26
26
|
"prompt.sure to navigate away?": "未保存の変更があります。本当に移動しますか?",
|
27
27
|
"text.are_you_sure": "進行しますか?",
|
28
|
+
"text.data_created_successfully": "資料が正常に作成されました.",
|
28
29
|
"text.data_updated_successfully": "資料の修正に成功しました.",
|
29
30
|
"text.data_uploaded_successfully": "資料が正常に作成されました.",
|
30
31
|
"text.data_deleted_successfully": "資料の削除に成功しました.",
|
package/translations/ko.json
CHANGED
@@ -25,8 +25,9 @@
|
|
25
25
|
"field.theme": "테마",
|
26
26
|
"prompt.sure to navigate away?": "변경 사항이 저장되지 않았습니다. 정말 이동하시겠습니까?",
|
27
27
|
"text.are_you_sure": "진행하시겠습니까?",
|
28
|
+
"text.data_created_successfully": "성공적으로 자료를 생성하였습니다.",
|
28
29
|
"text.data_updated_successfully": "성공적으로 자료를 수정하였습니다.",
|
29
|
-
"text.data_uploaded_successfully": "성공적으로
|
30
|
+
"text.data_uploaded_successfully": "성공적으로 자료를 업로드하였습니다.",
|
30
31
|
"text.data_deleted_successfully": "성공적으로 자료를 삭제하였습니다.",
|
31
32
|
"text.nothing_changed": "변경사항 없음",
|
32
33
|
"text.nothing_selected": "선택되지 않음",
|
package/translations/ms.json
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
"field.theme": "tema",
|
26
26
|
"prompt.sure to navigate away?": "Anda mempunyai perubahan yang belum disimpan. Adakah anda pasti mahu berpindah?",
|
27
27
|
"text.are_you_sure": "adakah anda pasti?",
|
28
|
+
"text.data_created_successfully": "data berjaya dicipta",
|
28
29
|
"text.data_deleted_successfully": "data telah berjaya dipadam",
|
29
30
|
"text.data_updated_successfully": "data berjaya dikemaskini",
|
30
31
|
"text.data_uploaded_successfully": "data uploaded successfully",
|
package/translations/zh.json
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
"field.theme": "主题",
|
26
26
|
"prompt.sure to navigate away?": "更改未保存。您确定要离开吗?",
|
27
27
|
"text.are_you_sure": "您确定要进行吗?",
|
28
|
+
"text.data_created_successfully": "数据创建成功。",
|
28
29
|
"text.data_updated_successfully": "数据更新成功。",
|
29
30
|
"text.data_uploaded_successfully": "数据上传成功。",
|
30
31
|
"text.data_deleted_successfully": "数据删除成功。",
|