Skip to content
This repository was archived by the owner on Feb 2, 2025. It is now read-only.

Commit eccbc42

Browse files
committed
added ng add support
1 parent 1b380a6 commit eccbc42

File tree

9 files changed

+775
-42
lines changed

9 files changed

+775
-42
lines changed

package-lock.json

Lines changed: 582 additions & 42 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"compile": "npm run lint:code && ngc -p tsconfig-build.json",
99
"compile:tsc": "npm run lint && tsc -p tsconfig.json",
1010
"bundles": "npm run rollup && npm run rollup:min",
11+
"schematics:build": "tsc -p schematics/tsconfig.json",
1112
"lint": "npm run lint:code && npm run lint:test",
1213
"lint:code": "tslint ./src/**/*.ts -t verbose --exclude ./src/**/*.d.ts",
1314
"lint:test": "tslint ./test/**/*.ts -t verbose --exclude ./test/**/*.d.ts",
@@ -38,6 +39,8 @@
3839
"jquery": ">=3.4.1"
3940
},
4041
"devDependencies": {
42+
"@angular-devkit/core": "^9.0.5",
43+
"@angular-devkit/schematics": "^9.0.5",
4144
"@angular/common": "^8.0.0",
4245
"@angular/compiler": "^8.0.0",
4346
"@angular/compiler-cli": "^8.0.0",
@@ -66,6 +69,7 @@
6669
"rollup": "~1.15.0",
6770
"rollup-plugin-uglify": "~6.0.2",
6871
"rxjs": "^6.5.2",
72+
"schematics-utilities": "^2.0.1",
6973
"tslint": "~5.17.0",
7074
"typescript": "~3.4.5",
7175
"zone.js": "~0.9.1"

schematics/.editorconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[*]
2+
charset = utf-8
3+
indent_size = 2
4+
indent_style = space

schematics/.gitignore

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Outputs
2+
src/**/*.js
3+
src/**/*.js.map
4+
src/**/*.d.ts
5+
dist/
6+
7+
# IDEs
8+
.idea/
9+
jsconfig.json
10+
.vscode/
11+
12+
# Misc
13+
node_modules/
14+
npm-debug.log*
15+
yarn-error.log*
16+
17+
# Mac OSX Finder files.
18+
**/.DS_Store
19+
.DS_Store

schematics/.npmignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Ignores TypeScript files, but keeps definitions.
2+
*.ts
3+
!*.d.ts

schematics/src/collection.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
3+
"schematics": {
4+
"angular-datatables": {
5+
"description": "Adds Angular Datatables to the application without affecting any templates",
6+
"factory": "./angular-datatables/index",
7+
"schema": "./angular-datatables/schema.json",
8+
"aliases": ["install"]
9+
}
10+
}
11+
}

schematics/src/ng-add/index.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import { Rule, SchematicContext, Tree, chain } from '@angular-devkit/schematics';
2+
import {
3+
addPackageJsonDependency, NodeDependency, NodeDependencyType, getWorkspace,
4+
getProjectFromWorkspace, addModuleImportToRootModule
5+
} from 'schematics-utilities';
6+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
7+
8+
export default function (_options: any): Rule {
9+
return chain([
10+
addPackageJsonDependencies(),
11+
installPackageJsonDependencies(),
12+
updateAngularJsonFile(),
13+
addModuleToAppModule()
14+
]);
15+
}
16+
17+
function addPackageJsonDependencies() {
18+
return (tree: Tree, context: SchematicContext) => {
19+
// Update package.json
20+
const dependencies: NodeDependency[] = [
21+
{ type: NodeDependencyType.Default, version: '^3.4.1', name: 'jquery' },
22+
{ type: NodeDependencyType.Default, version: '~1.1.0', name: 'datatables.net' },
23+
{ type: NodeDependencyType.Default, version: '~1.1.0', name: 'datatables.net-dt' },
24+
{ type: NodeDependencyType.Default, version: '~1.1.0', name: 'angular-datatables' },
25+
{ type: NodeDependencyType.Dev, version: '~1.1.0', name: '@types/jquery' },
26+
{ type: NodeDependencyType.Dev, version: '~1.1.0', name: '@types/datatables.net' }
27+
];
28+
29+
dependencies.forEach(dependency => {
30+
31+
addPackageJsonDependency(tree, dependency);
32+
context.logger.log('info', `✅️ Added "${dependency.name}" into ${dependency.type}`);
33+
});
34+
return tree
35+
}
36+
}
37+
38+
function installPackageJsonDependencies(): Rule {
39+
return (host: Tree, context: SchematicContext) => {
40+
context.addTask(new NodePackageInstallTask());
41+
context.logger.log('info', `🔍 Installing packages...`);
42+
43+
return host;
44+
};
45+
}
46+
47+
48+
function updateAngularJsonFile() {
49+
return (tree: Tree, context: SchematicContext) => {
50+
try {
51+
const angularJsonFile = tree.read('angular.json');
52+
53+
if (angularJsonFile) {
54+
const angularJsonFileObject = JSON.parse(angularJsonFile.toString('utf-8'));
55+
const project = Object.keys(angularJsonFileObject['projects'])[0];
56+
const projectObject = angularJsonFileObject.projects[project];
57+
58+
const styles = projectObject.targets.build.options.styles;
59+
const scripts = projectObject.targets.build.options.scripts;
60+
61+
styles.push({
62+
input: "node_modules/datatables.net-dt/css/jquery.dataTables.css"
63+
});
64+
65+
scripts.push({
66+
input: "node_modules/jquery/dist/jquery.js"
67+
});
68+
69+
scripts.push({
70+
input: "node_modules/datatables.net/js/jquery.dataTables.js"
71+
});
72+
73+
tree.overwrite('angular.json', JSON.stringify(angularJsonFileObject, null, 2));
74+
context.logger.log('info', `✅️ Updated angular.json`);
75+
} else {
76+
context.logger.log('error', '🚫 Failed to locate angular.json.')
77+
}
78+
} catch (e) {
79+
context.logger.log('error', `🚫 Failed to update angular.json.`);
80+
}
81+
82+
}
83+
}
84+
85+
function addModuleToAppModule(): Rule {
86+
return (host: Tree, context: SchematicContext) => {
87+
const moduleName = 'DataTablesModule';
88+
try {
89+
const workspace = getWorkspace(host);
90+
const project = getProjectFromWorkspace(
91+
workspace,
92+
Object.keys(workspace['projects'])[0]
93+
);
94+
addModuleImportToRootModule(host, moduleName, 'angular-datatables', project);
95+
} catch (e) {
96+
context.logger.log('error', `🚫 Failed to update app.module.ts`);
97+
return host;
98+
}
99+
context.logger.log('info', `✅️ "${moduleName}" is imported`);
100+
}
101+
}

schematics/src/ng-add/schema.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"$schema": "http://json-schema.org/schema",
3+
"id": "angular-datatables-schematic-angular-datatables",
4+
"title": "Angular DataTables angular-datatables schematic",
5+
"type": "object",
6+
"properties": {
7+
"project": {
8+
"title": "angular-datatables",
9+
"type": "string",
10+
"description": "The name of the project.",
11+
"$default": {
12+
"$source": "projectName"
13+
}
14+
}
15+
}
16+
}

schematics/tsconfig.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"compilerOptions": {
3+
"baseUrl": "tsconfig",
4+
"lib": [
5+
"es2018",
6+
"dom"
7+
],
8+
"outDir": "dist",
9+
"declaration": true,
10+
"module": "commonjs",
11+
"moduleResolution": "node",
12+
"noEmitOnError": true,
13+
"noFallthroughCasesInSwitch": true,
14+
"noImplicitAny": true,
15+
"noImplicitThis": true,
16+
"noUnusedParameters": true,
17+
"noUnusedLocals": true,
18+
"rootDir": "src/",
19+
"skipDefaultLibCheck": true,
20+
"skipLibCheck": true,
21+
"sourceMap": true,
22+
"strictNullChecks": true,
23+
"target": "es6",
24+
"types": [
25+
"jasmine",
26+
"node"
27+
]
28+
},
29+
"include": [
30+
"src/**/*"
31+
],
32+
"exclude": [
33+
"src/*/files/**/*"
34+
]
35+
}

0 commit comments

Comments
 (0)