@esri/hub-common 9.22.0 → 9.23.2
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/es2017/content/_fetch.js.map +1 -1
- package/dist/es2017/content/compose.js +53 -18
- package/dist/es2017/content/compose.js.map +1 -1
- package/dist/es2017/content/fetch.js +43 -12
- package/dist/es2017/content/fetch.js.map +1 -1
- package/dist/esm/content/_fetch.js.map +1 -1
- package/dist/esm/content/compose.js +56 -19
- package/dist/esm/content/compose.js.map +1 -1
- package/dist/esm/content/fetch.js +85 -11
- package/dist/esm/content/fetch.js.map +1 -1
- package/dist/node/content/_fetch.js.map +1 -1
- package/dist/node/content/compose.js +54 -19
- package/dist/node/content/compose.js.map +1 -1
- package/dist/node/content/fetch.js +43 -12
- package/dist/node/content/fetch.js.map +1 -1
- package/dist/types/content/_fetch.d.ts +1 -2
- package/dist/types/content/_internal.d.ts +3 -0
- package/dist/types/content/compose.d.ts +20 -0
- package/dist/types/content/fetch.d.ts +2 -1
- package/dist/types/core/types/IHubContent.d.ts +4 -0
- package/dist/umd/common.umd.js +206 -30
- package/dist/umd/common.umd.js.map +1 -1
- package/dist/umd/common.umd.min.js +1 -1
- package/dist/umd/common.umd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/umd/common.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* @preserve
|
|
2
|
-
* @esri/hub-common - v9.
|
|
2
|
+
* @esri/hub-common - v9.23.1 - Fri Mar 18 2022 14:46:12 GMT+0000 (Coordinated Universal Time)
|
|
3
3
|
* Copyright (c) 2022 Environmental Systems Research Institute, Inc.
|
|
4
4
|
* Apache-2.0
|
|
5
5
|
*/
|
|
@@ -6067,6 +6067,70 @@
|
|
|
6067
6067
|
})));
|
|
6068
6068
|
}
|
|
6069
6069
|
|
|
6070
|
+
/* Copyright (c) 2017-2018 Environmental Systems Research Institute, Inc.
|
|
6071
|
+
* Apache-2.0 */
|
|
6072
|
+
/**
|
|
6073
|
+
* ```js
|
|
6074
|
+
* import { queryFeatures } from '@esri/arcgis-rest-feature-layer';
|
|
6075
|
+
* //
|
|
6076
|
+
* queryFeatures({
|
|
6077
|
+
* url: "http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3",
|
|
6078
|
+
* where: "STATE_NAME = 'Alaska'"
|
|
6079
|
+
* })
|
|
6080
|
+
* .then(result)
|
|
6081
|
+
* ```
|
|
6082
|
+
* Query a feature service. See [REST Documentation](https://developers.arcgis.com/rest/services-reference/query-feature-service-layer-.htm) for more information.
|
|
6083
|
+
*
|
|
6084
|
+
* @param requestOptions - Options for the request
|
|
6085
|
+
* @returns A Promise that will resolve with the query response.
|
|
6086
|
+
*/
|
|
6087
|
+
function queryFeatures(requestOptions) {
|
|
6088
|
+
var queryOptions = appendCustomParams(requestOptions, [
|
|
6089
|
+
"where",
|
|
6090
|
+
"objectIds",
|
|
6091
|
+
"relationParam",
|
|
6092
|
+
"time",
|
|
6093
|
+
"distance",
|
|
6094
|
+
"units",
|
|
6095
|
+
"outFields",
|
|
6096
|
+
"geometry",
|
|
6097
|
+
"geometryType",
|
|
6098
|
+
"spatialRel",
|
|
6099
|
+
"returnGeometry",
|
|
6100
|
+
"maxAllowableOffset",
|
|
6101
|
+
"geometryPrecision",
|
|
6102
|
+
"inSR",
|
|
6103
|
+
"outSR",
|
|
6104
|
+
"gdbVersion",
|
|
6105
|
+
"returnDistinctValues",
|
|
6106
|
+
"returnIdsOnly",
|
|
6107
|
+
"returnCountOnly",
|
|
6108
|
+
"returnExtentOnly",
|
|
6109
|
+
"orderByFields",
|
|
6110
|
+
"groupByFieldsForStatistics",
|
|
6111
|
+
"outStatistics",
|
|
6112
|
+
"returnZ",
|
|
6113
|
+
"returnM",
|
|
6114
|
+
"multipatchOption",
|
|
6115
|
+
"resultOffset",
|
|
6116
|
+
"resultRecordCount",
|
|
6117
|
+
"quantizationParameters",
|
|
6118
|
+
"returnCentroid",
|
|
6119
|
+
"resultType",
|
|
6120
|
+
"historicMoment",
|
|
6121
|
+
"returnTrueCurves",
|
|
6122
|
+
"sqlFormat",
|
|
6123
|
+
"returnExceededLimitFeatures",
|
|
6124
|
+
"f"
|
|
6125
|
+
], {
|
|
6126
|
+
httpMethod: "GET",
|
|
6127
|
+
params: __assign({
|
|
6128
|
+
// set default query parameters
|
|
6129
|
+
where: "1=1", outFields: "*" }, requestOptions.params)
|
|
6130
|
+
});
|
|
6131
|
+
return request(cleanUrl(requestOptions.url) + "/query", queryOptions);
|
|
6132
|
+
}
|
|
6133
|
+
|
|
6070
6134
|
/* Copyright (c) 2017-2019 Environmental Systems Research Institute, Inc.
|
|
6071
6135
|
* Apache-2.0 */
|
|
6072
6136
|
var serviceRegex = new RegExp(/.+(?:map|feature|image)server/i);
|
|
@@ -6953,8 +7017,8 @@
|
|
|
6953
7017
|
|
|
6954
7018
|
// helper fns - move this to _internal if needed elsewhere
|
|
6955
7019
|
var getOnlyQueryLayer = function (layers) {
|
|
6956
|
-
var layer = layers && layers.length === 1
|
|
6957
|
-
return layer && layer.capabilities.includes("Query")
|
|
7020
|
+
var layer = layers && layers.length === 1 ? layers[0] : undefined;
|
|
7021
|
+
return layer && layer.capabilities.includes("Query") ? layer : undefined;
|
|
6958
7022
|
};
|
|
6959
7023
|
var shouldUseLayerInfo = function (layer, layers, url) {
|
|
6960
7024
|
return (layer &&
|
|
@@ -6963,6 +7027,13 @@
|
|
|
6963
7027
|
// we use item info instead of layer info for single layer items
|
|
6964
7028
|
!getLayerIdFromUrl(url));
|
|
6965
7029
|
};
|
|
7030
|
+
// this logic adapted from hub-indexer's determineName(), see
|
|
7031
|
+
// https://github.com/ArcGIS/hub-indexer/blob/8f4dd6f928124c1f35dd02bc11bd996191ee1160/packages/duke/compose/common.js#L7-L34
|
|
7032
|
+
var getContentName = function (item, layer, layers) {
|
|
7033
|
+
return ((shouldUseLayerInfo(layer, layers, item.url)
|
|
7034
|
+
? layer.name
|
|
7035
|
+
: item.title || item.name) || "").replace(/_/g, " ");
|
|
7036
|
+
};
|
|
6966
7037
|
/**
|
|
6967
7038
|
* The possible values for updateFrequency
|
|
6968
7039
|
*
|
|
@@ -7315,6 +7386,38 @@
|
|
|
7315
7386
|
var flattened = parsed.reduce(function (acc, arr, _) { return __spreadArrays(acc, arr); }, []);
|
|
7316
7387
|
return flattened.filter(function (cat) { return !includes(exclude, cat.toLowerCase()); });
|
|
7317
7388
|
}
|
|
7389
|
+
/**
|
|
7390
|
+
* get the layer object for
|
|
7391
|
+
* - an item that refers to a specific layer of a service
|
|
7392
|
+
* - a multi-layer services (if a layer id was passed in)
|
|
7393
|
+
* - a single layer feature service
|
|
7394
|
+
* @param item
|
|
7395
|
+
* @param layers the layers and tables returned from the service
|
|
7396
|
+
* @param layerId a specific id
|
|
7397
|
+
* @returns layer definition
|
|
7398
|
+
* @private
|
|
7399
|
+
*/
|
|
7400
|
+
var getItemLayer = function (item, layers, layerId) {
|
|
7401
|
+
// if item refers to a layer we always want to use that layer id
|
|
7402
|
+
// otherwise use the layer id that was passed in (if any)
|
|
7403
|
+
var _layerIdFromUrl = getLayerIdFromUrl(item.url);
|
|
7404
|
+
var _layerId = _layerIdFromUrl ? parseInt(_layerIdFromUrl, 10) : layerId;
|
|
7405
|
+
return (layers &&
|
|
7406
|
+
(!isNil(_layerId)
|
|
7407
|
+
? // find the explicitly set layer id
|
|
7408
|
+
layers.find(function (_layer) { return _layer.id === _layerId; })
|
|
7409
|
+
: // for feature servers with a single layer always show the layer
|
|
7410
|
+
isFeatureService(item.type) && getOnlyQueryLayer(layers)));
|
|
7411
|
+
};
|
|
7412
|
+
/**
|
|
7413
|
+
* determine if a layer is a layer view
|
|
7414
|
+
* @param layer
|
|
7415
|
+
* @returns
|
|
7416
|
+
* @private
|
|
7417
|
+
*/
|
|
7418
|
+
var isLayerView = function (layer) {
|
|
7419
|
+
return layer.isView;
|
|
7420
|
+
};
|
|
7318
7421
|
/**
|
|
7319
7422
|
* Compose a new content object out of an item, enrichments, and context
|
|
7320
7423
|
* @param item
|
|
@@ -7325,18 +7428,7 @@
|
|
|
7325
7428
|
// extract enrichments and context out of the options
|
|
7326
7429
|
var _a = options || {}, slug = _a.slug, requestOptions = _a.requestOptions, data = _a.data, metadata = _a.metadata, groupIds = _a.groupIds, ownerUser = _a.ownerUser, org = _a.org, errors = _a.errors, server = _a.server, layers = _a.layers, recordCount = _a.recordCount, boundary = _a.boundary, extent = _a.extent, searchDescription = _a.searchDescription, statistics = _a.statistics;
|
|
7327
7430
|
// set common variables that we will use in the derived properties below
|
|
7328
|
-
|
|
7329
|
-
// otherwise use the layer id that was passed in (if any)
|
|
7330
|
-
var _layerIdFromUrl = getLayerIdFromUrl(item.url);
|
|
7331
|
-
var layerId = _layerIdFromUrl
|
|
7332
|
-
? parseInt(_layerIdFromUrl, 10)
|
|
7333
|
-
: options === null || options === void 0 ? void 0 : options.layerId;
|
|
7334
|
-
var layer = layers &&
|
|
7335
|
-
(!isNil(layerId)
|
|
7336
|
-
? // find the explicitly set layer id
|
|
7337
|
-
layers.find(function (_layer) { return _layer.id === layerId; })
|
|
7338
|
-
: // for feature servers with a single layer always show the layer
|
|
7339
|
-
isFeatureService(item.type) && getOnlyQueryLayer(layers));
|
|
7431
|
+
var layer = getItemLayer(item, layers, options === null || options === void 0 ? void 0 : options.layerId);
|
|
7340
7432
|
// NOTE: we only set hubId for public items in online
|
|
7341
7433
|
var hubId = canUseHubApiForItem(item, requestOptions)
|
|
7342
7434
|
? layer
|
|
@@ -7345,9 +7437,8 @@
|
|
|
7345
7437
|
: undefined;
|
|
7346
7438
|
var identifier = slug || hubId || item.id;
|
|
7347
7439
|
// whether or not we should show layer info for name, description, etc
|
|
7348
|
-
var
|
|
7349
|
-
var
|
|
7350
|
-
var _layerDescription = _shouldUseLayerInfo && layer.description;
|
|
7440
|
+
var name = getContentName(item, layer, layers);
|
|
7441
|
+
var _layerDescription = shouldUseLayerInfo(layer, layers, item.url) && layer.description;
|
|
7351
7442
|
// so much depends on type
|
|
7352
7443
|
var type = layer
|
|
7353
7444
|
? // use layer type (Feature Layer, Table, etc) for layer content
|
|
@@ -7402,7 +7493,7 @@
|
|
|
7402
7493
|
}, get url() {
|
|
7403
7494
|
return _proxyUrl
|
|
7404
7495
|
? _proxyUrl
|
|
7405
|
-
:
|
|
7496
|
+
: layer
|
|
7406
7497
|
? parseServiceUrl(item.url) + "/" + layer.id
|
|
7407
7498
|
: item.url;
|
|
7408
7499
|
}, get categories() {
|
|
@@ -7518,7 +7609,17 @@
|
|
|
7518
7609
|
return (getItemSpatialReference(item) ||
|
|
7519
7610
|
getServerSpatialReference(server, layer) ||
|
|
7520
7611
|
null);
|
|
7521
|
-
}, get
|
|
7612
|
+
}, get viewDefinition() {
|
|
7613
|
+
// if this is a layer view and we have the item data
|
|
7614
|
+
// find the definition that corresponds to the current layer
|
|
7615
|
+
var dataLayer = layer &&
|
|
7616
|
+
isLayerView(layer) &&
|
|
7617
|
+
data &&
|
|
7618
|
+
Array.isArray(data.layers) &&
|
|
7619
|
+
data.layers.find(function (_layer) { return _layer.id === layer.id; });
|
|
7620
|
+
return dataLayer ? dataLayer.layerDefinition : undefined;
|
|
7621
|
+
},
|
|
7622
|
+
get orgId() {
|
|
7522
7623
|
// NOTE: it's undocumented, but the portal API will return orgId for items... sometimes
|
|
7523
7624
|
return org ? org.id : item.orgId || (ownerUser === null || ownerUser === void 0 ? void 0 : ownerUser.orgId);
|
|
7524
7625
|
},
|
|
@@ -8862,6 +8963,34 @@
|
|
|
8862
8963
|
});
|
|
8863
8964
|
}); };
|
|
8864
8965
|
|
|
8966
|
+
var maybeFetchLayerEnrichments = function (itemAndEnrichments, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
8967
|
+
var item, data, layers, layer, layerEnrichments, _a;
|
|
8968
|
+
return __generator(this, function (_b) {
|
|
8969
|
+
switch (_b.label) {
|
|
8970
|
+
case 0:
|
|
8971
|
+
item = itemAndEnrichments.item, data = itemAndEnrichments.data, layers = itemAndEnrichments.layers;
|
|
8972
|
+
layer = layers && getItemLayer(item, layers, options && options.layerId);
|
|
8973
|
+
if (!(layer && isLayerView(layer) && !data)) return [3 /*break*/, 2];
|
|
8974
|
+
// to store (at least part of) it's view definition in item data
|
|
8975
|
+
// it seems that most do not, but until we have a reliable signal
|
|
8976
|
+
// we just fetch the item data for all layer views
|
|
8977
|
+
return [4 /*yield*/, fetchItemEnrichments(item, ["data"], options)];
|
|
8978
|
+
case 1:
|
|
8979
|
+
// to store (at least part of) it's view definition in item data
|
|
8980
|
+
// it seems that most do not, but until we have a reliable signal
|
|
8981
|
+
// we just fetch the item data for all layer views
|
|
8982
|
+
_a = _b.sent();
|
|
8983
|
+
return [3 /*break*/, 3];
|
|
8984
|
+
case 2:
|
|
8985
|
+
_a = undefined;
|
|
8986
|
+
_b.label = 3;
|
|
8987
|
+
case 3:
|
|
8988
|
+
layerEnrichments = _a;
|
|
8989
|
+
// TODO: merge errors
|
|
8990
|
+
return [2 /*return*/, __assign(__assign({}, itemAndEnrichments), layerEnrichments)];
|
|
8991
|
+
}
|
|
8992
|
+
});
|
|
8993
|
+
}); };
|
|
8865
8994
|
var fetchItemAndEnrichments = function (itemId, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
8866
8995
|
var item, enrichmentsToFetch, enrichments;
|
|
8867
8996
|
return __generator(this, function (_a) {
|
|
@@ -8873,7 +9002,7 @@
|
|
|
8873
9002
|
return [4 /*yield*/, fetchItemEnrichments(item, enrichmentsToFetch, options)];
|
|
8874
9003
|
case 2:
|
|
8875
9004
|
enrichments = _a.sent();
|
|
8876
|
-
return [2 /*return*/, __assign(__assign({}, enrichments), { item: item })];
|
|
9005
|
+
return [2 /*return*/, maybeFetchLayerEnrichments(__assign(__assign({}, enrichments), { item: item }), options)];
|
|
8877
9006
|
}
|
|
8878
9007
|
});
|
|
8879
9008
|
}); };
|
|
@@ -8886,7 +9015,7 @@
|
|
|
8886
9015
|
return [4 /*yield*/, fetchItemAndEnrichments(itemId, options)];
|
|
8887
9016
|
case 1:
|
|
8888
9017
|
_a = _d.sent(), item = _a.item, itemEnrichments = __rest(_a, ["item"]);
|
|
8889
|
-
specifiedLayerId = options &&
|
|
9018
|
+
specifiedLayerId = options && options.layerId;
|
|
8890
9019
|
if (!canUseHubApiForItem(item, options)) return [3 /*break*/, 3];
|
|
8891
9020
|
return [4 /*yield*/, fetchHubEnrichmentsById(hubId, options)];
|
|
8892
9021
|
case 2:
|
|
@@ -8898,7 +9027,7 @@
|
|
|
8898
9027
|
case 4:
|
|
8899
9028
|
_b = _c, slug = _b.slug, layerId = _b.layerId, boundary = _b.boundary, extent = _b.extent, searchDescription = _b.searchDescription, statistics = _b.statistics;
|
|
8900
9029
|
// return a new content object composed from the item and enrichments we fetched
|
|
8901
|
-
return [2 /*return*/, composeContent(item, __assign(__assign({ requestOptions: options }, itemEnrichments), { slug: slug, layerId: specifiedLayerId
|
|
9030
|
+
return [2 /*return*/, composeContent(item, __assign(__assign({ requestOptions: options }, itemEnrichments), { slug: slug, layerId: isNil(specifiedLayerId) ? layerId : specifiedLayerId, boundary: boundary,
|
|
8902
9031
|
extent: extent,
|
|
8903
9032
|
searchDescription: searchDescription,
|
|
8904
9033
|
statistics: statistics }))];
|
|
@@ -8917,8 +9046,8 @@
|
|
|
8917
9046
|
return [4 /*yield*/, fetchItemAndEnrichments(itemId, options)];
|
|
8918
9047
|
case 2:
|
|
8919
9048
|
_a = _b.sent(), item = _a.item, itemEnrichments = __rest(_a, ["item"]);
|
|
8920
|
-
specifiedLayerId = options &&
|
|
8921
|
-
if (!(specifiedLayerId && specifiedLayerId !== layerId)) return [3 /*break*/, 4];
|
|
9049
|
+
specifiedLayerId = options && options.layerId;
|
|
9050
|
+
if (!(!isNil(specifiedLayerId) && specifiedLayerId !== layerId)) return [3 /*break*/, 4];
|
|
8922
9051
|
// we fetched Hub enrichments by slug for another dataset,
|
|
8923
9052
|
// most likely for the parent service of this layer,
|
|
8924
9053
|
// we need to fetch them for the specified layer instead
|
|
@@ -8939,6 +9068,24 @@
|
|
|
8939
9068
|
}
|
|
8940
9069
|
});
|
|
8941
9070
|
}); };
|
|
9071
|
+
var fetchContentRecordCount = function (content) { return __awaiter(void 0, void 0, void 0, function () {
|
|
9072
|
+
var url, viewDefinition, where, response;
|
|
9073
|
+
return __generator(this, function (_a) {
|
|
9074
|
+
switch (_a.label) {
|
|
9075
|
+
case 0:
|
|
9076
|
+
url = content.url, viewDefinition = content.viewDefinition;
|
|
9077
|
+
where = viewDefinition === null || viewDefinition === void 0 ? void 0 : viewDefinition.definitionExpression;
|
|
9078
|
+
return [4 /*yield*/, queryFeatures({
|
|
9079
|
+
url: url,
|
|
9080
|
+
where: where,
|
|
9081
|
+
returnCountOnly: true,
|
|
9082
|
+
})];
|
|
9083
|
+
case 1:
|
|
9084
|
+
response = _a.sent();
|
|
9085
|
+
return [2 /*return*/, response.count];
|
|
9086
|
+
}
|
|
9087
|
+
});
|
|
9088
|
+
}); };
|
|
8942
9089
|
/**
|
|
8943
9090
|
* Fetch enriched content from the Portal and Hub APIs.
|
|
8944
9091
|
* @param identifier content slug or id
|
|
@@ -8951,11 +9098,38 @@
|
|
|
8951
9098
|
* const content = await fetchContent('my-org::item-name')
|
|
8952
9099
|
* ```
|
|
8953
9100
|
*/
|
|
8954
|
-
var fetchContent = function (identifier, options) {
|
|
8955
|
-
|
|
8956
|
-
|
|
8957
|
-
|
|
8958
|
-
|
|
9101
|
+
var fetchContent = function (identifier, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
9102
|
+
var content, _a, isProxied, layer, _b, _c;
|
|
9103
|
+
return __generator(this, function (_d) {
|
|
9104
|
+
switch (_d.label) {
|
|
9105
|
+
case 0:
|
|
9106
|
+
if (!isSlug(identifier)) return [3 /*break*/, 2];
|
|
9107
|
+
return [4 /*yield*/, fetchContentBySlug(addContextToSlug(identifier, options === null || options === void 0 ? void 0 : options.siteOrgKey), options)];
|
|
9108
|
+
case 1:
|
|
9109
|
+
_a = _d.sent();
|
|
9110
|
+
return [3 /*break*/, 4];
|
|
9111
|
+
case 2: return [4 /*yield*/, fetchContentById(identifier, options)];
|
|
9112
|
+
case 3:
|
|
9113
|
+
_a = _d.sent();
|
|
9114
|
+
_d.label = 4;
|
|
9115
|
+
case 4:
|
|
9116
|
+
content = _a;
|
|
9117
|
+
isProxied = content.isProxied, layer = content.layer;
|
|
9118
|
+
_b = content;
|
|
9119
|
+
if (!(isProxied || !!layer)) return [3 /*break*/, 6];
|
|
9120
|
+
return [4 /*yield*/, fetchContentRecordCount(content)];
|
|
9121
|
+
case 5:
|
|
9122
|
+
_c = _d.sent();
|
|
9123
|
+
return [3 /*break*/, 7];
|
|
9124
|
+
case 6:
|
|
9125
|
+
_c = undefined;
|
|
9126
|
+
_d.label = 7;
|
|
9127
|
+
case 7:
|
|
9128
|
+
_b.recordCount = _c;
|
|
9129
|
+
return [2 /*return*/, content];
|
|
9130
|
+
}
|
|
9131
|
+
});
|
|
9132
|
+
}); };
|
|
8959
9133
|
|
|
8960
9134
|
// TODO: remove this at next breaking version
|
|
8961
9135
|
/**
|
|
@@ -14481,6 +14655,7 @@
|
|
|
14481
14655
|
exports.getItemHomeUrl = getItemHomeUrl;
|
|
14482
14656
|
exports.getItemHubId = getItemHubId;
|
|
14483
14657
|
exports.getItemHubType = getItemHubType;
|
|
14658
|
+
exports.getItemLayer = getItemLayer;
|
|
14484
14659
|
exports.getItemLayerId = getItemLayerId;
|
|
14485
14660
|
exports.getItemThumbnailUrl = getItemThumbnailUrl;
|
|
14486
14661
|
exports.getLayerIdFromUrl = getLayerIdFromUrl;
|
|
@@ -14529,6 +14704,7 @@
|
|
|
14529
14704
|
exports.isFeatureService = isFeatureService;
|
|
14530
14705
|
exports.isFieldworkerView = isFieldworkerView;
|
|
14531
14706
|
exports.isGuid = isGuid;
|
|
14707
|
+
exports.isLayerView = isLayerView;
|
|
14532
14708
|
exports.isMapOrFeatureServerUrl = isMapOrFeatureServerUrl;
|
|
14533
14709
|
exports.isNil = isNil;
|
|
14534
14710
|
exports.isSlug = isSlug;
|