@clipboard-health/nx-plugin 0.3.0 → 0.3.4

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/README.md CHANGED
@@ -7,8 +7,6 @@ Clipboard Health's Nx plugin contains generators to manage libraries within an N
7
7
  - [Table of Contents](#table-of-contents)
8
8
  - [Install](#install)
9
9
  - [Usage](#usage)
10
- - [Adding new libraries](#adding-new-libraries)
11
- - [Porting existing libraries](#porting-existing-libraries)
12
10
 
13
11
  ## Install
14
12
 
@@ -18,12 +16,10 @@ npm install @clipboard-health/nx-plugin
18
16
 
19
17
  ## Usage
20
18
 
21
- ### Adding new libraries
22
-
23
- Libraries version and publish separately. We use [Nx Local Generators](https://nx.dev/recipes/generators/local-generators) to generate library stubs that successfully build, lint, and test. The `--publishable` flag sets up semantic versioning from commit messages, GitHub Release creation, and NPM publishing on merges to `main` (but only if the code within your library package changed, thanks to Nx's dependency graph).
19
+ Libraries version and publish separately. We use [Nx Local Generators](https://nx.dev/recipes/generators/local-generators) to generate library stubs that successfully build, lint, and test. The `--publishConfigPublicAccess` flag publishes the NPM package publicly.
24
20
 
25
21
  ```bash
26
- # Optionally, include the --publishable flag to publish to NPM.
22
+ # Optionally, include the --publishConfigPublicAccess flag.
27
23
  npx nx generate @clipboard-health/nx-plugin:node-lib [PROJECT_NAME]
28
24
 
29
25
  # Change your mind? Remove it just as easily...
@@ -34,6 +30,4 @@ npx nx generate @nx/workspace:remove --projectName [PROJECT_NAME]
34
30
  npx nx generate @nx/workspace:move --projectName [PROJECT_NAME] --destination [NEW_PROJECT_NAME]
35
31
  ```
36
32
 
37
- ### Porting existing libraries
38
-
39
- Follow [Adding new libraries](#adding-new-libraries) to generate a new package and copy the code from the existing library into it.
33
+ To porting an existing library, follow the above to generate a new package and copy the code from the existing library into it.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@clipboard-health/nx-plugin",
3
3
  "description": "Clipboard Health's Nx plugin contains generators to manage applications within an Nx workspace.",
4
- "version": "0.3.0",
4
+ "version": "0.3.4",
5
5
  "bugs": "https://github.com/clipboardhealth/core-utils/issues",
6
6
  "dependencies": {
7
7
  "@nx/devkit": "19.5.6",
@@ -28,5 +28,6 @@
28
28
  "directory": "packages/nx-plugin"
29
29
  },
30
30
  "type": "commonjs",
31
- "typings": "./src/index.d.ts"
31
+ "typings": "./src/index.d.ts",
32
+ "types": "./src/index.d.ts"
32
33
  }
@@ -10,7 +10,7 @@
10
10
  "license": "MIT",
11
11
  "main": "./src/index.js",
12
12
  "publishConfig": {
13
- "access": "public"
13
+ "access": "<%= publishConfigAccess %>"
14
14
  },
15
15
  "repository": {
16
16
  "type": "git",
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./lib/rename-me"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/nx-plugin/src/generators/node-lib/files/src/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC"}
@@ -0,0 +1 @@
1
+ export declare function deleteMe(): string;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteMe = deleteMe;
4
+ function deleteMe() {
5
+ return "hello";
6
+ }
7
+ //# sourceMappingURL=rename-me.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-me.js","sourceRoot":"","sources":["../../../../../../../../../packages/nx-plugin/src/generators/node-lib/files/src/lib/rename-me.ts"],"names":[],"mappings":";;AAAA,4BAEC;AAFD,SAAgB,QAAQ;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Tree } from "@nx/devkit";
2
+ import type { NxPluginGeneratorSchema } from "./schema";
3
+ export default function generate(tree: Tree, options: NxPluginGeneratorSchema): Promise<void>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = generate;
4
+ const node_path_1 = require("node:path");
5
+ const devkit_1 = require("@nx/devkit");
6
+ const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
7
+ const ROOT_TS_CONFIG = "tsconfig.base.json";
8
+ function normalizeOptions(tree, options) {
9
+ const name = (0, devkit_1.names)(options.name).fileName;
10
+ const projectDirectory = name;
11
+ return {
12
+ ...options,
13
+ publishConfigAccess: options.publishPublicly ? "public" : "restricted",
14
+ importPath: (0, get_import_path_1.getImportPath)(tree, projectDirectory),
15
+ projectName: name.replaceAll("/", "-"),
16
+ projectRoot: `${(0, devkit_1.getWorkspaceLayout)(tree).libsDir}/${name}`,
17
+ projectDirectory,
18
+ };
19
+ }
20
+ function getRelativePathToRootTsConfig(targetPath) {
21
+ return `${(0, devkit_1.offsetFromRoot)(targetPath)}${ROOT_TS_CONFIG}`;
22
+ }
23
+ function addFiles(tree, options) {
24
+ (0, devkit_1.generateFiles)(tree, (0, node_path_1.join)(__dirname, "files"), options.projectRoot, {
25
+ ...options,
26
+ ...(0, devkit_1.names)(options.name),
27
+ offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.projectRoot),
28
+ rootTsConfigPath: getRelativePathToRootTsConfig(options.projectRoot),
29
+ template: "",
30
+ });
31
+ }
32
+ function updateRootTsConfig(host, options) {
33
+ (0, devkit_1.updateJson)(host, ROOT_TS_CONFIG, (json) => {
34
+ const c = json.compilerOptions;
35
+ c.paths ||= {};
36
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
37
+ delete c.paths[options.name];
38
+ /* istanbul ignore next */
39
+ if (c.paths[options.importPath]) {
40
+ throw new Error(`There is already a library with import path "${options.importPath}".`);
41
+ }
42
+ c.paths[options.importPath] = [(0, devkit_1.joinPathFragments)(options.projectRoot, "./src", "index.ts")];
43
+ return json;
44
+ });
45
+ }
46
+ async function generate(tree, options) {
47
+ const normalizedOptions = normalizeOptions(tree, options);
48
+ addFiles(tree, normalizedOptions);
49
+ updateRootTsConfig(tree, normalizedOptions);
50
+ await (0, devkit_1.formatFiles)(tree);
51
+ }
52
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../packages/nx-plugin/src/generators/node-lib/generator.ts"],"names":[],"mappings":";;AAkFA,2BAKC;AAvFD,yCAAiC;AAEjC,uCASoB;AACpB,sEAAiE;AAIjE,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAU5C,SAAS,gBAAgB,CAAC,IAAU,EAAE,OAAgC;IACpE,MAAM,IAAI,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC9B,OAAO;QACL,GAAG,OAAO;QACV,mBAAmB,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;QACtE,UAAU,EAAE,IAAA,+BAAa,EAAC,IAAI,EAAE,gBAAgB,CAAC;QACjD,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;QACtC,WAAW,EAAE,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE;QAC1D,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,UAAkB;IACvD,OAAO,GAAG,IAAA,uBAAc,EAAC,UAAU,CAAC,GAAG,cAAc,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,OAAyB;IACrD,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAA,gBAAI,EAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,EAAE;QACjE,GAAG,OAAO;QACV,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC;QACtB,cAAc,EAAE,IAAA,uBAAc,EAAC,OAAO,CAAC,WAAW,CAAC;QACnD,gBAAgB,EAAE,6BAA6B,CAAC,OAAO,CAAC,WAAW,CAAC;QACpE,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAU,EACV,OAIC;IAED,IAAA,mBAAU,EACR,IAAI,EACJ,cAAc,EACd,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QAC/B,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACf,gEAAgE;QAChE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7B,0BAA0B;QAC1B,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1F,CAAC;QAED,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAA,0BAAiB,EAAC,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAE5F,OAAO,IAAI,CAAC;IACd,CAAC,CACF,CAAC;AACJ,CAAC;AAEc,KAAK,UAAU,QAAQ,CAAC,IAAU,EAAE,OAAgC;IACjF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAClC,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC5C,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export interface NxPluginGeneratorSchema {
2
2
  name: string;
3
- publishable?: boolean;
3
+ publishPublicly?: boolean;
4
4
  }
@@ -14,10 +14,10 @@
14
14
  "x-prompt": "Library name?",
15
15
  "pattern": "(?:^@[a-zA-Z0-9-*~][a-zA-Z0-9-*._~]*\\/[a-zA-Z0-9-~][a-zA-Z0-9-._~]*|^[a-zA-Z][^:]*)$"
16
16
  },
17
- "publishable": {
17
+ "publishPublicly": {
18
18
  "type": "boolean",
19
19
  "default": false,
20
- "description": "Create a publishable library.",
20
+ "description": "Publish the NPM package publicly.",
21
21
  "x-priority": "important"
22
22
  }
23
23
  },
package/src/index.d.ts ADDED
File without changes
@@ -1 +1,3 @@
1
+ "use strict";
1
2
  // eslint-disable-next-line unicorn/no-empty-file
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/nx-plugin/src/index.ts"],"names":[],"mappings":";AAAA,iDAAiD"}
package/.eslintrc.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "extends": ["../../.eslintrc.json"],
3
- "ignorePatterns": ["!**/*"],
4
- "parserOptions": {
5
- "project": "tsconfig.lint.json",
6
- "tsconfigRootDir": "packages/nx-plugin"
7
- }
8
- }
package/jest.config.ts DELETED
@@ -1,19 +0,0 @@
1
- export default {
2
- coverageDirectory: "../../coverage/packages/nx-plugin",
3
- coveragePathIgnorePatterns: [],
4
- coverageThreshold: {
5
- global: {
6
- branches: 100,
7
- functions: 100,
8
- lines: 100,
9
- statements: 100,
10
- },
11
- },
12
- displayName: "nx-plugin",
13
- moduleFileExtensions: ["ts", "js"],
14
- preset: "../../jest.preset.js",
15
- testEnvironment: "node",
16
- transform: {
17
- "^.+\\.[tj]s$": ["ts-jest", { tsconfig: "<rootDir>/tsconfig.spec.json" }],
18
- },
19
- };
package/project.json DELETED
@@ -1,50 +0,0 @@
1
- {
2
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
3
- "name": "nx-plugin",
4
- "projectType": "library",
5
- "sourceRoot": "packages/nx-plugin/src",
6
- "tags": [],
7
- "targets": {
8
- "build": {
9
- "executor": "@nx/js:tsc",
10
- "options": {
11
- "assets": [
12
- "packages/nx-plugin/*.md",
13
- {
14
- "input": "./packages/nx-plugin/src",
15
- "glob": "**/!(*.ts)",
16
- "output": "./src"
17
- },
18
- {
19
- "input": "./packages/nx-plugin/src",
20
- "glob": "**/*.d.ts",
21
- "output": "./src"
22
- },
23
- {
24
- "input": "./packages/nx-plugin",
25
- "glob": "generators.json",
26
- "output": "."
27
- }
28
- ],
29
- "main": "packages/nx-plugin/src/index.ts",
30
- "outputPath": "dist/packages/nx-plugin",
31
- "tsConfig": "packages/nx-plugin/tsconfig.lib.json"
32
- },
33
- "outputs": ["{options.outputPath}"]
34
- },
35
- "lint": {
36
- "executor": "@nx/eslint:lint",
37
- "options": {
38
- "maxWarnings": 0
39
- }
40
- },
41
- "test": {
42
- "executor": "@nx/jest:jest",
43
- "options": {
44
- "jestConfig": "packages/nx-plugin/jest.config.ts",
45
- "passWithNoTests": false
46
- },
47
- "outputs": ["{workspaceRoot}/coverage/{projectRoot}"]
48
- }
49
- }
50
- }
@@ -1,7 +0,0 @@
1
- import { deleteMe } from "./rename-me";
2
-
3
- describe("deleteMe", () => {
4
- it("works", () => {
5
- expect(deleteMe()).toBe("hello");
6
- });
7
- });
@@ -1,3 +0,0 @@
1
- export function deleteMe(): string {
2
- return "hello";
3
- }
@@ -1,19 +0,0 @@
1
- import { readProjectConfiguration, type Tree } from "@nx/devkit";
2
- import { createTreeWithEmptyWorkspace } from "@nx/devkit/testing";
3
-
4
- import generator from "./generator";
5
-
6
- describe("generator", () => {
7
- let appTree: Tree;
8
-
9
- beforeEach(() => {
10
- appTree = createTreeWithEmptyWorkspace({ layout: "apps-libs" });
11
- });
12
-
13
- it("runs successfully", async () => {
14
- const name = "test";
15
- await generator(appTree, { name });
16
- const config = readProjectConfiguration(appTree, name);
17
- expect(config).toBeDefined();
18
- });
19
- });
@@ -1,87 +0,0 @@
1
- import { join } from "node:path";
2
-
3
- import {
4
- formatFiles,
5
- generateFiles,
6
- getWorkspaceLayout,
7
- joinPathFragments,
8
- names,
9
- offsetFromRoot,
10
- type Tree,
11
- updateJson,
12
- } from "@nx/devkit";
13
- import { getImportPath } from "@nx/js/src/utils/get-import-path";
14
-
15
- import type { NxPluginGeneratorSchema } from "./schema";
16
-
17
- const ROOT_TS_CONFIG = "tsconfig.base.json";
18
-
19
- type NormalizedSchema = NxPluginGeneratorSchema & {
20
- importPath: string;
21
- projectName: string;
22
- projectRoot: string;
23
- projectDirectory: string;
24
- };
25
-
26
- function normalizeOptions(tree: Tree, options: NxPluginGeneratorSchema): NormalizedSchema {
27
- const name = names(options.name).fileName;
28
- const projectDirectory = name;
29
- return {
30
- ...options,
31
- publishable: options.publishable ?? false,
32
- importPath: getImportPath(tree, projectDirectory),
33
- projectName: name.replaceAll("/", "-"),
34
- projectRoot: `${getWorkspaceLayout(tree).libsDir}/${name}`,
35
- projectDirectory,
36
- };
37
- }
38
-
39
- function getRelativePathToRootTsConfig(targetPath: string): string {
40
- return `${offsetFromRoot(targetPath)}${ROOT_TS_CONFIG}`;
41
- }
42
-
43
- function addFiles(tree: Tree, options: NormalizedSchema) {
44
- generateFiles(tree, join(__dirname, "files"), options.projectRoot, {
45
- ...options,
46
- ...names(options.name),
47
- offsetFromRoot: offsetFromRoot(options.projectRoot),
48
- rootTsConfigPath: getRelativePathToRootTsConfig(options.projectRoot),
49
- template: "",
50
- });
51
- }
52
-
53
- function updateRootTsConfig(
54
- host: Tree,
55
- options: {
56
- name: string;
57
- importPath: string;
58
- projectRoot: string;
59
- },
60
- ) {
61
- updateJson<{ compilerOptions: { paths: Record<string, string[]> } }>(
62
- host,
63
- ROOT_TS_CONFIG,
64
- (json) => {
65
- const c = json.compilerOptions;
66
- c.paths ||= {};
67
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
68
- delete c.paths[options.name];
69
-
70
- /* istanbul ignore next */
71
- if (c.paths[options.importPath]) {
72
- throw new Error(`There is already a library with import path "${options.importPath}".`);
73
- }
74
-
75
- c.paths[options.importPath] = [joinPathFragments(options.projectRoot, "./src", "index.ts")];
76
-
77
- return json;
78
- },
79
- );
80
- }
81
-
82
- export default async function generate(tree: Tree, options: NxPluginGeneratorSchema) {
83
- const normalizedOptions = normalizeOptions(tree, options);
84
- addFiles(tree, normalizedOptions);
85
- updateRootTsConfig(tree, normalizedOptions);
86
- await formatFiles(tree);
87
- }
package/tsconfig.json DELETED
@@ -1,19 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "outDir": "../../dist/out-tsc"
5
- },
6
- "files": [],
7
- "include": [],
8
- "references": [
9
- {
10
- "path": "./tsconfig.lib.json"
11
- },
12
- {
13
- "path": "./tsconfig.lint.json"
14
- },
15
- {
16
- "path": "./tsconfig.spec.json"
17
- }
18
- ]
19
- }
package/tsconfig.lib.json DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "declaration": true,
5
- "types": ["node"]
6
- },
7
- "include": ["src/**/*.ts"],
8
- "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
9
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "types": ["jest", "node"]
5
- },
6
- "include": ["."]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "types": ["jest", "node"]
5
- },
6
- "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
7
- }
package/typedoc.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "extends": ["../../typedoc.base.json"],
3
- "entryPoints": ["src/index.ts"]
4
- }