@cloudpss/env 0.3.0-alpha.3 → 0.3.0-beta.1

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/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # @cloudpss/env
2
+
3
+ Get/set urls for cloudpss from `process.env` (also `document.baseURI` or `location.href`).
4
+
5
+ All urls WILL NOT ends with '/', even if you set them with trailing '/'.
6
+
7
+ - `HOME_URL`: `process.env.CLOUDPSS_HOME_URL`
8
+ Home page url of cloudpss, defaults to `"https://cloudpss.net"`.
9
+ - `GQL_URL`: `process.env.CLOUDPSS_GQL_URL`
10
+ GraphQL API endpoint of cloudpss, defaults to `"https://cloudpss.net/graphql"`.
11
+ - `API_URL`: `process.env.CLOUDPSS_API_URL`
12
+ Common API endpoint of cloudpss, defaults to `"https://cloudpss.net/api"`
@@ -1,3 +1,5 @@
1
+ /** 规范化 URL,转为 absolute URL,去除末尾 '/' */
2
+ export declare function normalizeUrl(url: string | URL, base?: string | URL): string;
1
3
  declare const cloudpssEnv: {
2
4
  /** API 地址,eg: https://cloudpss.net/api */
3
5
  API_URL: string;
@@ -18,14 +18,19 @@ function env() {
18
18
  return fakeEnv;
19
19
  }
20
20
  }
21
- const BASE = (() => {
21
+ /** 基址 */
22
+ function baseUrl() {
23
+ // 通过 DOM API 确定 baseUrl
22
24
  let webBase = 'https://cloudpss.net/';
23
- if (typeof document == 'object' && document.baseURI && document.baseURI.startsWith('http')) {
25
+ if (typeof document == 'object' && typeof document.baseURI == 'string' && document.baseURI.startsWith('http')) {
24
26
  webBase = document.baseURI;
25
27
  }
26
- else if (typeof location == 'object' && location.protocol.startsWith('http')) {
28
+ else if (typeof location == 'object' &&
29
+ typeof location.href == 'string' &&
30
+ location.protocol.startsWith('http')) {
27
31
  webBase = location.href;
28
32
  }
33
+ //通过 env 确定 baseUrl
29
34
  const homeUrl = env()['CLOUDPSS_HOME_URL'];
30
35
  if (homeUrl) {
31
36
  try {
@@ -37,7 +42,7 @@ const BASE = (() => {
37
42
  }
38
43
  }
39
44
  return webBase;
40
- })();
45
+ }
41
46
  /** 获取 url */
42
47
  function getUrl(envName, defaults) {
43
48
  let url;
@@ -51,10 +56,24 @@ function getUrl(envName, defaults) {
51
56
  if (typeof url != 'string') {
52
57
  throw new Error('url must be a string');
53
58
  }
54
- const u = new URL(url, BASE);
55
- const ret = u.href.endsWith('/') ? u.href.slice(0, u.href.length - 1) : u.href;
56
- e[envName] = ret;
57
- return ret;
59
+ const u = normalizeUrl(url);
60
+ e[envName] = u;
61
+ return u;
62
+ }
63
+ /** 规范化 URL,转为 absolute URL,去除末尾 '/' */
64
+ export function normalizeUrl(url, base) {
65
+ if (typeof url != 'string') {
66
+ if (url && typeof url.href == 'string') {
67
+ url = url.href;
68
+ }
69
+ else {
70
+ throw new Error('Invalid url, must be a string or a URL');
71
+ }
72
+ }
73
+ const u = new URL(url, base ?? baseUrl()).href;
74
+ if (u.endsWith('/'))
75
+ return u.slice(0, -1);
76
+ return u;
58
77
  }
59
78
  const cloudpssEnv = {};
60
79
  const def = [
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,23 @@
1
1
  {
2
2
  "name": "@cloudpss/env",
3
- "version": "0.3.0-alpha.3",
3
+ "version": "0.3.0-beta.1",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
- "main": "dist/cjs/index.js",
7
- "module": "dist/esm/index.js",
8
- "types": "dist/esm/index.d.ts",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
9
14
  "scripts": {
10
15
  "start": "yarn clean && tsc --watch",
11
- "build": "yarn clean && yarn build:cjs && yarn build:esm",
16
+ "build": "yarn clean && tsc",
12
17
  "prepublishOnly": "yarn build",
13
- "build:cjs": "tsc",
14
- "build:esm": "tsc --outDir dist/esm --module ESNext",
15
18
  "clean": "rimraf dist"
16
19
  },
17
20
  "devDependencies": {
18
- "@types/node": "^16.10.2",
19
- "@types/web": "^0.0.39"
21
+ "@types/node": "^16.11.11"
20
22
  }
21
- }
23
+ }
package/src/index.ts CHANGED
@@ -19,13 +19,21 @@ function env(): NodeJS.ProcessEnv {
19
19
  }
20
20
  }
21
21
 
22
- const BASE = (() => {
22
+ /** 基址 */
23
+ function baseUrl(): string {
24
+ // 通过 DOM API 确定 baseUrl
23
25
  let webBase = 'https://cloudpss.net/';
24
- if (typeof document == 'object' && document.baseURI && document.baseURI.startsWith('http')) {
26
+ if (typeof document == 'object' && typeof document.baseURI == 'string' && document.baseURI.startsWith('http')) {
25
27
  webBase = document.baseURI;
26
- } else if (typeof location == 'object' && location.protocol.startsWith('http')) {
28
+ } else if (
29
+ typeof location == 'object' &&
30
+ typeof location.href == 'string' &&
31
+ location.protocol.startsWith('http')
32
+ ) {
27
33
  webBase = location.href;
28
34
  }
35
+
36
+ //通过 env 确定 baseUrl
29
37
  const homeUrl = env()['CLOUDPSS_HOME_URL'];
30
38
  if (homeUrl) {
31
39
  try {
@@ -36,7 +44,7 @@ const BASE = (() => {
36
44
  }
37
45
  }
38
46
  return webBase;
39
- })();
47
+ }
40
48
 
41
49
  /** 获取 url */
42
50
  function getUrl(envName: string, defaults: string): string {
@@ -51,10 +59,23 @@ function getUrl(envName: string, defaults: string): string {
51
59
  if (typeof url != 'string') {
52
60
  throw new Error('url must be a string');
53
61
  }
54
- const u = new URL(url, BASE);
55
- const ret = u.href.endsWith('/') ? u.href.slice(0, u.href.length - 1) : u.href;
56
- e[envName] = ret;
57
- return ret;
62
+ const u = normalizeUrl(url);
63
+ e[envName] = u;
64
+ return u;
65
+ }
66
+
67
+ /** 规范化 URL,转为 absolute URL,去除末尾 '/' */
68
+ export function normalizeUrl(url: string | URL, base?: string | URL): string {
69
+ if (typeof url != 'string') {
70
+ if (url && typeof url.href == 'string') {
71
+ url = url.href;
72
+ } else {
73
+ throw new Error('Invalid url, must be a string or a URL');
74
+ }
75
+ }
76
+ const u = new URL(url, base ?? baseUrl()).href;
77
+ if (u.endsWith('/')) return u.slice(0, -1);
78
+ return u;
58
79
  }
59
80
 
60
81
  const cloudpssEnv = {} as {
package/tsconfig.json CHANGED
@@ -2,6 +2,6 @@
2
2
  "extends": "../../tsconfig",
3
3
  "include": ["./src/"],
4
4
  "compilerOptions": {
5
- "outDir": "./dist/cjs"
5
+ "outDir": "./dist"
6
6
  }
7
7
  }
package/dist/cjs/index.js DELETED
@@ -1,88 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- let fakeEnv = undefined;
4
- /** 获取环境变量 */
5
- function env() {
6
- if (typeof process == 'object' && process.env && typeof process.env == 'object') {
7
- if (fakeEnv) {
8
- // 通过 polyfill 加载了 process,将 fakeEnv 拷贝过去
9
- for (const key in fakeEnv) {
10
- process.env[key] = fakeEnv[key];
11
- }
12
- fakeEnv = undefined;
13
- }
14
- return process.env;
15
- }
16
- else {
17
- if (!fakeEnv) {
18
- fakeEnv = {};
19
- }
20
- return fakeEnv;
21
- }
22
- }
23
- const BASE = (() => {
24
- let webBase = 'https://cloudpss.net/';
25
- if (typeof document == 'object' && document.baseURI && document.baseURI.startsWith('http')) {
26
- webBase = document.baseURI;
27
- }
28
- else if (typeof location == 'object' && location.protocol.startsWith('http')) {
29
- webBase = location.href;
30
- }
31
- const homeUrl = env()['CLOUDPSS_HOME_URL'];
32
- if (homeUrl) {
33
- try {
34
- const home = new URL(homeUrl, webBase);
35
- return home.href;
36
- }
37
- catch {
38
- // ignore
39
- }
40
- }
41
- return webBase;
42
- })();
43
- /** 获取 url */
44
- function getUrl(envName, defaults) {
45
- let url;
46
- const e = env();
47
- if (e[envName]) {
48
- url = e[envName];
49
- }
50
- else {
51
- url = defaults;
52
- }
53
- if (typeof url != 'string') {
54
- throw new Error('url must be a string');
55
- }
56
- const u = new URL(url, BASE);
57
- const ret = u.href.endsWith('/') ? u.href.slice(0, u.href.length - 1) : u.href;
58
- e[envName] = ret;
59
- return ret;
60
- }
61
- const cloudpssEnv = {};
62
- const def = [
63
- ['API_URL', '/api'],
64
- ['GQL_URL', '/graphql'],
65
- ['HOME_URL', '/'],
66
- ];
67
- for (const [name, defaults] of def) {
68
- const envName = `CLOUDPSS_${name}`;
69
- Object.defineProperty(cloudpssEnv, name, {
70
- get() {
71
- return getUrl(envName, defaults);
72
- },
73
- set(value) {
74
- const e = env();
75
- if (!value) {
76
- e[envName] = '';
77
- }
78
- else {
79
- e[envName] = String(value);
80
- }
81
- getUrl(envName, defaults);
82
- },
83
- enumerable: true,
84
- });
85
- }
86
- Object.freeze(cloudpssEnv);
87
- exports.default = cloudpssEnv;
88
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- declare const cloudpssEnv: {
2
- /** API 地址,eg: https://cloudpss.net/api */
3
- API_URL: string;
4
- /** GraphQL 地址,eg: https://cloudpss.net/graphql */
5
- GQL_URL: string;
6
- /** 主页地址,eg: https://cloudpss.net */
7
- HOME_URL: string;
8
- };
9
- export default cloudpssEnv;
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}