resolve conflicts

feature/appm-store/pbac
Gathika94 6 years ago
parent c8b983fb93
commit 329499a962

@ -47,7 +47,9 @@ public class RegistrationProfile {
this.applicationName = apiApplicationName;
}
public String[] getTags() { return tags; }
public String[] getTags() {
return tags;
}
public void setTags(String[] tags) {
this.tags = tags;

@ -21,8 +21,7 @@ package org.wso2.carbon.device.application.mgt.common;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "ApplicationRelease", description = "This class holds the details when releasing an Application to " +
"application store")
@ApiModel(value = "ApplicationRelease", description = "This class holds the details when releasing an Application to application store")
public class ApplicationRelease {
@ApiModelProperty(name = "id",

@ -74,7 +74,8 @@ public class Configuration {
return lifecycleStates;
}
public void setLifecycleStates(List<LifecycleState> lifecycleStates) {
public void setLifecycleStates(
List<LifecycleState> lifecycleStates) {
this.lifecycleStates = lifecycleStates;
}
@ -86,6 +87,5 @@ public class Configuration {
public void setUiConfiguration(UIConfiguration uiConfiguration) {
this.uiConfiguration = uiConfiguration;
}
}

@ -88,7 +88,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
private void initDataAccessObjects() {
this.visibilityDAO = ApplicationManagementDAOFactory.getVisibilityDAO();
this.applicationDAO = ApplicationManagementDAOFactory.getApplicationDAO();
this.lifecycleStateDAO = ApplicationManagementDAOFactory.getLifecycleStateDAO();
this.lifecycleStateDAO = ApplicationManagementDAOFactory.getLifecycleStateDAO();
this.applicationReleaseDAO = ApplicationManagementDAOFactory.getApplicationReleaseDAO();
}
@ -96,8 +96,10 @@ public class ApplicationManagerImpl implements ApplicationManager {
* The responsbility of this method is the creating an application.
* @param application Application that need to be created.
* @return {@link Application}
* @throws RequestValidatingException if application creating request is invalid, returns {@link RequestValidatingException}
* @throws ApplicationManagementException Catch all other throwing exceptions and returns {@link ApplicationManagementException}
* @throws RequestValidatingException if application creating request is invalid, returns
* {@link RequestValidatingException}
* @throws ApplicationManagementException Catch all other throwing exceptions and returns
* {@link ApplicationManagementException}
*/
@Override
public Application createApplication(Application application)
@ -214,7 +216,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
try {
ConnectionManagerUtil.openDBConnection();
applicationList = applicationDAO.getApplications(filter, tenantId);
if(applicationList != null && applicationList.getApplications() != null && !applicationList
if (applicationList != null && applicationList.getApplications() != null && !applicationList
.getApplications().isEmpty()) {
if (!isAdminUser(userName, tenantId, CarbonConstants.UI_ADMIN_PERMISSION_COLLECTION)) {
applicationList = getRoleRestrictedApplicationList(applicationList, userName);
@ -249,7 +251,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
try {
ConnectionManagerUtil.beginDBTransaction();
Application existingApplication = this.applicationDAO.getApplicationById(applicationId, tenantId);
if (existingApplication == null){
if (existingApplication == null) {
throw new NotFoundException(
"Couldn't find application for the application Id: " + applicationId);
}
@ -261,13 +263,15 @@ public class ApplicationManagerImpl implements ApplicationManager {
String packageName = this.applicationReleaseDAO.getPackageName(applicationId, tenantId);
if (packageName != null && !packageName.equals(applicationRelease.getPackageName())) {
throw new BadRequestException(
"Package name in the payload is different from the existing package name of other application releases.");
"Package name in the payload is different from the existing package name of other application" +
" releases.");
}
applicationRelease = this.applicationReleaseDAO
.createRelease(applicationRelease, application.getId(), tenantId);
LifecycleState lifecycleState = getLifecycleStateInstant(AppLifecycleState.CREATED.toString(),
AppLifecycleState.CREATED.toString());
this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationId, applicationRelease.getUuid(), tenantId);
this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationId, applicationRelease.getUuid(),
tenantId);
ConnectionManagerUtil.commitDBTransaction();
return applicationRelease;
} catch (TransactionManagementException e) {
@ -281,7 +285,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
"Error occurred while adding application release into IoTS app management Application id of the "
+ "application release: " + applicationId, e);
} catch (LifeCycleManagementDAOException e) {
} catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
// todo throws when adding lifecycle state
throw new ApplicationManagementException(
@ -462,7 +466,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
application = this.applicationDAO.getApplicationByRelease(appReleaseUUID, tenantId);
if (application.getUnrestrictedRoles().isEmpty() || isRoleExists(application.getUnrestrictedRoles(),
userName)) {
userName)) {
return application;
}
return null;
@ -522,7 +526,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
private List<ApplicationRelease> filterAppReleaseByCurrentState(List<ApplicationRelease> applicationReleases,
String state) {
String state) {
List<ApplicationRelease> filteredReleases = new ArrayList<>();
if (state != null && !state.isEmpty()) {
@ -577,7 +581,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
LifecycleState newAppLifecycleState = getLifecycleStateInstant(AppLifecycleState.REMOVED.toString(),
appLifecycleState.getCurrentState());
if (lifecycleStateManager.isValidStateChange(newAppLifecycleState.getPreviousState(),
newAppLifecycleState.getCurrentState(),userName,tenantId)) {
newAppLifecycleState.getCurrentState(), userName, tenantId)) {
this.lifecycleStateDAO
.addLifecycleState(newAppLifecycleState, applicationId, applicationRelease.getUuid(),
tenantId);
@ -624,7 +628,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
appLifecycleState.getCurrentState());
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
if (lifecycleStateManager.isValidStateChange(newAppLifecycleState.getPreviousState(),
newAppLifecycleState.getCurrentState(),userName,tenantId)) {
newAppLifecycleState.getCurrentState(), userName, tenantId)) {
this.lifecycleStateDAO
.addLifecycleState(newAppLifecycleState, applicationId, applicationRelease.getUuid(),
tenantId);
@ -633,7 +637,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
// todo
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("Lifecycle State Validation failed. Application Id: " +
applicationId + " Application release UUID: " + releaseUuid); }
applicationId + " Application release UUID: " + releaseUuid);
}
} else {
ConnectionManagerUtil.rollbackDBTransaction();
throw new ApplicationManagementException("Can't delete the application release, You have to move the " +
@ -663,7 +668,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
UserRealm userRealm = DataHolder.getInstance().getRealmService().getTenantUserRealm(tenantId);
return userRealm != null && userRealm.getAuthorizationManager() != null && userRealm.getAuthorizationManager()
.isUserAuthorized(MultitenantUtils.getTenantAwareUsername(username), permission,
CarbonConstants.UI_PERMISSION_ACTION);
CarbonConstants.UI_PERMISSION_ACTION);
}
/**
@ -699,7 +704,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
"App Type contains in the application creating payload doesn't match with supported app types");
}
if (application.getApplicationReleases().size() > 1 ){
if (application.getApplicationReleases().size() > 1) {
throw new RequestValidatingException(
"Invalid payload. Application creating payload should contains one application release, but "
+ "the payload contains more than one");
@ -720,7 +725,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
+ " and application type " + application.getType() + ". Tenant ID is " + tenantId, e);
} catch (DBConnectionException e) {
throw new RequestValidatingException(
"Error occured while getting database connection to get existing applications for application name: "
"Error occured while getting database connection to get existing applications for application " +
"name: "
+ application.getName() + " and application type: " + application.getType()
+ ". Tenant id is " + tenantId, e);
} finally {
@ -755,7 +761,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
public Application getApplicationIfAccessible(int applicationId) throws ApplicationManagementException {
if (applicationId <= 0) {
throw new ApplicationManagementException("Application id could,t be a negative integer. Hence please add " +
"valid application id.");
"valid application id.");
}
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
@ -793,7 +799,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
* @return Application related with the UUID
*/
private ApplicationRelease getAppReleaseIfExists(int applicationId, String applicationUuid) throws
ApplicationManagementException {
ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
ApplicationRelease applicationRelease;
@ -816,12 +822,12 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
private ApplicationRelease updateRelease(int appId, ApplicationRelease applicationRelease) throws
ApplicationManagementException {
ApplicationManagementException {
validateAppReleasePayload(applicationRelease);
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
if (log.isDebugEnabled()) {
log.debug("Updating the Application release. UUID: " + applicationRelease.getUuid() + ", " +
"Application Id: " + appId);
"Application Id: " + appId);
}
applicationRelease = this.applicationReleaseDAO.updateRelease(appId, applicationRelease, tenantId);
@ -830,7 +836,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
@Override
public ApplicationRelease updateApplicationImageArtifact(int appId, String uuid, InputStream iconFileStream, InputStream
public ApplicationRelease updateApplicationImageArtifact(int appId, String uuid, InputStream iconFileStream,
InputStream
bannerFileStream, List<InputStream> attachments)
throws ApplicationManagementException, ResourceManagementException {
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
@ -839,7 +846,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
ConnectionManagerUtil.getDBConnection();
applicationRelease = getAppReleaseIfExists(appId, uuid);
if (applicationRelease == null) {
throw new NotFoundException("No App release associated with the app Id " + appId + "and UUID "+ uuid);
throw new NotFoundException("No App release associated with the app Id " + appId + "and UUID " + uuid);
}
LifecycleState lifecycleState = getLifecycleState(appId, applicationRelease.getUuid());
if (AppLifecycleState.PUBLISHED.toString().equals(lifecycleState.getCurrentState()) ||
@ -858,7 +865,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
@Override
public ApplicationRelease updateApplicationArtifact(int appId, String uuid, InputStream binaryFile)
throws ApplicationManagementException, ResourceManagementException, RequestValidatingException, DeviceManagementException {
throws ApplicationManagementException, ResourceManagementException, RequestValidatingException,
DeviceManagementException {
ApplicationStorageManager applicationStorageManager = Util.getApplicationStorageManager();
ApplicationRelease applicationRelease;
try {
@ -867,13 +875,13 @@ public class ApplicationManagerImpl implements ApplicationManager {
Application application = getApplicationById(appId, null);
List<DeviceType> deviceTypes = Util.getDeviceManagementService().getDeviceTypes();
for (DeviceType deviceType:deviceTypes) {
for (DeviceType deviceType : deviceTypes) {
if (deviceType.getId() == application.getDeviceTypeId()) {
application.setDeviceType(deviceType.getName());
}
}
if (applicationRelease == null) {
throw new NotFoundException("No App release associated with the app Id " + appId + "and UUID "+ uuid);
throw new NotFoundException("No App release associated with the app Id " + appId + "and UUID " + uuid);
}
applicationStorageManager
.updateReleaseArtifacts(applicationRelease, application.getType(), application.getDeviceType(),
@ -923,7 +931,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
}
/**
* To validate a app release creating request and app updating request to make sure all the pre-conditions satisfied.
* To validate a app release creating request and app updating request to make sure all the pre-conditions
* satisfied.
*
* @param applicationRelease ApplicationRelease that need to be created.
* @throws ApplicationManagementException Application Management Exception.
@ -932,13 +941,13 @@ public class ApplicationManagerImpl implements ApplicationManager {
throws ApplicationManagementException {
if (applicationRelease.getVersion() == null) {
throw new ApplicationManagementException("ApplicationRelease version name is a mandatory parameter for "
+ "creating release. It cannot be found.");
+ "creating release. It cannot be found.");
}
}
@Override
public LifecycleState getLifecycleState(int applicationId, String releaseUuid) throws
ApplicationManagementException {
ApplicationManagementException {
LifecycleState lifecycleState;
try {
ConnectionManagerUtil.openDBConnection();
@ -985,8 +994,8 @@ public class ApplicationManagerImpl implements ApplicationManager {
state.setUpdatedBy(userName);
if (state.getCurrentState() != null && state.getPreviousState() != null) {
if (lifecycleStateManager.isValidStateChange(state.getPreviousState(), state.getCurrentState(),userName,
tenantId)) {
if (lifecycleStateManager.isValidStateChange(state.getPreviousState(), state.getCurrentState(),
userName, tenantId)) {
//todo if current state of the adding lifecycle state is PUBLISHED, need to check whether is there
//todo any other application release in PUBLISHED state for the application( i.e for the appid)
this.lifecycleStateDAO.addLifecycleState(state, applicationId, releaseUuid, tenantId);
@ -1021,13 +1030,13 @@ public class ApplicationManagerImpl implements ApplicationManager {
if (existingApplication == null) {
throw new NotFoundException("Tried to update Application which is not in the publisher, " +
"Please verify application details");
"Please verify application details");
}
if (!existingApplication.getType().equals(application.getType())) {
throw new ApplicationManagementException("You are trying to change the application type and it is not " +
"possible after you create an application. Therefore " +
"please remove this application and publish " +
"new application with type: " + application.getType());
"possible after you create an application. Therefore " +
"please remove this application and publish " +
"new application with type: " + application.getType());
}
if (!existingApplication.getSubType().equals(application.getSubType())) {
if (ApplicationSubscriptionType.PAID.toString().equals(existingApplication.getSubType()) && (
@ -1100,7 +1109,7 @@ public class ApplicationManagerImpl implements ApplicationManager {
private <T> List<T> getDifference(List<T> list1, Collection<T> list2) {
List<T> list = new ArrayList<>();
for (T t : list1) {
if(!list2.contains(t)) {
if (!list2.contains(t)) {
list.add(t);
}
}

@ -1,21 +1,3 @@
/*
* Copyright (c) 2019, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
@ -85,8 +67,8 @@ public class LifecycleStateManager {
return lifecycleStates.get(currentLifecycleState.toUpperCase()).getProceedingStates();
}
public boolean isValidStateChange(String currentState, String nextState, String username,
int tenantId) throws LifecycleManagementException {
public boolean isValidStateChange(String currentState, String nextState, String username, int tenantId) throws
LifecycleManagementException {
UserRealm userRealm;
String permission = getPermissionForStateChange(nextState);

22
node_modules/regjsgen/LICENSE generated vendored

@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright 2014-2018 Benjamin Tan <https://bnjmnt4n.now.sh/>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

33
node_modules/regjsgen/README.md generated vendored

@ -1,33 +0,0 @@
# regjsgen [![Build status](https://travis-ci.org/bnjmnt4n/regjsgen.svg?branch=master)](https://travis-ci.org/bnjmnt4n/regjsgen) [![Code coverage status](https://codecov.io/gh/bnjmnt4n/regjsgen/branch/master/graph/badge.svg)](https://codecov.io/gh/bnjmnt4n/regjsgen)
Generate regular expressions from [regjsparser](https://github.com/jviereck/regjsparser)s AST.
## Installation
```bash
npm install --save regjsgen
```
## API
### `regjsgen.generate(ast)`
This function accepts an abstract syntax tree representing a regular expression, and returns the generated regular expression string.
```js
var regjsparser = require('regjsparser');
var regjsgen = require('regjsgen');
// Generate an AST with `regjsparser`.
var ast = regjsparser.parse(regex);
// Modify AST
// …
// Generate `RegExp` string with `regjsgen`.
regex = regjsgen.generate(ast);
```
## Support
Tested in Node.js 0.10, 0.12, 4, 6 and 8.

@ -1,95 +0,0 @@
{
"_args": [
[
"regjsgen",
"/media/gathika/MainDisk/entgra_repos/carbon-device-mgt"
]
],
"_from": "regjsgen@latest",
"_hasShrinkwrap": false,
"_id": "regjsgen@0.5.0",
"_inCache": true,
"_installable": true,
"_location": "/regjsgen",
"_nodeVersion": "8.9.3",
"_npmOperationalInternal": {
"host": "s3://npm-registry-packages",
"tmp": "tmp/regjsgen_0.5.0_1540608114803_0.0388782175432143"
},
"_npmUser": {
"email": "demoneaux@gmail.com",
"name": "d10"
},
"_npmVersion": "5.5.1",
"_phantomChildren": {},
"_requested": {
"name": "regjsgen",
"raw": "regjsgen",
"rawSpec": "",
"scope": null,
"spec": "latest",
"type": "tag"
},
"_requiredBy": [
"/"
],
"_resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
"_shasum": "a7634dc08f89209c2049adda3525711fb97265dd",
"_shrinkwrap": null,
"_spec": "regjsgen",
"_where": "/media/gathika/MainDisk/entgra_repos/carbon-device-mgt",
"author": {
"name": "Benjamin Tan",
"url": "https://bnjmnt4n.now.sh/"
},
"bugs": {
"url": "https://github.com/bnjmnt4n/regjsgen/issues"
},
"dependencies": {},
"description": "Generate regular expressions from regjsparsers AST.",
"devDependencies": {
"codecov": "^3.1.0",
"istanbul": "~0.4.5",
"regjsparser": "~0.4.0",
"request": "^2.88.0"
},
"directories": {},
"dist": {
"fileCount": 4,
"integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb09BzCRA9TVsSAnZWagAAHL8P/2+qPfMU6ChUdXtesJcS\nb4J4OtV52K6iYdJky/TSI2udBPTtzyJ3JXIr5Q2RnBj3wIkDuhFGesCoZ7Ap\noUEm8jYnQXTV1PBt3Q1nTeUww0Wcj7/0T6PHVA1IuKHxt56yP5/h+C9eTbK+\nFabsdn86iXKZnUNggtiVAjE0JarqVfKZC9rpvrTdTFn9hx+rr02RPtXHHb1J\nHipRJsJ6zsLRyZ1ysIB3VZYrIya2SH1FjiddvVbLbB7QDnnlYKuzC7n4p4uB\nVcTWQMIBg3fkqjYIDvx765FABBqxaMxYdjiUsQK/mLz+uilKukbHWhKuGsAb\n/F47dJAUKxs6yXreiQsLNNhAUcWQbE7cDmNKfTI9sMSjtctogTqYWgJb0PVi\na0CbWNclNF7mFwxTsanjCFypZZSMgpTsxuJDf4UrjZvfsBYfqtH7HhpIVsZq\nBFBev4QpQkaK8SOm1R8QCFy1fiMqlEREU7goErBO6kQvQC9DiEq7h9pRwVnV\nhe2pr1OyMcsSkADI4EjvwrUgoirbZzpZ/5ir2LUyQ+QodIgPc6DhDEbldlI1\nmr0lFWHkcmFbo4TPcz/sDUS4SSVvrxiQ2J/XuH9s61YJltnwWhFFauRUdI22\nalBB6AE1zPw2kP580z7JLsEWyMPYELCKmcpXSRdq58NCMZXvrzbqjN/+6dBS\n1XD3\r\n=h56Q\r\n-----END PGP SIGNATURE-----\r\n",
"shasum": "a7634dc08f89209c2049adda3525711fb97265dd",
"tarball": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
"unpackedSize": 13630
},
"gitHead": "3e898bdd4577e5f6fc9ffc7c867bbe8661b28344",
"homepage": "https://github.com/bnjmnt4n/regjsgen",
"keywords": [
"ast",
"generate",
"regex",
"regexp",
"regular expressions"
],
"license": "MIT",
"main": "regjsgen.js",
"maintainers": [
{
"name": "d10",
"email": "demoneaux@gmail.com"
}
],
"name": "regjsgen",
"optionalDependencies": {},
"readme": "ERROR: No README data found!",
"repository": {
"type": "git",
"url": "git+https://github.com/bnjmnt4n/regjsgen.git"
},
"scripts": {
"coverage": "istanbul cover --report html tests/tests.js",
"test": "node tests/tests.js",
"update-fixtures": "node tests/update-fixtures.js"
},
"version": "0.5.0"
}

401
node_modules/regjsgen/regjsgen.js generated vendored

@ -1,401 +0,0 @@
/*!
* regjsgen 0.5.0
* Copyright 2014-2018 Benjamin Tan <https://bnjmnt4n.now.sh/>
* Available under MIT license <https://github.com/bnjmnt4n/regjsgen/blob/master/LICENSE>
*/
;(function() {
'use strict';
// Used to determine if values are of the language type `Object`.
var objectTypes = {
'function': true,
'object': true
};
// Used as a reference to the global object.
var root = (objectTypes[typeof window] && window) || this;
// Detect free variable `exports`.
var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
// Detect free variable `module`.
var hasFreeModule = objectTypes[typeof module] && module && !module.nodeType;
// Detect free variable `global` from Node.js or Browserified code and use it as `root`.
var freeGlobal = freeExports && hasFreeModule && typeof global == 'object' && global;
if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) {
root = freeGlobal;
}
// Used to check objects for own properties.
var hasOwnProperty = Object.prototype.hasOwnProperty;
/*--------------------------------------------------------------------------*/
// Generates a string based on the given code point.
// Based on https://mths.be/fromcodepoint by @mathias.
function fromCodePoint() {
var codePoint = Number(arguments[0]);
if (
!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
codePoint < 0 || // not a valid Unicode code point
codePoint > 0x10FFFF || // not a valid Unicode code point
Math.floor(codePoint) != codePoint // not an integer
) {
throw RangeError('Invalid code point: ' + codePoint);
}
if (codePoint <= 0xFFFF) {
// BMP code point
return String.fromCharCode(codePoint);
} else {
// Astral code point; split in surrogate halves
// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
codePoint -= 0x10000;
var highSurrogate = (codePoint >> 10) + 0xD800;
var lowSurrogate = (codePoint % 0x400) + 0xDC00;
return String.fromCharCode(highSurrogate, lowSurrogate);
}
}
/*--------------------------------------------------------------------------*/
// Ensures that nodes have the correct types.
var assertTypeRegexMap = {};
function assertType(type, expected) {
if (expected.indexOf('|') == -1) {
if (type == expected) {
return;
}
throw Error('Invalid node type: ' + type + '; expected type: ' + expected);
}
expected = hasOwnProperty.call(assertTypeRegexMap, expected)
? assertTypeRegexMap[expected]
: (assertTypeRegexMap[expected] = RegExp('^(?:' + expected + ')$'));
if (expected.test(type)) {
return;
}
throw Error('Invalid node type: ' + type + '; expected types: ' + expected);
}
/*--------------------------------------------------------------------------*/
// Generates a regular expression string based on an AST.
function generate(node) {
var type = node.type;
if (hasOwnProperty.call(generators, type)) {
return generators[type](node);
}
throw Error('Invalid node type: ' + type);
}
/*--------------------------------------------------------------------------*/
function generateAlternative(node) {
assertType(node.type, 'alternative');
var terms = node.body,
i = -1,
length = terms.length,
result = '';
while (++i < length) {
result += generateTerm(terms[i]);
}
return result;
}
function generateAnchor(node) {
assertType(node.type, 'anchor');
switch (node.kind) {
case 'start':
return '^';
case 'end':
return '$';
case 'boundary':
return '\\b';
case 'not-boundary':
return '\\B';
default:
throw Error('Invalid assertion');
}
}
function generateAtom(node) {
assertType(node.type, 'anchor|characterClass|characterClassEscape|dot|group|reference|value');
return generate(node);
}
function generateCharacterClass(node) {
assertType(node.type, 'characterClass');
var classRanges = node.body,
i = -1,
length = classRanges.length,
result = '';
if (node.negative) {
result += '^';
}
while (++i < length) {
result += generateClassAtom(classRanges[i]);
}
return '[' + result + ']';
}
function generateCharacterClassEscape(node) {
assertType(node.type, 'characterClassEscape');
return '\\' + node.value;
}
function generateUnicodePropertyEscape(node) {
assertType(node.type, 'unicodePropertyEscape');
return '\\' + (node.negative ? 'P' : 'p') + '{' + node.value + '}';
}
function generateCharacterClassRange(node) {
assertType(node.type, 'characterClassRange');
var min = node.min,
max = node.max;
if (min.type == 'characterClassRange' || max.type == 'characterClassRange') {
throw Error('Invalid character class range');
}
return generateClassAtom(min) + '-' + generateClassAtom(max);
}
function generateClassAtom(node) {
assertType(node.type, 'anchor|characterClassEscape|characterClassRange|dot|value');
return generate(node);
}
function generateDisjunction(node) {
assertType(node.type, 'disjunction');
var body = node.body,
i = -1,
length = body.length,
result = '';
while (++i < length) {
if (i != 0) {
result += '|';
}
result += generate(body[i]);
}
return result;
}
function generateDot(node) {
assertType(node.type, 'dot');
return '.';
}
function generateGroup(node) {
assertType(node.type, 'group');
var result = '';
switch (node.behavior) {
case 'normal':
if (node.name) {
result += '?<' + generateIdentifier(node.name) + '>';
}
break;
case 'ignore':
result += '?:';
break;
case 'lookahead':
result += '?=';
break;
case 'negativeLookahead':
result += '?!';
break;
case 'lookbehind':
result += '?<=';
break;
case 'negativeLookbehind':
result += '?<!';
break;
default:
throw Error('Invalid behaviour: ' + node.behaviour);
}
var body = node.body,
i = -1,
length = body.length;
while (++i < length) {
result += generate(body[i]);
}
return '(' + result + ')';
}
function generateIdentifier(node) {
assertType(node.type, 'identifier');
return node.value;
}
function generateQuantifier(node) {
assertType(node.type, 'quantifier');
var quantifier = '',
min = node.min,
max = node.max;
if (max == null) {
if (min == 0) {
quantifier = '*';
} else if (min == 1) {
quantifier = '+';
} else {
quantifier = '{' + min + ',}';
}
} else if (min == max) {
quantifier = '{' + min + '}';
} else if (min == 0 && max == 1) {
quantifier = '?';
} else {
quantifier = '{' + min + ',' + max + '}';
}
if (!node.greedy) {
quantifier += '?';
}
return generateAtom(node.body[0]) + quantifier;
}
function generateReference(node) {
assertType(node.type, 'reference');
if (node.matchIndex) {
return '\\' + node.matchIndex;
}
if (node.name) {
return '\\k<' + generateIdentifier(node.name) + '>';
}
throw new Error('Unknown reference type');
}
function generateTerm(node) {
assertType(node.type, 'anchor|characterClass|characterClassEscape|empty|group|quantifier|reference|unicodePropertyEscape|value');
return generate(node);
}
function generateValue(node) {
assertType(node.type, 'value');
var kind = node.kind,
codePoint = node.codePoint;
if (typeof codePoint != 'number') {
throw new Error('Invalid code point: ' + codePoint);
}
switch (kind) {
case 'controlLetter':
return '\\c' + fromCodePoint(codePoint + 64);
case 'hexadecimalEscape':
return '\\x' + ('00' + codePoint.toString(16).toUpperCase()).slice(-2);
case 'identifier':
return '\\' + fromCodePoint(codePoint);
case 'null':
return '\\' + codePoint;
case 'octal':
return '\\' + codePoint.toString(8);
case 'singleEscape':
switch (codePoint) {
case 0x0008:
return '\\b';
case 0x0009:
return '\\t';
case 0x000A:
return '\\n';
case 0x000B:
return '\\v';
case 0x000C:
return '\\f';
case 0x000D:
return '\\r';
default:
throw Error('Invalid code point: ' + codePoint);
}
case 'symbol':
return fromCodePoint(codePoint);
case 'unicodeEscape':
return '\\u' + ('0000' + codePoint.toString(16).toUpperCase()).slice(-4);
case 'unicodeCodePointEscape':
return '\\u{' + codePoint.toString(16).toUpperCase() + '}';
default:
throw Error('Unsupported node kind: ' + kind);
}
}
/*--------------------------------------------------------------------------*/
// Used to generate strings for each node type.
var generators = {
'alternative': generateAlternative,
'anchor': generateAnchor,
'characterClass': generateCharacterClass,
'characterClassEscape': generateCharacterClassEscape,
'characterClassRange': generateCharacterClassRange,
'unicodePropertyEscape': generateUnicodePropertyEscape,
'disjunction': generateDisjunction,
'dot': generateDot,
'group': generateGroup,
'quantifier': generateQuantifier,
'reference': generateReference,
'value': generateValue
};
/*--------------------------------------------------------------------------*/
// Export regjsgen.
var regjsgen = {
'generate': generate
};
// Some AMD build optimizers, like r.js, check for condition patterns like the following:
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
// Define as an anonymous module so it can be aliased through path mapping.
define(function() {
return regjsgen;
});
root.regjsgen = regjsgen;
}
// Check for `exports` after `define` in case a build optimizer adds an `exports` object.
else if (freeExports && hasFreeModule) {
// Export for CommonJS support.
freeExports.generate = generate;
}
else {
// Export to the global object.
root.regjsgen = regjsgen;
}
}.call(this));
Loading…
Cancel
Save