@trackunit/iris-app 0.0.1-alpha-ce456b7c2.0
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/CHANGELOG.md +209 -0
- package/README.md +21 -0
- package/executors.json +20 -0
- package/generators.json +17 -0
- package/package.json +31 -0
- package/src/executors/build/executor.d.ts +9 -0
- package/src/executors/build/executor.js +49 -0
- package/src/executors/build/executor.js.map +1 -0
- package/src/executors/build/schema.d.ts +4 -0
- package/src/executors/build/schema.json +19 -0
- package/src/executors/publish/executor.d.ts +4 -0
- package/src/executors/publish/executor.js +126 -0
- package/src/executors/publish/executor.js.map +1 -0
- package/src/executors/publish/schema.d.ts +3 -0
- package/src/executors/publish/schema.json +19 -0
- package/src/executors/serve/executor.d.ts +4 -0
- package/src/executors/serve/executor.js +42 -0
- package/src/executors/serve/executor.js.map +1 -0
- package/src/executors/serve/schema.d.ts +3 -0
- package/src/executors/serve/schema.json +19 -0
- package/src/executors/utils/checkPackageVersion.d.ts +1 -0
- package/src/executors/utils/checkPackageVersion.js +51 -0
- package/src/executors/utils/checkPackageVersion.js.map +1 -0
- package/src/executors/utils/defaultWebpackConfig.d.ts +4 -0
- package/src/executors/utils/defaultWebpackConfig.js +144 -0
- package/src/executors/utils/defaultWebpackConfig.js.map +1 -0
- package/src/executors/utils/src/index.js +1 -0
- package/src/generators/create/files/assets/description.md +3 -0
- package/src/generators/create/files/iris-app-manifest.ts__template__ +27 -0
- package/src/generators/create/files/package.json__template__ +4 -0
- package/src/generators/create/files/src/index.ts__template__ +0 -0
- package/src/generators/create/files/tailwind.config.js__template__ +11 -0
- package/src/generators/create/files/tsconfig.app.json__template__ +21 -0
- package/src/generators/create/files/tsconfig.json__template__ +22 -0
- package/src/generators/create/files/webpack.config.ts__template__ +5 -0
- package/src/generators/create/generator.d.ts +4 -0
- package/src/generators/create/generator.js +120 -0
- package/src/generators/create/generator.js.map +1 -0
- package/src/generators/create/schema.d.ts +4 -0
- package/src/generators/create/schema.json +25 -0
- package/src/generators/extend/files/ADMIN_EXTENSION/extension-manifest.ts__template__ +13 -0
- package/src/generators/extend/files/ASSET_HOME_EXTENSION/extension-manifest.ts__template__ +13 -0
- package/src/generators/extend/files/FLEET_EXTENSION/extension-manifest.ts__template__ +14 -0
- package/src/generators/extend/files/REPORT_EXTENSION/extension-manifest.ts__template__ +10 -0
- package/src/generators/extend/files/react-app/src/app.spec.tsx__template__ +9 -0
- package/src/generators/extend/files/react-app/src/app.tsx__template__ +33 -0
- package/src/generators/extend/files/react-app/src/index.tsx__template__ +27 -0
- package/src/generators/extend/generator.d.ts +4 -0
- package/src/generators/extend/generator.js +143 -0
- package/src/generators/extend/generator.js.map +1 -0
- package/src/generators/extend/schema.d.ts +7 -0
- package/src/generators/extend/schema.json +54 -0
- package/src/index.d.ts +4 -0
- package/src/index.js +8 -0
- package/src/index.js.map +1 -0
- package/src/utils/addDevDependency.d.ts +3 -0
- package/src/utils/addDevDependency.js +39 -0
- package/src/utils/addDevDependency.js.map +1 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Card,
|
|
4
|
+
CardBody,
|
|
5
|
+
CardHeader,
|
|
6
|
+
Text,
|
|
7
|
+
Button,
|
|
8
|
+
Alert,
|
|
9
|
+
} from '@trackunit/react-components';
|
|
10
|
+
|
|
11
|
+
export const App = () => {
|
|
12
|
+
return (
|
|
13
|
+
<div className="w-full h-full grid place-content-center" data-testid="app">
|
|
14
|
+
<Card className="w-full">
|
|
15
|
+
<CardHeader
|
|
16
|
+
heading="Welcome to your app extension"
|
|
17
|
+
subHeading="Change the code in this file as you see fit"
|
|
18
|
+
/>
|
|
19
|
+
<CardBody>
|
|
20
|
+
<Alert color="success">
|
|
21
|
+
You are now ready to develop your app extension.
|
|
22
|
+
</Alert>
|
|
23
|
+
<Text> We also have buttons</Text>
|
|
24
|
+
<Button>Click me!</Button>
|
|
25
|
+
<Text>
|
|
26
|
+
More info and component found in storybook: <br/>
|
|
27
|
+
https://developers.trackunit.com/page/ui-components
|
|
28
|
+
</Text>
|
|
29
|
+
</CardBody>
|
|
30
|
+
</Card>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom";
|
|
3
|
+
import singleSpaReact from "single-spa-react";
|
|
4
|
+
import { TrackunitProviders } from "@trackunit/react-core-contexts";
|
|
5
|
+
import "@trackunit/css-core";
|
|
6
|
+
import { App } from "./app";
|
|
7
|
+
|
|
8
|
+
const RootComponent = () => (
|
|
9
|
+
<TrackunitProviders>
|
|
10
|
+
<App></App>
|
|
11
|
+
</TrackunitProviders>
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
const lifeCycle = singleSpaReact({
|
|
15
|
+
React,
|
|
16
|
+
ReactDOM,
|
|
17
|
+
rootComponent: RootComponent,
|
|
18
|
+
errorBoundary(err, info, props) {
|
|
19
|
+
return (
|
|
20
|
+
<div>An error occured in the <%= projectName %> app!</div>
|
|
21
|
+
);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const bootstrap = lifeCycle.bootstrap;
|
|
26
|
+
export const mount = lifeCycle.mount;
|
|
27
|
+
export const unmount = lifeCycle.unmount;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Tree } from "@nrwl/devkit";
|
|
2
|
+
import { IrisAppExtensionGeneratorSchema } from "./schema";
|
|
3
|
+
export declare const IrisAppExtensionGenerator: (tree: Tree, schemaOptions: IrisAppExtensionGeneratorSchema) => Promise<() => void>;
|
|
4
|
+
export default IrisAppExtensionGenerator;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IrisAppExtensionGenerator = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const devkit_1 = require("@nrwl/devkit");
|
|
6
|
+
const linter_1 = require("@nrwl/linter");
|
|
7
|
+
const react_1 = require("@nrwl/react");
|
|
8
|
+
const typescript_1 = require("@nrwl/workspace/src/utilities/typescript");
|
|
9
|
+
const camelcase_1 = tslib_1.__importDefault(require("camelcase"));
|
|
10
|
+
const Enquirer = tslib_1.__importStar(require("enquirer"));
|
|
11
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
12
|
+
const path = tslib_1.__importStar(require("path"));
|
|
13
|
+
const ts_morph_1 = require("ts-morph");
|
|
14
|
+
function normalizeOptions(tree, options) {
|
|
15
|
+
const name = (0, devkit_1.names)(options.name).fileName;
|
|
16
|
+
const projectDirectory = options.directory ? `${(0, devkit_1.names)(options.directory).fileName}/${name}` : name;
|
|
17
|
+
const projectName = projectDirectory.replace(new RegExp("/", "g"), "-");
|
|
18
|
+
const projectCamelcase = (0, camelcase_1.default)(name);
|
|
19
|
+
const wsLayout = (0, devkit_1.getWorkspaceLayout)(tree);
|
|
20
|
+
const projectRoot = `${wsLayout.libsDir}/${projectDirectory}`;
|
|
21
|
+
const sourceRoot = `${wsLayout.libsDir}/${projectDirectory}/src`;
|
|
22
|
+
const importPath = `@${wsLayout.npmScope}/${projectDirectory}`;
|
|
23
|
+
return {
|
|
24
|
+
...options,
|
|
25
|
+
projectName,
|
|
26
|
+
projectRoot,
|
|
27
|
+
projectDirectory,
|
|
28
|
+
projectCamelcase,
|
|
29
|
+
importPath,
|
|
30
|
+
sourceRoot,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const IrisAppExtensionGenerator = async function (tree, schemaOptions) {
|
|
34
|
+
const options = await updateAppName(tree, schemaOptions);
|
|
35
|
+
const normalizedOptions = normalizeOptions(tree, options);
|
|
36
|
+
const templateOptions = {
|
|
37
|
+
...normalizedOptions,
|
|
38
|
+
...(0, devkit_1.names)(options.name),
|
|
39
|
+
offsetFromRoot: (0, devkit_1.offsetFromRoot)(normalizedOptions.projectRoot),
|
|
40
|
+
template: "",
|
|
41
|
+
};
|
|
42
|
+
const irisAppExtensionType = options.type;
|
|
43
|
+
if (!fs.existsSync(`${(0, devkit_1.getWorkspaceLayout)(tree).appsDir}/${normalizedOptions.app}`)) {
|
|
44
|
+
throw new Error(`The app does not exist: ${(0, devkit_1.getWorkspaceLayout)(tree).appsDir}/${normalizedOptions.app} make sure you enter the right app name`);
|
|
45
|
+
}
|
|
46
|
+
const manifestPath = `${(0, devkit_1.getWorkspaceLayout)(tree).appsDir}/${normalizedOptions.app}/iris-app-manifest.ts`;
|
|
47
|
+
if (!fs.existsSync(manifestPath)) {
|
|
48
|
+
throw `The app does not have an iris-app-manifest.ts: ${manifestPath} make sure you enter the right app name, which has an iris-app-manifest.ts`;
|
|
49
|
+
}
|
|
50
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, "files", irisAppExtensionType), normalizedOptions.projectRoot, templateOptions);
|
|
51
|
+
if (options.updatePackageJson) {
|
|
52
|
+
(0, devkit_1.addDependenciesToPackageJson)(tree, {}, {
|
|
53
|
+
"single-spa": "^5.9.3",
|
|
54
|
+
"single-spa-react": "^4.6.1",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const schema = {
|
|
58
|
+
name: options.name,
|
|
59
|
+
style: "none",
|
|
60
|
+
skipFormat: false,
|
|
61
|
+
strict: true,
|
|
62
|
+
unitTestRunner: "jest",
|
|
63
|
+
linter: linter_1.Linter.EsLint,
|
|
64
|
+
routing: false,
|
|
65
|
+
pascalCaseFiles: true,
|
|
66
|
+
directory: options.directory,
|
|
67
|
+
skipTsConfig: false,
|
|
68
|
+
standaloneConfig: true,
|
|
69
|
+
};
|
|
70
|
+
await (0, react_1.libraryGenerator)(tree, schema);
|
|
71
|
+
if (irisAppExtensionType !== "REPORT_EXTENSION") {
|
|
72
|
+
(0, devkit_1.generateFiles)(tree, path.join(__dirname, "files", "react-app"), normalizedOptions.projectRoot, templateOptions);
|
|
73
|
+
}
|
|
74
|
+
const rootTsConfigPath = (0, typescript_1.getRootTsConfigPathInTree)(tree);
|
|
75
|
+
if (!rootTsConfigPath) {
|
|
76
|
+
throw new Error("Could not find root tsconfig.json");
|
|
77
|
+
}
|
|
78
|
+
(0, devkit_1.updateJson)(tree, rootTsConfigPath, tsConfigBase => {
|
|
79
|
+
tsConfigBase.compilerOptions.paths[normalizedOptions.importPath] = [
|
|
80
|
+
path.join(normalizedOptions.projectRoot, "extension-manifest.ts"),
|
|
81
|
+
];
|
|
82
|
+
return tsConfigBase;
|
|
83
|
+
});
|
|
84
|
+
const project = new ts_morph_1.Project({
|
|
85
|
+
tsConfigFilePath: `${(0, devkit_1.getWorkspaceLayout)(tree).appsDir}/${normalizedOptions.app}/tsconfig.app.json`,
|
|
86
|
+
});
|
|
87
|
+
const manifest = project.getSourceFileOrThrow(manifestPath);
|
|
88
|
+
manifest.addImportDeclaration({
|
|
89
|
+
moduleSpecifier: normalizedOptions.importPath,
|
|
90
|
+
defaultImport: normalizedOptions.projectCamelcase,
|
|
91
|
+
});
|
|
92
|
+
manifest.forEachDescendant(node => {
|
|
93
|
+
if (ts_morph_1.Node.isPropertyAssignment(node)) {
|
|
94
|
+
if (node.getText().indexOf("extensions") !== -1) {
|
|
95
|
+
const array = node.getFirstChildByKindOrThrow(ts_morph_1.SyntaxKind.ArrayLiteralExpression);
|
|
96
|
+
array.addElement(`${normalizedOptions.projectCamelcase}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
await manifest.save();
|
|
101
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
102
|
+
return () => {
|
|
103
|
+
(0, devkit_1.installPackagesTask)(tree, true);
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
exports.IrisAppExtensionGenerator = IrisAppExtensionGenerator;
|
|
107
|
+
const updateAppName = async (tree, options) => {
|
|
108
|
+
if (!options.app) {
|
|
109
|
+
const folders = fs
|
|
110
|
+
.readdirSync((0, devkit_1.getWorkspaceLayout)(tree).appsDir, { withFileTypes: true })
|
|
111
|
+
.filter(item => item.isDirectory());
|
|
112
|
+
const tileApps = [];
|
|
113
|
+
folders.forEach(folder => {
|
|
114
|
+
const irisAppManifest = fs
|
|
115
|
+
.readdirSync(`${(0, devkit_1.getWorkspaceLayout)(tree).appsDir}/${folder.name}`, { withFileTypes: true })
|
|
116
|
+
.find(item => item.name === "iris-app-manifest.ts");
|
|
117
|
+
if (irisAppManifest) {
|
|
118
|
+
tileApps.push(folder.name);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (tileApps.length === 1) {
|
|
122
|
+
options.app = tileApps[0];
|
|
123
|
+
}
|
|
124
|
+
else if (tileApps.length === 0) {
|
|
125
|
+
throw new Error("Please add an iris-app using: nx g @trackunit/iris-app:create ");
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const prompt = {
|
|
129
|
+
name: "app",
|
|
130
|
+
message: "Select iris-app for this extension:",
|
|
131
|
+
type: "select",
|
|
132
|
+
choices: tileApps.map(item => item),
|
|
133
|
+
};
|
|
134
|
+
await Enquirer.prompt(prompt).then((values) => {
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
136
|
+
options.app = values["app"];
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return options;
|
|
141
|
+
};
|
|
142
|
+
exports.default = exports.IrisAppExtensionGenerator;
|
|
143
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/iris-app/src/generators/extend/generator.ts"],"names":[],"mappings":";;;;AAAA,yCAUsB;AACtB,yCAAsC;AACtC,uCAA+C;AAE/C,yEAAqF;AACrF,kEAAkC;AAClC,2DAAqC;AACrC,+CAAyB;AACzB,mDAA6B;AAC7B,uCAAqD;AAYrD,SAAS,gBAAgB,CAAC,IAAU,EAAE,OAAwC;IAC5E,MAAM,IAAI,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC1C,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnG,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,IAAA,mBAAS,EAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,GAAG,QAAQ,CAAC,OAAO,IAAI,gBAAgB,EAAE,CAAC;IAC9D,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,OAAO,IAAI,gBAAgB,MAAM,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,EAAE,CAAC;IAE/D,OAAO;QACL,GAAG,OAAO;QACV,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,gBAAgB;QAChB,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC;AAEM,MAAM,yBAAyB,GAAG,KAAK,WAAW,IAAU,EAAE,aAA8C;IACjH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAEzD,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1D,MAAM,eAAe,GAAG;QACtB,GAAG,iBAAiB;QACpB,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC;QACtB,cAAc,EAAE,IAAA,uBAAc,EAAC,iBAAiB,CAAC,WAAW,CAAC;QAC7D,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,EAAE,CAAC,EAAE;QAClF,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IACzD,iBAAiB,CAAC,GACpB,yCAAyC,CAC1C,CAAC;KACH;IAED,MAAM,YAAY,GAAG,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,uBAAuB,CAAC;IACzG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAChC,MAAM,kDAAkD,YAAY,4EAA4E,CAAC;KAClJ;IACD,IAAA,sBAAa,EACX,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,oBAAoB,CAAC,EACnD,iBAAiB,CAAC,WAAW,EAC7B,eAAe,CAChB,CAAC;IAEF,IAAI,OAAO,CAAC,iBAAiB,EAAE;QAC7B,IAAA,qCAA4B,EAC1B,IAAI,EACJ,EAAE,EACF;YACE,YAAY,EAAE,QAAQ;YACtB,kBAAkB,EAAE,QAAQ;SAC7B,CACF,CAAC;KACH;IAED,MAAM,MAAM,GAAW;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,MAAM;QACtB,MAAM,EAAE,eAAM,CAAC,MAAM;QACrB,OAAO,EAAE,KAAK;QACd,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,KAAK;QACnB,gBAAgB,EAAE,IAAI;KACvB,CAAC;IACF,MAAM,IAAA,wBAAgB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAErC,IAAI,oBAAoB,KAAK,kBAAkB,EAAE;QAC/C,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;KACjH;IAED,MAAM,gBAAgB,GAAG,IAAA,sCAAyB,EAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;KACtD;IACD,IAAA,mBAAU,EAAC,IAAI,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE;QAChD,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG;YACjE,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,uBAAuB,CAAC;SAClE,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,kBAAO,CAAC;QAC1B,gBAAgB,EAAE,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,GAAG,oBAAoB;KACnG,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE5D,QAAQ,CAAC,oBAAoB,CAAC;QAC5B,eAAe,EAAE,iBAAiB,CAAC,UAAU;QAC7C,aAAa,EAAE,iBAAiB,CAAC,gBAAgB;KAClD,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;QAChC,IAAI,eAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE;YACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,qBAAU,CAAC,sBAAsB,CAAC,CAAC;gBACjF,KAAK,CAAC,UAAU,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC,CAAC;aAC3D;SACF;IACH,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEtB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,IAAA,4BAAmB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC,CAAC;AAlGW,QAAA,yBAAyB,6BAkGpC;AACF,MAAM,aAAa,GAAG,KAAK,EAAE,IAAU,EAAE,OAAwC,EAAE,EAAE;IACnF,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;QAChB,MAAM,OAAO,GAAG,EAAE;aACf,WAAW,CAAC,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACtE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACvB,MAAM,eAAe,GAAG,EAAE;iBACvB,WAAW,CAAC,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAC1F,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;YAEtD,IAAI,eAAe,EAAE;gBACnB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aAC5B;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC3B;aAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;SACnF;aAAM;YACL,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,qCAAqC;gBAC9C,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;aACpC,CAAC;YACF,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAc,EAAE,EAAE;gBACpD,2DAA2D;gBAC3D,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;SACJ;KACF;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,kBAAe,iCAAyB,CAAC","sourcesContent":["import {\n addDependenciesToPackageJson,\n formatFiles,\n generateFiles,\n getWorkspaceLayout,\n installPackagesTask,\n names,\n offsetFromRoot,\n Tree,\n updateJson,\n} from \"@nrwl/devkit\";\nimport { Linter } from \"@nrwl/linter\";\nimport { libraryGenerator } from \"@nrwl/react\";\nimport { Schema } from \"@nrwl/react/src/generators/library/schema\";\nimport { getRootTsConfigPathInTree } from \"@nrwl/workspace/src/utilities/typescript\";\nimport camelcase from \"camelcase\";\nimport * as Enquirer from \"enquirer\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { Node, Project, SyntaxKind } from \"ts-morph\";\nimport { IrisAppExtensionGeneratorSchema } from \"./schema\";\n\ninterface NormalizedSchema extends IrisAppExtensionGeneratorSchema {\n projectName: string;\n projectRoot: string;\n projectDirectory: string;\n projectCamelcase: string;\n importPath: string;\n sourceRoot: string;\n}\n\nfunction normalizeOptions(tree: Tree, options: IrisAppExtensionGeneratorSchema): NormalizedSchema {\n const name = names(options.name).fileName;\n const projectDirectory = options.directory ? `${names(options.directory).fileName}/${name}` : name;\n const projectName = projectDirectory.replace(new RegExp(\"/\", \"g\"), \"-\");\n const projectCamelcase = camelcase(name);\n const wsLayout = getWorkspaceLayout(tree);\n const projectRoot = `${wsLayout.libsDir}/${projectDirectory}`;\n const sourceRoot = `${wsLayout.libsDir}/${projectDirectory}/src`;\n const importPath = `@${wsLayout.npmScope}/${projectDirectory}`;\n\n return {\n ...options,\n projectName,\n projectRoot,\n projectDirectory,\n projectCamelcase,\n importPath,\n sourceRoot,\n };\n}\n\nexport const IrisAppExtensionGenerator = async function (tree: Tree, schemaOptions: IrisAppExtensionGeneratorSchema) {\n const options = await updateAppName(tree, schemaOptions);\n\n const normalizedOptions = normalizeOptions(tree, options);\n\n const templateOptions = {\n ...normalizedOptions,\n ...names(options.name),\n offsetFromRoot: offsetFromRoot(normalizedOptions.projectRoot),\n template: \"\",\n };\n const irisAppExtensionType = options.type;\n\n if (!fs.existsSync(`${getWorkspaceLayout(tree).appsDir}/${normalizedOptions.app}`)) {\n throw new Error(\n `The app does not exist: ${getWorkspaceLayout(tree).appsDir}/${\n normalizedOptions.app\n } make sure you enter the right app name`\n );\n }\n\n const manifestPath = `${getWorkspaceLayout(tree).appsDir}/${normalizedOptions.app}/iris-app-manifest.ts`;\n if (!fs.existsSync(manifestPath)) {\n throw `The app does not have an iris-app-manifest.ts: ${manifestPath} make sure you enter the right app name, which has an iris-app-manifest.ts`;\n }\n generateFiles(\n tree,\n path.join(__dirname, \"files\", irisAppExtensionType),\n normalizedOptions.projectRoot,\n templateOptions\n );\n\n if (options.updatePackageJson) {\n addDependenciesToPackageJson(\n tree,\n {},\n {\n \"single-spa\": \"^5.9.3\",\n \"single-spa-react\": \"^4.6.1\",\n }\n );\n }\n\n const schema: Schema = {\n name: options.name,\n style: \"none\",\n skipFormat: false,\n strict: true,\n unitTestRunner: \"jest\",\n linter: Linter.EsLint,\n routing: false,\n pascalCaseFiles: true,\n directory: options.directory,\n skipTsConfig: false,\n standaloneConfig: true,\n };\n await libraryGenerator(tree, schema);\n\n if (irisAppExtensionType !== \"REPORT_EXTENSION\") {\n generateFiles(tree, path.join(__dirname, \"files\", \"react-app\"), normalizedOptions.projectRoot, templateOptions);\n }\n\n const rootTsConfigPath = getRootTsConfigPathInTree(tree);\n if (!rootTsConfigPath) {\n throw new Error(\"Could not find root tsconfig.json\");\n }\n updateJson(tree, rootTsConfigPath, tsConfigBase => {\n tsConfigBase.compilerOptions.paths[normalizedOptions.importPath] = [\n path.join(normalizedOptions.projectRoot, \"extension-manifest.ts\"),\n ];\n return tsConfigBase;\n });\n\n const project = new Project({\n tsConfigFilePath: `${getWorkspaceLayout(tree).appsDir}/${normalizedOptions.app}/tsconfig.app.json`,\n });\n\n const manifest = project.getSourceFileOrThrow(manifestPath);\n\n manifest.addImportDeclaration({\n moduleSpecifier: normalizedOptions.importPath,\n defaultImport: normalizedOptions.projectCamelcase,\n });\n\n manifest.forEachDescendant(node => {\n if (Node.isPropertyAssignment(node)) {\n if (node.getText().indexOf(\"extensions\") !== -1) {\n const array = node.getFirstChildByKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n array.addElement(`${normalizedOptions.projectCamelcase}`);\n }\n }\n });\n await manifest.save();\n\n await formatFiles(tree);\n return () => {\n installPackagesTask(tree, true);\n };\n};\nconst updateAppName = async (tree: Tree, options: IrisAppExtensionGeneratorSchema) => {\n if (!options.app) {\n const folders = fs\n .readdirSync(getWorkspaceLayout(tree).appsDir, { withFileTypes: true })\n .filter(item => item.isDirectory());\n\n const tileApps: string[] = [];\n\n folders.forEach(folder => {\n const irisAppManifest = fs\n .readdirSync(`${getWorkspaceLayout(tree).appsDir}/${folder.name}`, { withFileTypes: true })\n .find(item => item.name === \"iris-app-manifest.ts\");\n\n if (irisAppManifest) {\n tileApps.push(folder.name);\n }\n });\n\n if (tileApps.length === 1) {\n options.app = tileApps[0];\n } else if (tileApps.length === 0) {\n throw new Error(\"Please add an iris-app using: nx g @trackunit/iris-app:create \");\n } else {\n const prompt = {\n name: \"app\",\n message: \"Select iris-app for this extension:\",\n type: \"select\",\n choices: tileApps.map(item => item),\n };\n await Enquirer.prompt(prompt).then((values: object) => {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n options.app = values[\"app\"];\n });\n }\n }\n return options;\n};\n\nexport default IrisAppExtensionGenerator;\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/schema",
|
|
3
|
+
"cli": "nx",
|
|
4
|
+
"$id": "ExtensionTile",
|
|
5
|
+
"title": "",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"name": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "",
|
|
11
|
+
"$default": {
|
|
12
|
+
"$source": "argv",
|
|
13
|
+
"index": 0
|
|
14
|
+
},
|
|
15
|
+
"x-prompt": "What name would you like to use for this app-extension?"
|
|
16
|
+
},
|
|
17
|
+
"directory": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "A directory where the library is placed",
|
|
20
|
+
"alias": "d",
|
|
21
|
+
"$default": {
|
|
22
|
+
"$source": "argv",
|
|
23
|
+
"index": 1
|
|
24
|
+
},
|
|
25
|
+
"x-prompt": "What subdir would you like to use for this app-extension?"
|
|
26
|
+
},
|
|
27
|
+
"app": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "The app to link this app-extension to",
|
|
30
|
+
"alias": "a",
|
|
31
|
+
"$default": {
|
|
32
|
+
"$source": "argv",
|
|
33
|
+
"index": 2
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"updatePackageJson": {
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"description": "If the package.json should be updated with required dependencies",
|
|
39
|
+
"alias": "u",
|
|
40
|
+
"default": true
|
|
41
|
+
},
|
|
42
|
+
"type": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"description": "The type of this extension: ['REPORT_EXTENSION', 'ADMIN_EXTENSION', 'FLEET_EXTENSION', 'ASSET_HOME_EXTENSION']",
|
|
45
|
+
"x-prompt": {
|
|
46
|
+
"message": "Which Iris App extension should be generated?",
|
|
47
|
+
"type": "list",
|
|
48
|
+
"multiselect": false,
|
|
49
|
+
"items": ["REPORT_EXTENSION", "FLEET_EXTENSION", "ADMIN_EXTENSION", "ASSET_HOME_EXTENSION"]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"required": ["name", "directory", "type"]
|
|
54
|
+
}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IrisAppGenerator } from "./generators/create/generator";
|
|
2
|
+
export { IrisAppGeneratorSchema } from "./generators/create/schema";
|
|
3
|
+
export { IrisAppExtensionGenerator } from "./generators/extend/generator";
|
|
4
|
+
export { IrisAppExtensionGeneratorSchema } from "./generators/extend/schema";
|
package/src/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IrisAppExtensionGenerator = exports.IrisAppGenerator = void 0;
|
|
4
|
+
var generator_1 = require("./generators/create/generator");
|
|
5
|
+
Object.defineProperty(exports, "IrisAppGenerator", { enumerable: true, get: function () { return generator_1.IrisAppGenerator; } });
|
|
6
|
+
var generator_2 = require("./generators/extend/generator");
|
|
7
|
+
Object.defineProperty(exports, "IrisAppExtensionGenerator", { enumerable: true, get: function () { return generator_2.IrisAppExtensionGenerator; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app/src/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiE;AAAxD,6GAAA,gBAAgB,OAAA;AAEzB,2DAA0E;AAAjE,sHAAA,yBAAyB,OAAA","sourcesContent":["export { IrisAppGenerator } from \"./generators/create/generator\";\nexport { IrisAppGeneratorSchema } from \"./generators/create/schema\";\nexport { IrisAppExtensionGenerator } from \"./generators/extend/generator\";\nexport { IrisAppExtensionGeneratorSchema } from \"./generators/extend/schema\";\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addDependency = exports.addDevDependency = void 0;
|
|
4
|
+
const devkit_1 = require("@nrwl/devkit");
|
|
5
|
+
function addDevDependency(host, packageName, version = "*") {
|
|
6
|
+
const packageJsonPath = "package.json";
|
|
7
|
+
const currentPackageJson = (0, devkit_1.readJson)(host, packageJsonPath);
|
|
8
|
+
const isPackageInstalled = currentPackageJson.devDependencies?.[packageName] !== undefined;
|
|
9
|
+
if (isPackageInstalled) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const modifiedPackageJson = {
|
|
13
|
+
...currentPackageJson,
|
|
14
|
+
devDependencies: {
|
|
15
|
+
...currentPackageJson.devDependencies,
|
|
16
|
+
[packageName]: version,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
host.write(packageJsonPath, JSON.stringify(modifiedPackageJson, null, 2));
|
|
20
|
+
}
|
|
21
|
+
exports.addDevDependency = addDevDependency;
|
|
22
|
+
function addDependency(host, packageName, version = "*") {
|
|
23
|
+
const packageJsonPath = "package.json";
|
|
24
|
+
const currentPackageJson = (0, devkit_1.readJson)(host, packageJsonPath);
|
|
25
|
+
const isPackageInstalled = currentPackageJson.dependencies?.[packageName] !== undefined;
|
|
26
|
+
if (isPackageInstalled) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const modifiedPackageJson = {
|
|
30
|
+
...currentPackageJson,
|
|
31
|
+
dependencies: {
|
|
32
|
+
...currentPackageJson.dependencies,
|
|
33
|
+
[packageName]: version,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
host.write(packageJsonPath, JSON.stringify(modifiedPackageJson, null, 2));
|
|
37
|
+
}
|
|
38
|
+
exports.addDependency = addDependency;
|
|
39
|
+
//# sourceMappingURL=addDevDependency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addDevDependency.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app/src/utils/addDevDependency.ts"],"names":[],"mappings":";;;AAAA,yCAA+C;AAE/C,SAAgB,gBAAgB,CAAC,IAAU,EAAE,WAAmB,EAAE,OAAO,GAAG,GAAG;IAC7E,MAAM,eAAe,GAAG,cAAc,CAAC;IACvC,MAAM,kBAAkB,GAAG,IAAA,iBAAQ,EAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC;IAE3F,IAAI,kBAAkB,EAAE;QACtB,OAAO;KACR;IAED,MAAM,mBAAmB,GAAG;QAC1B,GAAG,kBAAkB;QACrB,eAAe,EAAE;YACf,GAAG,kBAAkB,CAAC,eAAe;YACrC,CAAC,WAAW,CAAC,EAAE,OAAO;SACvB;KACF,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAlBD,4CAkBC;AAED,SAAgB,aAAa,CAAC,IAAU,EAAE,WAAmB,EAAE,OAAO,GAAG,GAAG;IAC1E,MAAM,eAAe,GAAG,cAAc,CAAC;IACvC,MAAM,kBAAkB,GAAG,IAAA,iBAAQ,EAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC;IAExF,IAAI,kBAAkB,EAAE;QACtB,OAAO;KACR;IAED,MAAM,mBAAmB,GAAG;QAC1B,GAAG,kBAAkB;QACrB,YAAY,EAAE;YACZ,GAAG,kBAAkB,CAAC,YAAY;YAClC,CAAC,WAAW,CAAC,EAAE,OAAO;SACvB;KACF,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAlBD,sCAkBC","sourcesContent":["import { readJson, Tree } from \"@nrwl/devkit\";\n\nexport function addDevDependency(host: Tree, packageName: string, version = \"*\") {\n const packageJsonPath = \"package.json\";\n const currentPackageJson = readJson(host, packageJsonPath);\n const isPackageInstalled = currentPackageJson.devDependencies?.[packageName] !== undefined;\n\n if (isPackageInstalled) {\n return;\n }\n\n const modifiedPackageJson = {\n ...currentPackageJson,\n devDependencies: {\n ...currentPackageJson.devDependencies,\n [packageName]: version,\n },\n };\n \n host.write(packageJsonPath, JSON.stringify(modifiedPackageJson, null, 2));\n}\n\nexport function addDependency(host: Tree, packageName: string, version = \"*\") {\n const packageJsonPath = \"package.json\";\n const currentPackageJson = readJson(host, packageJsonPath);\n const isPackageInstalled = currentPackageJson.dependencies?.[packageName] !== undefined;\n\n if (isPackageInstalled) {\n return;\n }\n\n const modifiedPackageJson = {\n ...currentPackageJson,\n dependencies: {\n ...currentPackageJson.dependencies,\n [packageName]: version,\n },\n };\n\n host.write(packageJsonPath, JSON.stringify(modifiedPackageJson, null, 2));\n}\n"]}
|