@expo/env 0.0.3 → 0.0.5

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/build/env.d.ts CHANGED
@@ -1,17 +1,19 @@
1
- /**
2
- * Copyright © 2023 650 Industries.
3
- *
4
- * This source code is licensed under the MIT license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- */
7
1
  /// <reference types="node" />
2
+ type LoadOptions = {
3
+ silent?: boolean;
4
+ force?: boolean;
5
+ };
6
+ export declare function isEnabled(): boolean;
8
7
  export declare function createControlledEnvironment(): {
9
- load: (projectRoot: string, { force }?: {
10
- force?: boolean | undefined;
11
- }) => NodeJS.ProcessEnv;
12
- get: (projectRoot: string, { force }?: {
13
- force?: boolean | undefined;
14
- }) => Record<string, string | undefined>;
15
- _getForce: (projectRoot: string) => Record<string, string | undefined>;
8
+ load: (projectRoot: string, options?: LoadOptions) => NodeJS.ProcessEnv;
9
+ get: (projectRoot: string, options?: LoadOptions) => {
10
+ env: Record<string, string | undefined>;
11
+ files: string[];
12
+ };
13
+ _getForce: (projectRoot: string, options?: LoadOptions) => {
14
+ env: Record<string, string | undefined>;
15
+ files: string[];
16
+ };
16
17
  };
17
- export declare function getFiles(mode: string | undefined): string[];
18
+ export declare function getFiles(mode: string | undefined, { silent }?: Pick<LoadOptions, 'silent'>): string[];
19
+ export {};
package/build/env.js CHANGED
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createControlledEnvironment = createControlledEnvironment;
7
7
  exports.getFiles = getFiles;
8
+ exports.isEnabled = isEnabled;
8
9
  function _chalk() {
9
10
  const data = _interopRequireDefault(require("chalk"));
10
11
  _chalk = function () {
@@ -33,6 +34,13 @@ function fs() {
33
34
  };
34
35
  return data;
35
36
  }
37
+ function _getenv() {
38
+ const data = require("getenv");
39
+ _getenv = function () {
40
+ return data;
41
+ };
42
+ return data;
43
+ }
36
44
  function path() {
37
45
  const data = _interopRequireWildcard(require("path"));
38
46
  path = function () {
@@ -51,11 +59,21 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
51
59
  */
52
60
 
53
61
  const debug = require('debug')('expo:env');
62
+ function isEnabled() {
63
+ return !(0, _getenv().boolish)('EXPO_NO_DOTENV', false);
64
+ }
54
65
  function createControlledEnvironment() {
55
66
  const IS_DEBUG = require('debug').enabled('expo:env');
56
67
  let userDefinedEnvironment = undefined;
57
- let memoEnvironment = undefined;
58
- function _getForce(projectRoot) {
68
+ let memo = undefined;
69
+ function _getForce(projectRoot, options = {}) {
70
+ if (!isEnabled()) {
71
+ debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);
72
+ return {
73
+ env: {},
74
+ files: []
75
+ };
76
+ }
59
77
  if (!userDefinedEnvironment) {
60
78
  userDefinedEnvironment = {
61
79
  ...process.env
@@ -63,7 +81,7 @@ function createControlledEnvironment() {
63
81
  }
64
82
 
65
83
  // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
66
- const dotenvFiles = getFiles(process.env.NODE_ENV);
84
+ const dotenvFiles = getFiles(process.env.NODE_ENV, options);
67
85
  const loadedEnvFiles = [];
68
86
  const parsed = {};
69
87
 
@@ -110,30 +128,45 @@ function createControlledEnvironment() {
110
128
  if (!loadedEnvFiles.length) {
111
129
  debug(`No environment variables loaded from .env files.`);
112
130
  }
113
- return parsed;
131
+ return {
132
+ env: parsed,
133
+ files: loadedEnvFiles
134
+ };
114
135
  }
115
136
 
116
137
  /** Get the environment variables without mutating the environment. This returns memoized values unless the `force` property is provided. */
117
- function get(projectRoot, {
118
- force
119
- } = {}) {
120
- if (!force && memoEnvironment) {
121
- return memoEnvironment;
138
+ function get(projectRoot, options = {}) {
139
+ if (!isEnabled()) {
140
+ debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);
141
+ return {
142
+ env: {},
143
+ files: []
144
+ };
145
+ }
146
+ if (!options.force && memo) {
147
+ return memo;
122
148
  }
123
- memoEnvironment = _getForce(projectRoot);
124
- return memoEnvironment;
149
+ memo = _getForce(projectRoot, options);
150
+ return memo;
125
151
  }
126
152
 
127
153
  /** Load environment variables from .env files and mutate the current `process.env` with the results. */
128
- function load(projectRoot, {
129
- force
130
- } = {}) {
131
- const env = get(projectRoot, {
132
- force
133
- });
154
+ function load(projectRoot, options = {}) {
155
+ if (!isEnabled()) {
156
+ debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);
157
+ return process.env;
158
+ }
159
+ const envInfo = get(projectRoot, options);
160
+ if (!options.force) {
161
+ const keys = Object.keys(envInfo.env);
162
+ if (keys.length) {
163
+ console.log(_chalk().default.gray('env: load', envInfo.files.map(file => path().basename(file)).join(' ')));
164
+ console.log(_chalk().default.gray('env: export', keys.join(' ')));
165
+ }
166
+ }
134
167
  process.env = {
135
168
  ...process.env,
136
- ...env
169
+ ...envInfo.env
137
170
  };
138
171
  return process.env;
139
172
  }
@@ -143,10 +176,20 @@ function createControlledEnvironment() {
143
176
  _getForce
144
177
  };
145
178
  }
146
- function getFiles(mode) {
179
+ function getFiles(mode, {
180
+ silent = false
181
+ } = {}) {
182
+ if (!isEnabled()) {
183
+ debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);
184
+ return [];
185
+ }
147
186
  if (!mode) {
148
- console.error(_chalk().default.red('The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set.'));
149
- console.error(_chalk().default.red('Proceeding without mode-specific .env'));
187
+ if (silent) {
188
+ debug('NODE_ENV is not defined, proceeding without mode-specific .env');
189
+ } else {
190
+ console.error(_chalk().default.red('The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set.'));
191
+ console.error(_chalk().default.red('Proceeding without mode-specific .env'));
192
+ }
150
193
  }
151
194
  if (mode && !['development', 'test', 'production'].includes(mode)) {
152
195
  throw new Error(`Environment variable "NODE_ENV=${mode}" is invalid. Valid values are "development", "test", and "production`);
package/build/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","names":["_chalk","data","_interopRequireDefault","require","dotenv","_interopRequireWildcard","_dotenvExpand","fs","path","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","debug","createControlledEnvironment","IS_DEBUG","enabled","userDefinedEnvironment","undefined","memoEnvironment","_getForce","projectRoot","process","env","dotenvFiles","getFiles","NODE_ENV","loadedEnvFiles","parsed","forEach","dotenvFile","absoluteDotenvFile","resolve","existsSync","results","expand","config","override","push","keys","_userDefinedEnvironme","error","Error","console","message","length","force","load","mode","chalk","red","includes","filter","Boolean"],"sources":["../src/env.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport chalk from 'chalk';\nimport * as dotenv from 'dotenv';\nimport { expand } from 'dotenv-expand';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\nexport function createControlledEnvironment() {\n const IS_DEBUG = require('debug').enabled('expo:env');\n\n let userDefinedEnvironment: NodeJS.ProcessEnv | undefined = undefined;\n let memoEnvironment: NodeJS.ProcessEnv | undefined = undefined;\n\n function _getForce(projectRoot: string): Record<string, string | undefined> {\n if (!userDefinedEnvironment) {\n userDefinedEnvironment = { ...process.env };\n }\n\n // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use\n const dotenvFiles = getFiles(process.env.NODE_ENV);\n\n const loadedEnvFiles: string[] = [];\n const parsed: dotenv.DotenvParseOutput = {};\n\n // Load environment variables from .env* files. Suppress warnings using silent\n // if this file is missing. dotenv will never modify any environment variables\n // that have already been set. Variable expansion is supported in .env files.\n // https://github.com/motdotla/dotenv\n // https://github.com/motdotla/dotenv-expand\n dotenvFiles.forEach((dotenvFile) => {\n const absoluteDotenvFile = path.resolve(projectRoot, dotenvFile);\n if (!fs.existsSync(absoluteDotenvFile)) {\n return;\n }\n try {\n const results = expand(\n dotenv.config({\n debug: IS_DEBUG,\n path: absoluteDotenvFile,\n // We will handle overriding ourselves to allow for HMR.\n override: true,\n })\n );\n if (results.parsed) {\n loadedEnvFiles.push(absoluteDotenvFile);\n debug(`Loaded environment variables from: ${absoluteDotenvFile}`);\n\n for (const key of Object.keys(results.parsed || {})) {\n if (\n typeof parsed[key] === 'undefined' &&\n // Custom override logic to prevent overriding variables that\n // were set before the CLI process began.\n typeof userDefinedEnvironment?.[key] === 'undefined'\n ) {\n parsed[key] = results.parsed[key];\n }\n }\n } else {\n debug(`Failed to load environment variables from: ${absoluteDotenvFile}`);\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(\n `Failed to load environment variables from ${absoluteDotenvFile}: ${error.message}`\n );\n } else {\n throw error;\n }\n }\n });\n\n if (!loadedEnvFiles.length) {\n debug(`No environment variables loaded from .env files.`);\n }\n\n return parsed;\n }\n\n /** Get the environment variables without mutating the environment. This returns memoized values unless the `force` property is provided. */\n function get(\n projectRoot: string,\n { force }: { force?: boolean } = {}\n ): Record<string, string | undefined> {\n if (!force && memoEnvironment) {\n return memoEnvironment;\n }\n memoEnvironment = _getForce(projectRoot);\n return memoEnvironment;\n }\n\n /** Load environment variables from .env files and mutate the current `process.env` with the results. */\n function load(projectRoot: string, { force }: { force?: boolean } = {}) {\n const env = get(projectRoot, { force });\n process.env = { ...process.env, ...env };\n return process.env;\n }\n\n return {\n load,\n get,\n _getForce,\n };\n}\n\nexport function getFiles(mode: string | undefined): string[] {\n if (!mode) {\n console.error(\n chalk.red(\n 'The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set.'\n )\n );\n console.error(chalk.red('Proceeding without mode-specific .env'));\n }\n\n if (mode && !['development', 'test', 'production'].includes(mode)) {\n throw new Error(\n `Environment variable \"NODE_ENV=${mode}\" is invalid. Valid values are \"development\", \"test\", and \"production`\n );\n }\n\n if (!mode) {\n // Support environments that don't respect NODE_ENV\n return [`.env.local`, '.env'];\n }\n // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use\n const dotenvFiles = [\n `.env.${mode}.local`,\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n mode !== 'test' && `.env.local`,\n `.env.${mode}`,\n '.env',\n ].filter(Boolean) as string[];\n\n return dotenvFiles;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"env.js","names":["_chalk","data","_interopRequireDefault","require","dotenv","_interopRequireWildcard","_dotenvExpand","fs","_getenv","path","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","debug","isEnabled","boolish","createControlledEnvironment","IS_DEBUG","enabled","userDefinedEnvironment","undefined","memo","_getForce","projectRoot","options","env","files","process","dotenvFiles","getFiles","NODE_ENV","loadedEnvFiles","parsed","forEach","dotenvFile","absoluteDotenvFile","resolve","existsSync","results","expand","config","override","push","keys","_userDefinedEnvironme","error","Error","console","message","length","force","load","envInfo","log","chalk","gray","map","file","basename","join","mode","silent","red","includes","filter","Boolean"],"sources":["../src/env.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport chalk from 'chalk';\nimport * as dotenv from 'dotenv';\nimport { expand } from 'dotenv-expand';\nimport * as fs from 'fs';\nimport { boolish } from 'getenv';\nimport * as path from 'path';\n\ntype LoadOptions = {\n silent?: boolean;\n force?: boolean;\n};\n\nconst debug = require('debug')('expo:env') as typeof console.log;\n\nexport function isEnabled(): boolean {\n return !boolish('EXPO_NO_DOTENV', false);\n}\n\nexport function createControlledEnvironment() {\n const IS_DEBUG = require('debug').enabled('expo:env');\n\n let userDefinedEnvironment: NodeJS.ProcessEnv | undefined = undefined;\n let memo: { env: NodeJS.ProcessEnv; files: string[] } | undefined = undefined;\n\n function _getForce(\n projectRoot: string,\n options: LoadOptions = {}\n ): { env: Record<string, string | undefined>; files: string[] } {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n\n if (!userDefinedEnvironment) {\n userDefinedEnvironment = { ...process.env };\n }\n\n // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use\n const dotenvFiles = getFiles(process.env.NODE_ENV, options);\n\n const loadedEnvFiles: string[] = [];\n const parsed: dotenv.DotenvParseOutput = {};\n\n // Load environment variables from .env* files. Suppress warnings using silent\n // if this file is missing. dotenv will never modify any environment variables\n // that have already been set. Variable expansion is supported in .env files.\n // https://github.com/motdotla/dotenv\n // https://github.com/motdotla/dotenv-expand\n dotenvFiles.forEach((dotenvFile) => {\n const absoluteDotenvFile = path.resolve(projectRoot, dotenvFile);\n if (!fs.existsSync(absoluteDotenvFile)) {\n return;\n }\n try {\n const results = expand(\n dotenv.config({\n debug: IS_DEBUG,\n path: absoluteDotenvFile,\n // We will handle overriding ourselves to allow for HMR.\n override: true,\n })\n );\n if (results.parsed) {\n loadedEnvFiles.push(absoluteDotenvFile);\n debug(`Loaded environment variables from: ${absoluteDotenvFile}`);\n\n for (const key of Object.keys(results.parsed || {})) {\n if (\n typeof parsed[key] === 'undefined' &&\n // Custom override logic to prevent overriding variables that\n // were set before the CLI process began.\n typeof userDefinedEnvironment?.[key] === 'undefined'\n ) {\n parsed[key] = results.parsed[key];\n }\n }\n } else {\n debug(`Failed to load environment variables from: ${absoluteDotenvFile}`);\n }\n } catch (error: unknown) {\n if (error instanceof Error) {\n console.error(\n `Failed to load environment variables from ${absoluteDotenvFile}: ${error.message}`\n );\n } else {\n throw error;\n }\n }\n });\n\n if (!loadedEnvFiles.length) {\n debug(`No environment variables loaded from .env files.`);\n }\n\n return { env: parsed, files: loadedEnvFiles };\n }\n\n /** Get the environment variables without mutating the environment. This returns memoized values unless the `force` property is provided. */\n function get(\n projectRoot: string,\n options: LoadOptions = {}\n ): { env: Record<string, string | undefined>; files: string[] } {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return { env: {}, files: [] };\n }\n if (!options.force && memo) {\n return memo;\n }\n memo = _getForce(projectRoot, options);\n return memo;\n }\n\n /** Load environment variables from .env files and mutate the current `process.env` with the results. */\n function load(projectRoot: string, options: LoadOptions = {}) {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return process.env;\n }\n\n const envInfo = get(projectRoot, options);\n\n if (!options.force) {\n const keys = Object.keys(envInfo.env);\n if (keys.length) {\n console.log(\n chalk.gray('env: load', envInfo.files.map((file) => path.basename(file)).join(' '))\n );\n console.log(chalk.gray('env: export', keys.join(' ')));\n }\n }\n\n process.env = { ...process.env, ...envInfo.env };\n return process.env;\n }\n\n return {\n load,\n get,\n _getForce,\n };\n}\n\nexport function getFiles(\n mode: string | undefined,\n { silent = false }: Pick<LoadOptions, 'silent'> = {}\n): string[] {\n if (!isEnabled()) {\n debug(`Skipping .env files because EXPO_NO_DOTENV is defined`);\n return [];\n }\n\n if (!mode) {\n if (silent) {\n debug('NODE_ENV is not defined, proceeding without mode-specific .env');\n } else {\n console.error(\n chalk.red(\n 'The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set.'\n )\n );\n console.error(chalk.red('Proceeding without mode-specific .env'));\n }\n }\n\n if (mode && !['development', 'test', 'production'].includes(mode)) {\n throw new Error(\n `Environment variable \"NODE_ENV=${mode}\" is invalid. Valid values are \"development\", \"test\", and \"production`\n );\n }\n\n if (!mode) {\n // Support environments that don't respect NODE_ENV\n return [`.env.local`, '.env'];\n }\n // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use\n const dotenvFiles = [\n `.env.${mode}.local`,\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n mode !== 'test' && `.env.local`,\n `.env.${mode}`,\n '.env',\n ].filter(Boolean) as string[];\n\n return dotenvFiles;\n}\n"],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -5,10 +5,15 @@
5
5
  * This source code is licensed under the MIT license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
- import { getFiles } from './env';
9
- declare const get: (projectRoot: string, { force }?: {
8
+ import { getFiles, isEnabled } from './env';
9
+ declare const get: (projectRoot: string, options?: {
10
+ silent?: boolean | undefined;
10
11
  force?: boolean | undefined;
11
- }) => Record<string, string | undefined>, load: (projectRoot: string, { force }?: {
12
+ }) => {
13
+ env: Record<string, string | undefined>;
14
+ files: string[];
15
+ }, load: (projectRoot: string, options?: {
16
+ silent?: boolean | undefined;
12
17
  force?: boolean | undefined;
13
18
  }) => NodeJS.ProcessEnv;
14
- export { getFiles, get, load };
19
+ export { getFiles, get, load, isEnabled };
package/build/index.js CHANGED
@@ -10,6 +10,12 @@ Object.defineProperty(exports, "getFiles", {
10
10
  return _env().getFiles;
11
11
  }
12
12
  });
13
+ Object.defineProperty(exports, "isEnabled", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _env().isEnabled;
17
+ }
18
+ });
13
19
  exports.load = void 0;
14
20
  function _env() {
15
21
  const data = require("./env");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_env","data","require","get","load","createControlledEnvironment","exports"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { createControlledEnvironment, getFiles } from './env';\n\nconst { get, load } = createControlledEnvironment();\n\nexport { getFiles, get, load };\n"],"mappings":";;;;;;;;;;;;;AAMA,SAAAA,KAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AANA;AACA;AACA;AACA;AACA;AACA;;AAGA,MAAM;EAAEE,GAAG;EAAEC;AAAK,CAAC,GAAG,IAAAC,kCAA2B,GAAE;AAACC,OAAA,CAAAF,IAAA,GAAAA,IAAA;AAAAE,OAAA,CAAAH,GAAA,GAAAA,GAAA"}
1
+ {"version":3,"file":"index.js","names":["_env","data","require","get","load","createControlledEnvironment","exports"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { createControlledEnvironment, getFiles, isEnabled } from './env';\n\nconst { get, load } = createControlledEnvironment();\n\nexport { getFiles, get, load, isEnabled };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAMA,SAAAA,KAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,IAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AANA;AACA;AACA;AACA;AACA;AACA;;AAGA,MAAM;EAAEE,GAAG;EAAEC;AAAK,CAAC,GAAG,IAAAC,kCAA2B,GAAE;AAACC,OAAA,CAAAF,IAAA,GAAAA,IAAA;AAAAE,OAAA,CAAAH,GAAA,GAAAA,GAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/env",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "hydrate environment variables from .env files into process.env",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -29,13 +29,15 @@
29
29
  "dotenv": "~16.0.3",
30
30
  "dotenv-expand": "~10.0.0",
31
31
  "chalk": "^4.0.0",
32
- "debug": "^4.3.4"
32
+ "debug": "^4.3.4",
33
+ "getenv": "^1.0.0"
33
34
  },
34
35
  "devDependencies": {
35
- "@babel/core": "^7.15.5"
36
+ "@babel/core": "^7.15.5",
37
+ "@types/getenv": "^1.0.0"
36
38
  },
37
39
  "publishConfig": {
38
40
  "access": "public"
39
41
  },
40
- "gitHead": "4ba50c428c8369bb6b3a51a860d4898ad4ccbe78"
42
+ "gitHead": "554e8b88a1a5d7f54c67cdb66e928a0adfb8731d"
41
43
  }