@effect/platform 0.68.0 → 0.68.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/dist/cjs/PlatformConfigProvider.js +24 -1
- package/dist/cjs/PlatformConfigProvider.js.map +1 -1
- package/dist/cjs/internal/platformConfigProvider.js +117 -0
- package/dist/cjs/internal/platformConfigProvider.js.map +1 -0
- package/dist/dts/PlatformConfigProvider.d.ts +23 -0
- package/dist/dts/PlatformConfigProvider.d.ts.map +1 -1
- package/dist/dts/internal/platformConfigProvider.d.ts +2 -0
- package/dist/dts/internal/platformConfigProvider.d.ts.map +1 -0
- package/dist/esm/PlatformConfigProvider.js +23 -0
- package/dist/esm/PlatformConfigProvider.js.map +1 -1
- package/dist/esm/internal/platformConfigProvider.js +106 -0
- package/dist/esm/internal/platformConfigProvider.js.map +1 -0
- package/package.json +1 -1
- package/src/PlatformConfigProvider.ts +30 -0
- package/src/internal/platformConfigProvider.ts +148 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.layerFileTreeAdd = exports.layerFileTree = exports.fromFileTree = void 0;
|
|
6
|
+
exports.layerFileTreeAdd = exports.layerFileTree = exports.layerDotEnvAdd = exports.layerDotEnv = exports.fromFileTree = exports.fromDotEnv = void 0;
|
|
7
7
|
var Arr = _interopRequireWildcard(require("effect/Array"));
|
|
8
8
|
var Cause = _interopRequireWildcard(require("effect/Cause"));
|
|
9
9
|
var ConfigError = _interopRequireWildcard(require("effect/ConfigError"));
|
|
@@ -17,6 +17,7 @@ var HashSet = _interopRequireWildcard(require("effect/HashSet"));
|
|
|
17
17
|
var Layer = _interopRequireWildcard(require("effect/Layer"));
|
|
18
18
|
var _Error = require("./Error.js");
|
|
19
19
|
var FileSystem = _interopRequireWildcard(require("./FileSystem.js"));
|
|
20
|
+
var internal = _interopRequireWildcard(require("./internal/platformConfigProvider.js"));
|
|
20
21
|
var Path = _interopRequireWildcard(require("./Path.js"));
|
|
21
22
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
22
23
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -65,5 +66,27 @@ const layerFileTreeAdd = options => fromFileTree(options).pipe(Effect.map(provid
|
|
|
65
66
|
*/
|
|
66
67
|
exports.layerFileTreeAdd = layerFileTreeAdd;
|
|
67
68
|
const layerFileTree = options => fromFileTree(options).pipe(Effect.map(Layer.setConfigProvider), Layer.unwrapEffect);
|
|
69
|
+
/**
|
|
70
|
+
* Create a dotenv ConfigProvider.
|
|
71
|
+
*
|
|
72
|
+
* @category constructors
|
|
73
|
+
* @since 1.0.0
|
|
74
|
+
*/
|
|
68
75
|
exports.layerFileTree = layerFileTree;
|
|
76
|
+
const fromDotEnv = exports.fromDotEnv = internal.fromDotEnv;
|
|
77
|
+
/**
|
|
78
|
+
* Add the dotenv ConfigProvider to the environment, as a fallback to the current ConfigProvider.
|
|
79
|
+
* If the file is not found, a debug log is produced and empty layer is returned.
|
|
80
|
+
*
|
|
81
|
+
* @since 1.0.0
|
|
82
|
+
* @category layers
|
|
83
|
+
*/
|
|
84
|
+
const layerDotEnvAdd = exports.layerDotEnvAdd = internal.layerDotEnvAdd;
|
|
85
|
+
/**
|
|
86
|
+
* Add the dotenv ConfigProvider to the environment, replacing the current ConfigProvider.
|
|
87
|
+
*
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
* @category layers
|
|
90
|
+
*/
|
|
91
|
+
const layerDotEnv = exports.layerDotEnv = internal.layerDotEnv;
|
|
69
92
|
//# sourceMappingURL=PlatformConfigProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformConfigProvider.js","names":["Arr","_interopRequireWildcard","require","Cause","ConfigError","ConfigProvider","PathPatch","Context","DefaultServices","Effect","Either","HashSet","Layer","_Error","FileSystem","Path","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","fromFileTree","options","Do","pipe","bind","map","fs","path","rootDirectory","parseConfig","primitive","value","parse","trim","of","readConfig","filePath","flatMap","readFileString","resolveEnumerableDirs","segments","length","join","resolveFilePath","pathSegments","sourceError","error","SourceUnavailable","message","fail","pathNotFoundError","MissingData","handlePlatformError","_tag","reason","fromFlat","makeFlat","load","config","catchIf","isPlatformError","enumerateChildren","forEach","dir","readDirectory","files","fromIterable","flat","patch","empty","exports","layerFileTreeAdd","provider","fiberRefLocallyScopedWith","currentServices","services","current","add","orElse","unwrapEffect","layerFileTree","setConfigProvider"],"sources":["../../src/PlatformConfigProvider.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,GAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAF,uBAAA,CAAAC,OAAA;AAEA,IAAAE,WAAA,GAAAH,uBAAA,CAAAC,OAAA;AACA,IAAAG,cAAA,GAAAJ,uBAAA,CAAAC,OAAA;AACA,IAAAI,SAAA,GAAAL,uBAAA,CAAAC,OAAA;AACA,IAAAK,OAAA,GAAAN,uBAAA,CAAAC,OAAA;AACA,IAAAM,eAAA,GAAAP,uBAAA,CAAAC,OAAA;AACA,IAAAO,MAAA,GAAAR,uBAAA,CAAAC,OAAA;AACA,IAAAQ,MAAA,GAAAT,uBAAA,CAAAC,OAAA;AACA,IAAAS,OAAA,GAAAV,uBAAA,CAAAC,OAAA;AACA,IAAAU,KAAA,GAAAX,uBAAA,CAAAC,OAAA;AACA,IAAAW,MAAA,GAAAX,OAAA;AACA,IAAAY,UAAA,GAAAb,uBAAA,CAAAC,OAAA;AACA,IAAAa,
|
|
1
|
+
{"version":3,"file":"PlatformConfigProvider.js","names":["Arr","_interopRequireWildcard","require","Cause","ConfigError","ConfigProvider","PathPatch","Context","DefaultServices","Effect","Either","HashSet","Layer","_Error","FileSystem","internal","Path","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","fromFileTree","options","Do","pipe","bind","map","fs","path","rootDirectory","parseConfig","primitive","value","parse","trim","of","readConfig","filePath","flatMap","readFileString","resolveEnumerableDirs","segments","length","join","resolveFilePath","pathSegments","sourceError","error","SourceUnavailable","message","fail","pathNotFoundError","MissingData","handlePlatformError","_tag","reason","fromFlat","makeFlat","load","config","catchIf","isPlatformError","enumerateChildren","forEach","dir","readDirectory","files","fromIterable","flat","patch","empty","exports","layerFileTreeAdd","provider","fiberRefLocallyScopedWith","currentServices","services","current","add","orElse","unwrapEffect","layerFileTree","setConfigProvider","fromDotEnv","layerDotEnvAdd","layerDotEnv"],"sources":["../../src/PlatformConfigProvider.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.layerDotEnvAdd = exports.layerDotEnv = exports.fromDotEnv = void 0;
|
|
7
|
+
var FileSystem = _interopRequireWildcard(require("@effect/platform/FileSystem"));
|
|
8
|
+
var ConfigProvider = _interopRequireWildcard(require("effect/ConfigProvider"));
|
|
9
|
+
var Context = _interopRequireWildcard(require("effect/Context"));
|
|
10
|
+
var DefaultServices = _interopRequireWildcard(require("effect/DefaultServices"));
|
|
11
|
+
var Effect = _interopRequireWildcard(require("effect/Effect"));
|
|
12
|
+
var FiberRef = _interopRequireWildcard(require("effect/FiberRef"));
|
|
13
|
+
var Layer = _interopRequireWildcard(require("effect/Layer"));
|
|
14
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
+
/**
|
|
17
|
+
* dot env ConfigProvider
|
|
18
|
+
*
|
|
19
|
+
* Based on
|
|
20
|
+
* - https://github.com/motdotla/dotenv
|
|
21
|
+
* - https://github.com/motdotla/dotenv-expand
|
|
22
|
+
*/
|
|
23
|
+
/** @internal */
|
|
24
|
+
const fromDotEnv = path => Effect.gen(function* (_) {
|
|
25
|
+
const fs = yield* FileSystem.FileSystem;
|
|
26
|
+
const content = yield* fs.readFileString(path);
|
|
27
|
+
const obj = parseDotEnv(content);
|
|
28
|
+
return ConfigProvider.fromJson(obj);
|
|
29
|
+
});
|
|
30
|
+
/** @internal */
|
|
31
|
+
exports.fromDotEnv = fromDotEnv;
|
|
32
|
+
const layerDotEnv = path => fromDotEnv(path).pipe(Effect.map(Layer.setConfigProvider), Layer.unwrapEffect);
|
|
33
|
+
/** @internal */
|
|
34
|
+
exports.layerDotEnv = layerDotEnv;
|
|
35
|
+
const layerDotEnvAdd = path => Effect.gen(function* (_) {
|
|
36
|
+
const dotEnvConfigProvider = yield* Effect.orElseSucceed(fromDotEnv(path), () => null);
|
|
37
|
+
if (dotEnvConfigProvider === null) {
|
|
38
|
+
yield* Effect.logDebug(`File '${path}' not found, skipping dotenv ConfigProvider.`);
|
|
39
|
+
return Layer.empty;
|
|
40
|
+
}
|
|
41
|
+
const currentConfigProvider = yield* FiberRef.get(DefaultServices.currentServices).pipe(Effect.map(services => Context.get(services, ConfigProvider.ConfigProvider)));
|
|
42
|
+
const configProvider = ConfigProvider.orElse(currentConfigProvider, () => dotEnvConfigProvider);
|
|
43
|
+
return Layer.setConfigProvider(configProvider);
|
|
44
|
+
}).pipe(Layer.unwrapEffect);
|
|
45
|
+
/** @internal */
|
|
46
|
+
exports.layerDotEnvAdd = layerDotEnvAdd;
|
|
47
|
+
const DOT_ENV_LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
|
|
48
|
+
/** @internal */
|
|
49
|
+
const parseDotEnv = lines => {
|
|
50
|
+
const obj = {};
|
|
51
|
+
// Convert line breaks to same format
|
|
52
|
+
lines = lines.replace(/\r\n?/gm, "\n");
|
|
53
|
+
let match;
|
|
54
|
+
while ((match = DOT_ENV_LINE.exec(lines)) != null) {
|
|
55
|
+
const key = match[1];
|
|
56
|
+
// Default undefined or null to empty string
|
|
57
|
+
let value = match[2] || "";
|
|
58
|
+
// Remove whitespace
|
|
59
|
+
value = value.trim();
|
|
60
|
+
// Check if double quoted
|
|
61
|
+
const maybeQuote = value[0];
|
|
62
|
+
// Remove surrounding quotes
|
|
63
|
+
value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2");
|
|
64
|
+
// Expand newlines if double quoted
|
|
65
|
+
if (maybeQuote === "\"") {
|
|
66
|
+
value = value.replace(/\\n/g, "\n");
|
|
67
|
+
value = value.replace(/\\r/g, "\r");
|
|
68
|
+
}
|
|
69
|
+
// Add to object
|
|
70
|
+
obj[key] = value;
|
|
71
|
+
}
|
|
72
|
+
return expand(obj);
|
|
73
|
+
};
|
|
74
|
+
/** @internal */
|
|
75
|
+
const expand = parsed => {
|
|
76
|
+
const newParsed = {};
|
|
77
|
+
for (const configKey in parsed) {
|
|
78
|
+
// resolve escape sequences
|
|
79
|
+
newParsed[configKey] = interpolate(parsed[configKey], parsed).replace(/\\\$/g, "$");
|
|
80
|
+
}
|
|
81
|
+
return newParsed;
|
|
82
|
+
};
|
|
83
|
+
/** @internal */
|
|
84
|
+
const interpolate = (envValue, parsed) => {
|
|
85
|
+
// find the last unescaped dollar sign in the
|
|
86
|
+
// value so that we can evaluate it
|
|
87
|
+
const lastUnescapedDollarSignIndex = searchLast(envValue, /(?!(?<=\\))\$/g);
|
|
88
|
+
// If we couldn't match any unescaped dollar sign
|
|
89
|
+
// let's return the string as is
|
|
90
|
+
if (lastUnescapedDollarSignIndex === -1) return envValue;
|
|
91
|
+
// This is the right-most group of variables in the string
|
|
92
|
+
const rightMostGroup = envValue.slice(lastUnescapedDollarSignIndex);
|
|
93
|
+
/**
|
|
94
|
+
* This finds the inner most variable/group divided
|
|
95
|
+
* by variable name and default value (if present)
|
|
96
|
+
* (
|
|
97
|
+
* (?!(?<=\\))\$ // only match dollar signs that are not escaped
|
|
98
|
+
* {? // optional opening curly brace
|
|
99
|
+
* ([\w]+) // match the variable name
|
|
100
|
+
* (?::-([^}\\]*))? // match an optional default value
|
|
101
|
+
* }? // optional closing curly brace
|
|
102
|
+
* )
|
|
103
|
+
*/
|
|
104
|
+
const matchGroup = /((?!(?<=\\))\${?([\w]+)(?::-([^}\\]*))?}?)/;
|
|
105
|
+
const match = rightMostGroup.match(matchGroup);
|
|
106
|
+
if (match !== null) {
|
|
107
|
+
const [_, group, variableName, defaultValue] = match;
|
|
108
|
+
return interpolate(envValue.replace(group, defaultValue || parsed[variableName] || ""), parsed);
|
|
109
|
+
}
|
|
110
|
+
return envValue;
|
|
111
|
+
};
|
|
112
|
+
/** @internal */
|
|
113
|
+
const searchLast = (str, rgx) => {
|
|
114
|
+
const matches = Array.from(str.matchAll(rgx));
|
|
115
|
+
return matches.length > 0 ? matches.slice(-1)[0].index : -1;
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=platformConfigProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformConfigProvider.js","names":["FileSystem","_interopRequireWildcard","require","ConfigProvider","Context","DefaultServices","Effect","FiberRef","Layer","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","fromDotEnv","path","gen","_","fs","content","readFileString","obj","parseDotEnv","fromJson","exports","layerDotEnv","pipe","map","setConfigProvider","unwrapEffect","layerDotEnvAdd","dotEnvConfigProvider","orElseSucceed","logDebug","empty","currentConfigProvider","currentServices","services","configProvider","orElse","DOT_ENV_LINE","lines","replace","match","exec","key","value","trim","maybeQuote","expand","parsed","newParsed","configKey","interpolate","envValue","lastUnescapedDollarSignIndex","searchLast","rightMostGroup","slice","matchGroup","group","variableName","defaultValue","str","rgx","matches","Array","from","matchAll","length","index"],"sources":["../../../src/internal/platformConfigProvider.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as ConfigProvider from "effect/ConfigProvider";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
|
+
import { type PlatformError } from "./Error.js";
|
|
4
5
|
import * as FileSystem from "./FileSystem.js";
|
|
5
6
|
import * as Path from "./Path.js";
|
|
6
7
|
/**
|
|
@@ -28,4 +29,26 @@ export declare const layerFileTreeAdd: (options?: {
|
|
|
28
29
|
export declare const layerFileTree: (options?: {
|
|
29
30
|
readonly rootDirectory?: string;
|
|
30
31
|
}) => Layer.Layer<never, never, Path.Path | FileSystem.FileSystem>;
|
|
32
|
+
/**
|
|
33
|
+
* Create a dotenv ConfigProvider.
|
|
34
|
+
*
|
|
35
|
+
* @category constructors
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
*/
|
|
38
|
+
export declare const fromDotEnv: (paths: string) => Effect.Effect<ConfigProvider.ConfigProvider, PlatformError, FileSystem.FileSystem>;
|
|
39
|
+
/**
|
|
40
|
+
* Add the dotenv ConfigProvider to the environment, as a fallback to the current ConfigProvider.
|
|
41
|
+
* If the file is not found, a debug log is produced and empty layer is returned.
|
|
42
|
+
*
|
|
43
|
+
* @since 1.0.0
|
|
44
|
+
* @category layers
|
|
45
|
+
*/
|
|
46
|
+
export declare const layerDotEnvAdd: (path: string) => Layer.Layer<never, never, FileSystem.FileSystem>;
|
|
47
|
+
/**
|
|
48
|
+
* Add the dotenv ConfigProvider to the environment, replacing the current ConfigProvider.
|
|
49
|
+
*
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
* @category layers
|
|
52
|
+
*/
|
|
53
|
+
export declare const layerDotEnv: (path: string) => Layer.Layer<never, PlatformError, FileSystem.FileSystem>;
|
|
31
54
|
//# sourceMappingURL=PlatformConfigProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformConfigProvider.d.ts","sourceRoot":"","sources":["../../src/PlatformConfigProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AAIvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"PlatformConfigProvider.d.ts","sourceRoot":"","sources":["../../src/PlatformConfigProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AAIvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC;;;GAGG;AACH,eAAO,MAAM,YAAY,aAAc;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC,KAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,CAsDtF,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,aAAc;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,CAS5D,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,aAAc;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,UAAU,CAI5D,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,CACvB,KAAK,EAAE,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,aAAa,EAAE,UAAU,CAAC,UAAU,CAAuB,CAAA;AAE7G;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CACrE,CAAA;AAEzB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,UAAU,CAC7E,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformConfigProvider.d.ts","sourceRoot":"","sources":["../../../src/internal/platformConfigProvider.ts"],"names":[],"mappings":""}
|
|
@@ -14,6 +14,7 @@ import * as HashSet from "effect/HashSet";
|
|
|
14
14
|
import * as Layer from "effect/Layer";
|
|
15
15
|
import { isPlatformError } from "./Error.js";
|
|
16
16
|
import * as FileSystem from "./FileSystem.js";
|
|
17
|
+
import * as internal from "./internal/platformConfigProvider.js";
|
|
17
18
|
import * as Path from "./Path.js";
|
|
18
19
|
/**
|
|
19
20
|
* @since 1.0.0
|
|
@@ -54,4 +55,26 @@ export const layerFileTreeAdd = options => fromFileTree(options).pipe(Effect.map
|
|
|
54
55
|
* @category layers
|
|
55
56
|
*/
|
|
56
57
|
export const layerFileTree = options => fromFileTree(options).pipe(Effect.map(Layer.setConfigProvider), Layer.unwrapEffect);
|
|
58
|
+
/**
|
|
59
|
+
* Create a dotenv ConfigProvider.
|
|
60
|
+
*
|
|
61
|
+
* @category constructors
|
|
62
|
+
* @since 1.0.0
|
|
63
|
+
*/
|
|
64
|
+
export const fromDotEnv = internal.fromDotEnv;
|
|
65
|
+
/**
|
|
66
|
+
* Add the dotenv ConfigProvider to the environment, as a fallback to the current ConfigProvider.
|
|
67
|
+
* If the file is not found, a debug log is produced and empty layer is returned.
|
|
68
|
+
*
|
|
69
|
+
* @since 1.0.0
|
|
70
|
+
* @category layers
|
|
71
|
+
*/
|
|
72
|
+
export const layerDotEnvAdd = internal.layerDotEnvAdd;
|
|
73
|
+
/**
|
|
74
|
+
* Add the dotenv ConfigProvider to the environment, replacing the current ConfigProvider.
|
|
75
|
+
*
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
* @category layers
|
|
78
|
+
*/
|
|
79
|
+
export const layerDotEnv = internal.layerDotEnv;
|
|
57
80
|
//# sourceMappingURL=PlatformConfigProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformConfigProvider.js","names":["Arr","Cause","ConfigError","ConfigProvider","PathPatch","Context","DefaultServices","Effect","Either","HashSet","Layer","isPlatformError","FileSystem","Path","fromFileTree","options","Do","pipe","bind","map","fs","path","rootDirectory","parseConfig","primitive","value","parse","trim","of","readConfig","filePath","flatMap","readFileString","resolveEnumerableDirs","segments","length","join","resolveFilePath","pathSegments","sourceError","error","SourceUnavailable","message","fail","pathNotFoundError","MissingData","handlePlatformError","_tag","reason","fromFlat","makeFlat","load","config","catchIf","enumerateChildren","forEach","dir","readDirectory","files","fromIterable","flat","patch","empty","layerFileTreeAdd","provider","fiberRefLocallyScopedWith","currentServices","services","current","get","add","orElse","unwrapEffect","layerFileTree","setConfigProvider"],"sources":["../../src/PlatformConfigProvider.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,GAAG,MAAM,cAAc;AACnC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAErC,OAAO,KAAKC,WAAW,MAAM,oBAAoB;AACjD,OAAO,KAAKC,cAAc,MAAM,uBAAuB;AACvD,OAAO,KAAKC,SAAS,MAAM,gCAAgC;AAC3D,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,eAAe,MAAM,wBAAwB;AACzD,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,SAASC,eAAe,QAA4B,YAAY;AAChE,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,IAAI,MAAM,WAAW;AAEjC;;;;AAIA,OAAO,MAAMC,YAAY,GAAIC,OAE5B,
|
|
1
|
+
{"version":3,"file":"PlatformConfigProvider.js","names":["Arr","Cause","ConfigError","ConfigProvider","PathPatch","Context","DefaultServices","Effect","Either","HashSet","Layer","isPlatformError","FileSystem","internal","Path","fromFileTree","options","Do","pipe","bind","map","fs","path","rootDirectory","parseConfig","primitive","value","parse","trim","of","readConfig","filePath","flatMap","readFileString","resolveEnumerableDirs","segments","length","join","resolveFilePath","pathSegments","sourceError","error","SourceUnavailable","message","fail","pathNotFoundError","MissingData","handlePlatformError","_tag","reason","fromFlat","makeFlat","load","config","catchIf","enumerateChildren","forEach","dir","readDirectory","files","fromIterable","flat","patch","empty","layerFileTreeAdd","provider","fiberRefLocallyScopedWith","currentServices","services","current","get","add","orElse","unwrapEffect","layerFileTree","setConfigProvider","fromDotEnv","layerDotEnvAdd","layerDotEnv"],"sources":["../../src/PlatformConfigProvider.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as FileSystem from "@effect/platform/FileSystem";
|
|
2
|
+
import * as ConfigProvider from "effect/ConfigProvider";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
|
+
import * as DefaultServices from "effect/DefaultServices";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as FiberRef from "effect/FiberRef";
|
|
7
|
+
import * as Layer from "effect/Layer";
|
|
8
|
+
/**
|
|
9
|
+
* dot env ConfigProvider
|
|
10
|
+
*
|
|
11
|
+
* Based on
|
|
12
|
+
* - https://github.com/motdotla/dotenv
|
|
13
|
+
* - https://github.com/motdotla/dotenv-expand
|
|
14
|
+
*/
|
|
15
|
+
/** @internal */
|
|
16
|
+
export const fromDotEnv = path => Effect.gen(function* (_) {
|
|
17
|
+
const fs = yield* FileSystem.FileSystem;
|
|
18
|
+
const content = yield* fs.readFileString(path);
|
|
19
|
+
const obj = parseDotEnv(content);
|
|
20
|
+
return ConfigProvider.fromJson(obj);
|
|
21
|
+
});
|
|
22
|
+
/** @internal */
|
|
23
|
+
export const layerDotEnv = path => fromDotEnv(path).pipe(Effect.map(Layer.setConfigProvider), Layer.unwrapEffect);
|
|
24
|
+
/** @internal */
|
|
25
|
+
export const layerDotEnvAdd = path => Effect.gen(function* (_) {
|
|
26
|
+
const dotEnvConfigProvider = yield* Effect.orElseSucceed(fromDotEnv(path), () => null);
|
|
27
|
+
if (dotEnvConfigProvider === null) {
|
|
28
|
+
yield* Effect.logDebug(`File '${path}' not found, skipping dotenv ConfigProvider.`);
|
|
29
|
+
return Layer.empty;
|
|
30
|
+
}
|
|
31
|
+
const currentConfigProvider = yield* FiberRef.get(DefaultServices.currentServices).pipe(Effect.map(services => Context.get(services, ConfigProvider.ConfigProvider)));
|
|
32
|
+
const configProvider = ConfigProvider.orElse(currentConfigProvider, () => dotEnvConfigProvider);
|
|
33
|
+
return Layer.setConfigProvider(configProvider);
|
|
34
|
+
}).pipe(Layer.unwrapEffect);
|
|
35
|
+
/** @internal */
|
|
36
|
+
const DOT_ENV_LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
|
|
37
|
+
/** @internal */
|
|
38
|
+
const parseDotEnv = lines => {
|
|
39
|
+
const obj = {};
|
|
40
|
+
// Convert line breaks to same format
|
|
41
|
+
lines = lines.replace(/\r\n?/gm, "\n");
|
|
42
|
+
let match;
|
|
43
|
+
while ((match = DOT_ENV_LINE.exec(lines)) != null) {
|
|
44
|
+
const key = match[1];
|
|
45
|
+
// Default undefined or null to empty string
|
|
46
|
+
let value = match[2] || "";
|
|
47
|
+
// Remove whitespace
|
|
48
|
+
value = value.trim();
|
|
49
|
+
// Check if double quoted
|
|
50
|
+
const maybeQuote = value[0];
|
|
51
|
+
// Remove surrounding quotes
|
|
52
|
+
value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2");
|
|
53
|
+
// Expand newlines if double quoted
|
|
54
|
+
if (maybeQuote === "\"") {
|
|
55
|
+
value = value.replace(/\\n/g, "\n");
|
|
56
|
+
value = value.replace(/\\r/g, "\r");
|
|
57
|
+
}
|
|
58
|
+
// Add to object
|
|
59
|
+
obj[key] = value;
|
|
60
|
+
}
|
|
61
|
+
return expand(obj);
|
|
62
|
+
};
|
|
63
|
+
/** @internal */
|
|
64
|
+
const expand = parsed => {
|
|
65
|
+
const newParsed = {};
|
|
66
|
+
for (const configKey in parsed) {
|
|
67
|
+
// resolve escape sequences
|
|
68
|
+
newParsed[configKey] = interpolate(parsed[configKey], parsed).replace(/\\\$/g, "$");
|
|
69
|
+
}
|
|
70
|
+
return newParsed;
|
|
71
|
+
};
|
|
72
|
+
/** @internal */
|
|
73
|
+
const interpolate = (envValue, parsed) => {
|
|
74
|
+
// find the last unescaped dollar sign in the
|
|
75
|
+
// value so that we can evaluate it
|
|
76
|
+
const lastUnescapedDollarSignIndex = searchLast(envValue, /(?!(?<=\\))\$/g);
|
|
77
|
+
// If we couldn't match any unescaped dollar sign
|
|
78
|
+
// let's return the string as is
|
|
79
|
+
if (lastUnescapedDollarSignIndex === -1) return envValue;
|
|
80
|
+
// This is the right-most group of variables in the string
|
|
81
|
+
const rightMostGroup = envValue.slice(lastUnescapedDollarSignIndex);
|
|
82
|
+
/**
|
|
83
|
+
* This finds the inner most variable/group divided
|
|
84
|
+
* by variable name and default value (if present)
|
|
85
|
+
* (
|
|
86
|
+
* (?!(?<=\\))\$ // only match dollar signs that are not escaped
|
|
87
|
+
* {? // optional opening curly brace
|
|
88
|
+
* ([\w]+) // match the variable name
|
|
89
|
+
* (?::-([^}\\]*))? // match an optional default value
|
|
90
|
+
* }? // optional closing curly brace
|
|
91
|
+
* )
|
|
92
|
+
*/
|
|
93
|
+
const matchGroup = /((?!(?<=\\))\${?([\w]+)(?::-([^}\\]*))?}?)/;
|
|
94
|
+
const match = rightMostGroup.match(matchGroup);
|
|
95
|
+
if (match !== null) {
|
|
96
|
+
const [_, group, variableName, defaultValue] = match;
|
|
97
|
+
return interpolate(envValue.replace(group, defaultValue || parsed[variableName] || ""), parsed);
|
|
98
|
+
}
|
|
99
|
+
return envValue;
|
|
100
|
+
};
|
|
101
|
+
/** @internal */
|
|
102
|
+
const searchLast = (str, rgx) => {
|
|
103
|
+
const matches = Array.from(str.matchAll(rgx));
|
|
104
|
+
return matches.length > 0 ? matches.slice(-1)[0].index : -1;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=platformConfigProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platformConfigProvider.js","names":["FileSystem","ConfigProvider","Context","DefaultServices","Effect","FiberRef","Layer","fromDotEnv","path","gen","_","fs","content","readFileString","obj","parseDotEnv","fromJson","layerDotEnv","pipe","map","setConfigProvider","unwrapEffect","layerDotEnvAdd","dotEnvConfigProvider","orElseSucceed","logDebug","empty","currentConfigProvider","get","currentServices","services","configProvider","orElse","DOT_ENV_LINE","lines","replace","match","exec","key","value","trim","maybeQuote","expand","parsed","newParsed","configKey","interpolate","envValue","lastUnescapedDollarSignIndex","searchLast","rightMostGroup","slice","matchGroup","group","variableName","defaultValue","str","rgx","matches","Array","from","matchAll","length","index"],"sources":["../../../src/internal/platformConfigProvider.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -15,6 +15,7 @@ import * as HashSet from "effect/HashSet"
|
|
|
15
15
|
import * as Layer from "effect/Layer"
|
|
16
16
|
import { isPlatformError, type PlatformError } from "./Error.js"
|
|
17
17
|
import * as FileSystem from "./FileSystem.js"
|
|
18
|
+
import * as internal from "./internal/platformConfigProvider.js"
|
|
18
19
|
import * as Path from "./Path.js"
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -111,3 +112,32 @@ export const layerFileTree = (options?: {
|
|
|
111
112
|
Effect.map(Layer.setConfigProvider),
|
|
112
113
|
Layer.unwrapEffect
|
|
113
114
|
)
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Create a dotenv ConfigProvider.
|
|
118
|
+
*
|
|
119
|
+
* @category constructors
|
|
120
|
+
* @since 1.0.0
|
|
121
|
+
*/
|
|
122
|
+
export const fromDotEnv: (
|
|
123
|
+
paths: string
|
|
124
|
+
) => Effect.Effect<ConfigProvider.ConfigProvider, PlatformError, FileSystem.FileSystem> = internal.fromDotEnv
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Add the dotenv ConfigProvider to the environment, as a fallback to the current ConfigProvider.
|
|
128
|
+
* If the file is not found, a debug log is produced and empty layer is returned.
|
|
129
|
+
*
|
|
130
|
+
* @since 1.0.0
|
|
131
|
+
* @category layers
|
|
132
|
+
*/
|
|
133
|
+
export const layerDotEnvAdd: (path: string) => Layer.Layer<never, never, FileSystem.FileSystem> =
|
|
134
|
+
internal.layerDotEnvAdd
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Add the dotenv ConfigProvider to the environment, replacing the current ConfigProvider.
|
|
138
|
+
*
|
|
139
|
+
* @since 1.0.0
|
|
140
|
+
* @category layers
|
|
141
|
+
*/
|
|
142
|
+
export const layerDotEnv: (path: string) => Layer.Layer<never, PlatformError, FileSystem.FileSystem> =
|
|
143
|
+
internal.layerDotEnv
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { PlatformError } from "@effect/platform/Error"
|
|
2
|
+
import * as FileSystem from "@effect/platform/FileSystem"
|
|
3
|
+
import * as ConfigProvider from "effect/ConfigProvider"
|
|
4
|
+
import * as Context from "effect/Context"
|
|
5
|
+
import * as DefaultServices from "effect/DefaultServices"
|
|
6
|
+
import * as Effect from "effect/Effect"
|
|
7
|
+
import * as FiberRef from "effect/FiberRef"
|
|
8
|
+
import * as Layer from "effect/Layer"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* dot env ConfigProvider
|
|
12
|
+
*
|
|
13
|
+
* Based on
|
|
14
|
+
* - https://github.com/motdotla/dotenv
|
|
15
|
+
* - https://github.com/motdotla/dotenv-expand
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** @internal */
|
|
19
|
+
export const fromDotEnv = (
|
|
20
|
+
path: string
|
|
21
|
+
): Effect.Effect<ConfigProvider.ConfigProvider, PlatformError, FileSystem.FileSystem> =>
|
|
22
|
+
Effect.gen(function*(_) {
|
|
23
|
+
const fs = yield* FileSystem.FileSystem
|
|
24
|
+
const content = yield* fs.readFileString(path)
|
|
25
|
+
const obj = parseDotEnv(content)
|
|
26
|
+
return ConfigProvider.fromJson(obj)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
/** @internal */
|
|
30
|
+
export const layerDotEnv = (path: string): Layer.Layer<never, PlatformError, FileSystem.FileSystem> =>
|
|
31
|
+
fromDotEnv(path).pipe(
|
|
32
|
+
Effect.map(Layer.setConfigProvider),
|
|
33
|
+
Layer.unwrapEffect
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
/** @internal */
|
|
37
|
+
export const layerDotEnvAdd = (path: string): Layer.Layer<never, never, FileSystem.FileSystem> =>
|
|
38
|
+
Effect.gen(function*(_) {
|
|
39
|
+
const dotEnvConfigProvider = yield* Effect.orElseSucceed(fromDotEnv(path), () => null)
|
|
40
|
+
|
|
41
|
+
if (dotEnvConfigProvider === null) {
|
|
42
|
+
yield* Effect.logDebug(`File '${path}' not found, skipping dotenv ConfigProvider.`)
|
|
43
|
+
return Layer.empty
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const currentConfigProvider = yield* FiberRef.get(DefaultServices.currentServices).pipe(
|
|
47
|
+
Effect.map((services) => Context.get(services, ConfigProvider.ConfigProvider))
|
|
48
|
+
)
|
|
49
|
+
const configProvider = ConfigProvider.orElse(currentConfigProvider, () => dotEnvConfigProvider)
|
|
50
|
+
return Layer.setConfigProvider(configProvider)
|
|
51
|
+
}).pipe(Layer.unwrapEffect)
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
const DOT_ENV_LINE =
|
|
55
|
+
/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg
|
|
56
|
+
|
|
57
|
+
/** @internal */
|
|
58
|
+
const parseDotEnv = (lines: string): Record<string, string> => {
|
|
59
|
+
const obj: Record<string, string> = {}
|
|
60
|
+
|
|
61
|
+
// Convert line breaks to same format
|
|
62
|
+
lines = lines.replace(/\r\n?/gm, "\n")
|
|
63
|
+
|
|
64
|
+
let match: RegExpExecArray | null
|
|
65
|
+
while ((match = DOT_ENV_LINE.exec(lines)) != null) {
|
|
66
|
+
const key = match[1]
|
|
67
|
+
|
|
68
|
+
// Default undefined or null to empty string
|
|
69
|
+
let value = match[2] || ""
|
|
70
|
+
|
|
71
|
+
// Remove whitespace
|
|
72
|
+
value = value.trim()
|
|
73
|
+
|
|
74
|
+
// Check if double quoted
|
|
75
|
+
const maybeQuote = value[0]
|
|
76
|
+
|
|
77
|
+
// Remove surrounding quotes
|
|
78
|
+
value = value.replace(/^(['"`])([\s\S]*)\1$/gm, "$2")
|
|
79
|
+
|
|
80
|
+
// Expand newlines if double quoted
|
|
81
|
+
if (maybeQuote === "\"") {
|
|
82
|
+
value = value.replace(/\\n/g, "\n")
|
|
83
|
+
value = value.replace(/\\r/g, "\r")
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Add to object
|
|
87
|
+
obj[key] = value
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return expand(obj)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** @internal */
|
|
94
|
+
const expand = (parsed: Record<string, string>) => {
|
|
95
|
+
const newParsed: Record<string, string> = {}
|
|
96
|
+
|
|
97
|
+
for (const configKey in parsed) {
|
|
98
|
+
// resolve escape sequences
|
|
99
|
+
newParsed[configKey] = interpolate(parsed[configKey], parsed).replace(/\\\$/g, "$")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return newParsed
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** @internal */
|
|
106
|
+
const interpolate = (envValue: string, parsed: Record<string, string>) => {
|
|
107
|
+
// find the last unescaped dollar sign in the
|
|
108
|
+
// value so that we can evaluate it
|
|
109
|
+
const lastUnescapedDollarSignIndex = searchLast(envValue, /(?!(?<=\\))\$/g)
|
|
110
|
+
|
|
111
|
+
// If we couldn't match any unescaped dollar sign
|
|
112
|
+
// let's return the string as is
|
|
113
|
+
if (lastUnescapedDollarSignIndex === -1) return envValue
|
|
114
|
+
|
|
115
|
+
// This is the right-most group of variables in the string
|
|
116
|
+
const rightMostGroup = envValue.slice(lastUnescapedDollarSignIndex)
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* This finds the inner most variable/group divided
|
|
120
|
+
* by variable name and default value (if present)
|
|
121
|
+
* (
|
|
122
|
+
* (?!(?<=\\))\$ // only match dollar signs that are not escaped
|
|
123
|
+
* {? // optional opening curly brace
|
|
124
|
+
* ([\w]+) // match the variable name
|
|
125
|
+
* (?::-([^}\\]*))? // match an optional default value
|
|
126
|
+
* }? // optional closing curly brace
|
|
127
|
+
* )
|
|
128
|
+
*/
|
|
129
|
+
const matchGroup = /((?!(?<=\\))\${?([\w]+)(?::-([^}\\]*))?}?)/
|
|
130
|
+
const match = rightMostGroup.match(matchGroup)
|
|
131
|
+
|
|
132
|
+
if (match !== null) {
|
|
133
|
+
const [_, group, variableName, defaultValue] = match
|
|
134
|
+
|
|
135
|
+
return interpolate(
|
|
136
|
+
envValue.replace(group, defaultValue || parsed[variableName] || ""),
|
|
137
|
+
parsed
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return envValue
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** @internal */
|
|
145
|
+
const searchLast = (str: string, rgx: RegExp) => {
|
|
146
|
+
const matches = Array.from(str.matchAll(rgx))
|
|
147
|
+
return matches.length > 0 ? matches.slice(-1)[0].index : -1
|
|
148
|
+
}
|