@nx/remix 0.0.0-pr-22179-271588f
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/LICENSE +22 -0
- package/README.md +63 -0
- package/executors.json +14 -0
- package/generators.d.ts +14 -0
- package/generators.js +31 -0
- package/generators.json +90 -0
- package/index.d.ts +1 -0
- package/index.js +5 -0
- package/migrations.json +107 -0
- package/package.json +53 -0
- package/plugin.d.ts +1 -0
- package/plugin.js +6 -0
- package/plugins/component-testing/index.d.ts +30 -0
- package/plugins/component-testing/index.js +64 -0
- package/src/executors/build/build.impl.d.ts +5 -0
- package/src/executors/build/build.impl.js +109 -0
- package/src/executors/build/schema.d.ts +7 -0
- package/src/executors/build/schema.json +38 -0
- package/src/executors/serve/schema.d.ts +9 -0
- package/src/executors/serve/schema.json +41 -0
- package/src/executors/serve/serve.impl.d.ts +6 -0
- package/src/executors/serve/serve.impl.js +77 -0
- package/src/generators/action/action.impl.d.ts +3 -0
- package/src/generators/action/action.impl.js +39 -0
- package/src/generators/action/schema.d.ts +10 -0
- package/src/generators/action/schema.json +29 -0
- package/src/generators/application/__snapshots__/application.impl.spec.ts.snap +1487 -0
- package/src/generators/application/application.impl.d.ts +5 -0
- package/src/generators/application/application.impl.js +198 -0
- package/src/generators/application/files/common/README.md__tmpl__ +54 -0
- package/src/generators/application/files/common/app/nx-welcome.tsx__tmpl__ +886 -0
- package/src/generators/application/files/common/app/root.tsx__tmpl__ +32 -0
- package/src/generators/application/files/common/app/routes/_index.tsx__tmpl__ +9 -0
- package/src/generators/application/files/common/public/favicon.ico +0 -0
- package/src/generators/application/files/common/remix.config.js__tmpl__ +17 -0
- package/src/generators/application/files/common/remix.env.d.ts__tmpl__ +2 -0
- package/src/generators/application/files/common/tests/routes/_index.spec.tsx__tmpl__ +16 -0
- package/src/generators/application/files/common/tsconfig.app.json__tmpl__ +20 -0
- package/src/generators/application/files/common/tsconfig.json__tmpl__ +24 -0
- package/src/generators/application/files/integrated/.gitignore__tmpl__ +4 -0
- package/src/generators/application/files/integrated/package.json__tmpl__ +28 -0
- package/src/generators/application/lib/add-e2e.d.ts +3 -0
- package/src/generators/application/lib/add-e2e.js +66 -0
- package/src/generators/application/lib/index.d.ts +3 -0
- package/src/generators/application/lib/index.js +6 -0
- package/src/generators/application/lib/normalize-options.d.ts +10 -0
- package/src/generators/application/lib/normalize-options.js +37 -0
- package/src/generators/application/lib/update-unit-test-config.d.ts +2 -0
- package/src/generators/application/lib/update-unit-test-config.js +55 -0
- package/src/generators/application/schema.d.ts +16 -0
- package/src/generators/application/schema.json +68 -0
- package/src/generators/cypress-component-configuration/cypress-component-configuration.impl.d.ts +5 -0
- package/src/generators/cypress-component-configuration/cypress-component-configuration.impl.js +34 -0
- package/src/generators/cypress-component-configuration/files/cypress.config.ts__tmpl__ +6 -0
- package/src/generators/cypress-component-configuration/schema.d.ts +6 -0
- package/src/generators/cypress-component-configuration/schema.json +41 -0
- package/src/generators/error-boundary/__snapshots__/error-boundary.impl.spec.ts.snap +61 -0
- package/src/generators/error-boundary/error-boundary.impl.d.ts +3 -0
- package/src/generators/error-boundary/error-boundary.impl.js +12 -0
- package/src/generators/error-boundary/lib/add-v2-error-boundary.d.ts +3 -0
- package/src/generators/error-boundary/lib/add-v2-error-boundary.js +38 -0
- package/src/generators/error-boundary/lib/index.d.ts +2 -0
- package/src/generators/error-boundary/lib/index.js +5 -0
- package/src/generators/error-boundary/lib/normalize-options.d.ts +3 -0
- package/src/generators/error-boundary/lib/normalize-options.js +17 -0
- package/src/generators/error-boundary/schema.d.ts +11 -0
- package/src/generators/error-boundary/schema.json +37 -0
- package/src/generators/init/init.d.ts +5 -0
- package/src/generators/init/init.js +60 -0
- package/src/generators/init/schema.d.ts +7 -0
- package/src/generators/init/schema.json +33 -0
- package/src/generators/library/__snapshots__/library.impl.spec.ts.snap +157 -0
- package/src/generators/library/lib/add-tsconfig-entry-points.d.ts +3 -0
- package/src/generators/library/lib/add-tsconfig-entry-points.js +19 -0
- package/src/generators/library/lib/add-unit-testing.d.ts +3 -0
- package/src/generators/library/lib/add-unit-testing.js +32 -0
- package/src/generators/library/lib/index.d.ts +4 -0
- package/src/generators/library/lib/index.js +7 -0
- package/src/generators/library/lib/normalize-options.d.ts +7 -0
- package/src/generators/library/lib/normalize-options.js +29 -0
- package/src/generators/library/lib/update-buildable-config.d.ts +2 -0
- package/src/generators/library/lib/update-buildable-config.js +21 -0
- package/src/generators/library/library.impl.d.ts +6 -0
- package/src/generators/library/library.impl.js +45 -0
- package/src/generators/library/schema.d.ts +16 -0
- package/src/generators/library/schema.json +74 -0
- package/src/generators/loader/loader.impl.d.ts +3 -0
- package/src/generators/loader/loader.impl.js +39 -0
- package/src/generators/loader/schema.d.ts +10 -0
- package/src/generators/loader/schema.json +29 -0
- package/src/generators/meta/lib/v2.impl.d.ts +3 -0
- package/src/generators/meta/lib/v2.impl.js +28 -0
- package/src/generators/meta/meta.impl.d.ts +3 -0
- package/src/generators/meta/meta.impl.js +7 -0
- package/src/generators/meta/schema.d.ts +10 -0
- package/src/generators/meta/schema.json +29 -0
- package/src/generators/preset/lib/normalize-options.d.ts +11 -0
- package/src/generators/preset/lib/normalize-options.js +20 -0
- package/src/generators/preset/preset.impl.d.ts +3 -0
- package/src/generators/preset/preset.impl.js +32 -0
- package/src/generators/preset/schema.d.ts +4 -0
- package/src/generators/preset/schema.json +14 -0
- package/src/generators/resource-route/__snapshots__/resource-route.impl.spec.ts.snap +21 -0
- package/src/generators/resource-route/resource-route.impl.d.ts +3 -0
- package/src/generators/resource-route/resource-route.impl.js +41 -0
- package/src/generators/resource-route/schema.d.ts +13 -0
- package/src/generators/resource-route/schema.json +51 -0
- package/src/generators/route/__snapshots__/route.impl.spec.ts.snap +95 -0
- package/src/generators/route/route.impl.d.ts +3 -0
- package/src/generators/route/route.impl.js +78 -0
- package/src/generators/route/schema.d.ts +15 -0
- package/src/generators/route/schema.json +62 -0
- package/src/generators/setup/schema.json +14 -0
- package/src/generators/setup/setup.impl.d.ts +2 -0
- package/src/generators/setup/setup.impl.js +34 -0
- package/src/generators/setup-tailwind/__snapshots__/setup-tailwind.impl.spec.ts.snap +170 -0
- package/src/generators/setup-tailwind/files/app/tailwind.css__tpl__ +3 -0
- package/src/generators/setup-tailwind/files/tailwind.config.ts__tpl__ +13 -0
- package/src/generators/setup-tailwind/lib/index.d.ts +1 -0
- package/src/generators/setup-tailwind/lib/index.js +4 -0
- package/src/generators/setup-tailwind/lib/update-remix-config.d.ts +2 -0
- package/src/generators/setup-tailwind/lib/update-remix-config.js +35 -0
- package/src/generators/setup-tailwind/schema.d.ts +5 -0
- package/src/generators/setup-tailwind/schema.json +36 -0
- package/src/generators/setup-tailwind/setup-tailwind.impl.d.ts +3 -0
- package/src/generators/setup-tailwind/setup-tailwind.impl.js +34 -0
- package/src/generators/storybook-configuration/__snapshots__/storybook-configuration.impl.spec.ts.snap +73 -0
- package/src/generators/storybook-configuration/files/vite.config.ts__tpl__ +15 -0
- package/src/generators/storybook-configuration/schema.d.ts +16 -0
- package/src/generators/storybook-configuration/schema.json +89 -0
- package/src/generators/storybook-configuration/storybook-configuration.impl.d.ts +4 -0
- package/src/generators/storybook-configuration/storybook-configuration.impl.js +26 -0
- package/src/generators/style/schema.d.ts +10 -0
- package/src/generators/style/schema.json +36 -0
- package/src/generators/style/style.impl.d.ts +3 -0
- package/src/generators/style/style.impl.js +61 -0
- package/src/generators/utils/update-dependencies.d.ts +2 -0
- package/src/generators/utils/update-dependencies.js +21 -0
- package/src/plugins/__snapshots__/plugin.spec.ts.snap +113 -0
- package/src/plugins/plugin.d.ts +9 -0
- package/src/plugins/plugin.js +136 -0
- package/src/utils/create-watch-paths.d.ts +8 -0
- package/src/utils/create-watch-paths.js +40 -0
- package/src/utils/get-default-export-name.d.ts +2 -0
- package/src/utils/get-default-export-name.js +8 -0
- package/src/utils/get-default-export.d.ts +2 -0
- package/src/utils/get-default-export.js +15 -0
- package/src/utils/insert-import.d.ts +4 -0
- package/src/utils/insert-import.js +54 -0
- package/src/utils/insert-statement-after-imports.d.ts +5 -0
- package/src/utils/insert-statement-after-imports.js +28 -0
- package/src/utils/insert-statement-in-default-function.d.ts +2 -0
- package/src/utils/insert-statement-in-default-function.js +23 -0
- package/src/utils/remix-config.d.ts +5 -0
- package/src/utils/remix-config.js +45 -0
- package/src/utils/remix-route-utils.d.ts +13 -0
- package/src/utils/remix-route-utils.js +70 -0
- package/src/utils/testing-config-utils.d.ts +4 -0
- package/src/utils/testing-config-utils.js +79 -0
- package/src/utils/upsert-links-function.d.ts +2 -0
- package/src/utils/upsert-links-function.js +31 -0
- package/src/utils/versions.d.ts +16 -0
- package/src/utils/versions.js +28 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
(The MIT License)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2017-2023 Narwhal Technologies Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
'Software'), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<p style="text-align: center;"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx.png" width="600" alt="Nx - Smart Monorepos · Fast CI"></p>
|
|
2
|
+
|
|
3
|
+
<div style="text-align: center;">
|
|
4
|
+
|
|
5
|
+
[](https://circleci.com/gh/nrwl/nx)
|
|
6
|
+
[]()
|
|
7
|
+
[](https://www.npmjs.com/@nx/workspace)
|
|
8
|
+
[]()
|
|
9
|
+
[](http://commitizen.github.io/cz-cli/)
|
|
10
|
+
[](https://gitter.im/nrwl-nx/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
11
|
+
[](https://go.nx.dev/community)
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
<hr>
|
|
17
|
+
|
|
18
|
+
# Nx: Smart Monorepos · Fast CI
|
|
19
|
+
|
|
20
|
+
Nx is a build system with built-in tooling and advanced CI capabilities. It helps you maintain and scale monorepos, both locally and on CI.
|
|
21
|
+
|
|
22
|
+
This package is a [Remix plugin for Nx](https://nx.dev/packages/remix).
|
|
23
|
+
|
|
24
|
+
## Getting Started
|
|
25
|
+
|
|
26
|
+
### Creating an Nx Workspace
|
|
27
|
+
|
|
28
|
+
**Using `npx`**
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npx create-nx-workspace
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Using `npm init`**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm init nx-workspace
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Using `yarn create`**
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
yarn create nx-workspace
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Adding Nx to an Existing Repository
|
|
47
|
+
|
|
48
|
+
Run:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx nx@latest init
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Documentation & Resources
|
|
55
|
+
|
|
56
|
+
- [Nx.Dev: Documentation, Guides, Tutorials](https://nx.dev)
|
|
57
|
+
- [Intro to Nx](https://nx.dev/getting-started/intro)
|
|
58
|
+
- [Official Nx YouTube Channel](https://www.youtube.com/@NxDevtools)
|
|
59
|
+
- [Blog Posts About Nx](https://blog.nrwl.io/nx/home)
|
|
60
|
+
|
|
61
|
+
<p style="text-align: center;"><a href="https://nx.dev/#learning-materials" target="_blank" rel="noreferrer"><img src="https://raw.githubusercontent.com/nrwl/nx/master/images/nx-courses-and-videos.svg"
|
|
62
|
+
width="100%" alt="Nx - Smart Monorepos · Fast CI"></a></p>
|
|
63
|
+
|
package/executors.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"executors": {
|
|
3
|
+
"serve": {
|
|
4
|
+
"implementation": "./src/executors/serve/serve.impl",
|
|
5
|
+
"schema": "./src/executors/serve/schema.json",
|
|
6
|
+
"description": "Serve a Remix application."
|
|
7
|
+
},
|
|
8
|
+
"build": {
|
|
9
|
+
"implementation": "./src/executors/build/build.impl",
|
|
10
|
+
"schema": "./src/executors/build/schema.json",
|
|
11
|
+
"description": "Build a Remix application."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
package/generators.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { default as actionGenerator } from './src/generators/action/action.impl';
|
|
2
|
+
export { default as applicationGenerator } from './src/generators/application/application.impl';
|
|
3
|
+
export { default as cypressComponentConfigurationGenerator } from './src/generators/cypress-component-configuration/cypress-component-configuration.impl';
|
|
4
|
+
export { default as errorBoundaryGenerator } from './src/generators/error-boundary/error-boundary.impl';
|
|
5
|
+
export { default as libraryGenerator } from './src/generators/library/library.impl';
|
|
6
|
+
export { default as loaderGenerator } from './src/generators/loader/loader.impl';
|
|
7
|
+
export { default as metaGenerator } from './src/generators/meta/meta.impl';
|
|
8
|
+
export { default as presetGenerator } from './src/generators/preset/preset.impl';
|
|
9
|
+
export { default as resourceRouteGenerator } from './src/generators/resource-route/resource-route.impl';
|
|
10
|
+
export { default as routeGenerator } from './src/generators/route/route.impl';
|
|
11
|
+
export { default as setupTailwindGenerator } from './src/generators/setup-tailwind/setup-tailwind.impl';
|
|
12
|
+
export { default as storybookConfigurationGenerator } from './src/generators/storybook-configuration/storybook-configuration.impl';
|
|
13
|
+
export { default as styleGenerator } from './src/generators/style/style.impl';
|
|
14
|
+
export { default as initGenerator } from './src/generators/init/init';
|
package/generators.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initGenerator = exports.styleGenerator = exports.storybookConfigurationGenerator = exports.setupTailwindGenerator = exports.routeGenerator = exports.resourceRouteGenerator = exports.presetGenerator = exports.metaGenerator = exports.loaderGenerator = exports.libraryGenerator = exports.errorBoundaryGenerator = exports.cypressComponentConfigurationGenerator = exports.applicationGenerator = exports.actionGenerator = void 0;
|
|
4
|
+
var action_impl_1 = require("./src/generators/action/action.impl");
|
|
5
|
+
Object.defineProperty(exports, "actionGenerator", { enumerable: true, get: function () { return action_impl_1.default; } });
|
|
6
|
+
var application_impl_1 = require("./src/generators/application/application.impl");
|
|
7
|
+
Object.defineProperty(exports, "applicationGenerator", { enumerable: true, get: function () { return application_impl_1.default; } });
|
|
8
|
+
var cypress_component_configuration_impl_1 = require("./src/generators/cypress-component-configuration/cypress-component-configuration.impl");
|
|
9
|
+
Object.defineProperty(exports, "cypressComponentConfigurationGenerator", { enumerable: true, get: function () { return cypress_component_configuration_impl_1.default; } });
|
|
10
|
+
var error_boundary_impl_1 = require("./src/generators/error-boundary/error-boundary.impl");
|
|
11
|
+
Object.defineProperty(exports, "errorBoundaryGenerator", { enumerable: true, get: function () { return error_boundary_impl_1.default; } });
|
|
12
|
+
var library_impl_1 = require("./src/generators/library/library.impl");
|
|
13
|
+
Object.defineProperty(exports, "libraryGenerator", { enumerable: true, get: function () { return library_impl_1.default; } });
|
|
14
|
+
var loader_impl_1 = require("./src/generators/loader/loader.impl");
|
|
15
|
+
Object.defineProperty(exports, "loaderGenerator", { enumerable: true, get: function () { return loader_impl_1.default; } });
|
|
16
|
+
var meta_impl_1 = require("./src/generators/meta/meta.impl");
|
|
17
|
+
Object.defineProperty(exports, "metaGenerator", { enumerable: true, get: function () { return meta_impl_1.default; } });
|
|
18
|
+
var preset_impl_1 = require("./src/generators/preset/preset.impl");
|
|
19
|
+
Object.defineProperty(exports, "presetGenerator", { enumerable: true, get: function () { return preset_impl_1.default; } });
|
|
20
|
+
var resource_route_impl_1 = require("./src/generators/resource-route/resource-route.impl");
|
|
21
|
+
Object.defineProperty(exports, "resourceRouteGenerator", { enumerable: true, get: function () { return resource_route_impl_1.default; } });
|
|
22
|
+
var route_impl_1 = require("./src/generators/route/route.impl");
|
|
23
|
+
Object.defineProperty(exports, "routeGenerator", { enumerable: true, get: function () { return route_impl_1.default; } });
|
|
24
|
+
var setup_tailwind_impl_1 = require("./src/generators/setup-tailwind/setup-tailwind.impl");
|
|
25
|
+
Object.defineProperty(exports, "setupTailwindGenerator", { enumerable: true, get: function () { return setup_tailwind_impl_1.default; } });
|
|
26
|
+
var storybook_configuration_impl_1 = require("./src/generators/storybook-configuration/storybook-configuration.impl");
|
|
27
|
+
Object.defineProperty(exports, "storybookConfigurationGenerator", { enumerable: true, get: function () { return storybook_configuration_impl_1.default; } });
|
|
28
|
+
var style_impl_1 = require("./src/generators/style/style.impl");
|
|
29
|
+
Object.defineProperty(exports, "styleGenerator", { enumerable: true, get: function () { return style_impl_1.default; } });
|
|
30
|
+
var init_1 = require("./src/generators/init/init");
|
|
31
|
+
Object.defineProperty(exports, "initGenerator", { enumerable: true, get: function () { return init_1.default; } });
|
package/generators.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/schema",
|
|
3
|
+
"name": "NxRemix",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"extends": ["@nx/react"],
|
|
6
|
+
"generators": {
|
|
7
|
+
"preset": {
|
|
8
|
+
"implementation": "./src/generators/preset/preset.impl",
|
|
9
|
+
"schema": "./src/generators/preset/schema.json",
|
|
10
|
+
"description": "Generate a new Remix workspace",
|
|
11
|
+
"hidden": true
|
|
12
|
+
},
|
|
13
|
+
"setup": {
|
|
14
|
+
"implementation": "./src/generators/setup/setup.impl",
|
|
15
|
+
"schema": "./src/generators/setup/schema.json",
|
|
16
|
+
"description": "Setup a Remix in an existing workspace",
|
|
17
|
+
"hidden": true
|
|
18
|
+
},
|
|
19
|
+
"application": {
|
|
20
|
+
"implementation": "./src/generators/application/application.impl#remixApplicationGeneratorInternal",
|
|
21
|
+
"schema": "./src/generators/application/schema.json",
|
|
22
|
+
"description": "Generate a new Remix application",
|
|
23
|
+
"aliases": ["app"],
|
|
24
|
+
"x-type": "application"
|
|
25
|
+
},
|
|
26
|
+
"cypress-component-configuration": {
|
|
27
|
+
"implementation": "./src/generators/cypress-component-configuration/cypress-component-configuration.impl#cypressComponentConfigurationGeneratorInternal",
|
|
28
|
+
"schema": "./src/generators/cypress-component-configuration/schema.json",
|
|
29
|
+
"description": "Generate a Cypress Component Testing configuration for a Remix project"
|
|
30
|
+
},
|
|
31
|
+
"library": {
|
|
32
|
+
"implementation": "./src/generators/library/library.impl#remixLibraryGeneratorInternal",
|
|
33
|
+
"schema": "./src/generators/library/schema.json",
|
|
34
|
+
"description": "Generate a new library",
|
|
35
|
+
"aliases": ["lib"],
|
|
36
|
+
"x-type": "library"
|
|
37
|
+
},
|
|
38
|
+
"init": {
|
|
39
|
+
"implementation": "./src/generators/init/init#remixInitGeneratorInternal",
|
|
40
|
+
"schema": "./src/generators/init/schema.json",
|
|
41
|
+
"description": "Initialize the `@nx/remix` plugin.",
|
|
42
|
+
"hidden": true
|
|
43
|
+
},
|
|
44
|
+
"route": {
|
|
45
|
+
"implementation": "./src/generators/route/route.impl",
|
|
46
|
+
"schema": "./src/generators/route/schema.json",
|
|
47
|
+
"description": "Generate a new route"
|
|
48
|
+
},
|
|
49
|
+
"resource-route": {
|
|
50
|
+
"implementation": "./src/generators/resource-route/resource-route.impl",
|
|
51
|
+
"schema": "./src/generators/resource-route/schema.json",
|
|
52
|
+
"description": "Generate a new resource route"
|
|
53
|
+
},
|
|
54
|
+
"action": {
|
|
55
|
+
"implementation": "./src/generators/action/action.impl",
|
|
56
|
+
"schema": "./src/generators/action/schema.json",
|
|
57
|
+
"description": "Add an action function to an existing route"
|
|
58
|
+
},
|
|
59
|
+
"loader": {
|
|
60
|
+
"implementation": "./src/generators/loader/loader.impl",
|
|
61
|
+
"schema": "./src/generators/loader/schema.json",
|
|
62
|
+
"description": "Add a loader function to an existing route"
|
|
63
|
+
},
|
|
64
|
+
"style": {
|
|
65
|
+
"implementation": "./src/generators/style/style.impl",
|
|
66
|
+
"schema": "./src/generators/style/schema.json",
|
|
67
|
+
"description": "Generates a new stylesheet and adds it to an existing route"
|
|
68
|
+
},
|
|
69
|
+
"setup-tailwind": {
|
|
70
|
+
"implementation": "./src/generators/setup-tailwind/setup-tailwind.impl",
|
|
71
|
+
"schema": "./src/generators/setup-tailwind/schema.json",
|
|
72
|
+
"description": "Generates a TailwindCSS configuration for the Remix application"
|
|
73
|
+
},
|
|
74
|
+
"storybook-configuration": {
|
|
75
|
+
"implementation": "./src/generators/storybook-configuration/storybook-configuration.impl#remixStorybookConfiguration",
|
|
76
|
+
"schema": "./src/generators/storybook-configuration/schema.json",
|
|
77
|
+
"description": "Generates a Storybook configuration for a Remix application"
|
|
78
|
+
},
|
|
79
|
+
"meta": {
|
|
80
|
+
"implementation": "./src/generators/meta/meta.impl",
|
|
81
|
+
"schema": "./src/generators/meta/schema.json",
|
|
82
|
+
"description": "Add a meta function to an existing route"
|
|
83
|
+
},
|
|
84
|
+
"error-boundary": {
|
|
85
|
+
"implementation": "./src/generators/error-boundary/error-boundary.impl",
|
|
86
|
+
"schema": "./src/generators/error-boundary/schema.json",
|
|
87
|
+
"description": "Add an ErrorBoundary to an existing route"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createWatchPaths } from './src/utils/create-watch-paths';
|
package/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWatchPaths = void 0;
|
|
4
|
+
var create_watch_paths_1 = require("./src/utils/create-watch-paths");
|
|
5
|
+
Object.defineProperty(exports, "createWatchPaths", { enumerable: true, get: function () { return create_watch_paths_1.createWatchPaths; } });
|
package/migrations.json
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generators": {},
|
|
3
|
+
"packageJsonUpdates": {
|
|
4
|
+
"17.2.1": {
|
|
5
|
+
"version": "17.2.1-beta.0",
|
|
6
|
+
"packages": {
|
|
7
|
+
"@remix-run/node": {
|
|
8
|
+
"version": "^2.3.0",
|
|
9
|
+
"alwaysAddToPackageJson": true
|
|
10
|
+
},
|
|
11
|
+
"@remix-run/react": {
|
|
12
|
+
"version": "^2.3.0",
|
|
13
|
+
"alwaysAddToPackageJson": true
|
|
14
|
+
},
|
|
15
|
+
"@remix-run/serve": {
|
|
16
|
+
"version": "^2.3.0",
|
|
17
|
+
"alwaysAddToPackageJson": true
|
|
18
|
+
},
|
|
19
|
+
"@remix-run/dev": {
|
|
20
|
+
"version": "^2.3.0",
|
|
21
|
+
"alwaysAddToPackageJson": true
|
|
22
|
+
},
|
|
23
|
+
"@remix-run/css-bundle": {
|
|
24
|
+
"version": "^2.3.0",
|
|
25
|
+
"alwaysAddToPackageJson": true
|
|
26
|
+
},
|
|
27
|
+
"@remix-run/eslint-config": {
|
|
28
|
+
"version": "^2.3.0",
|
|
29
|
+
"alwaysAddToPackageJson": true
|
|
30
|
+
},
|
|
31
|
+
"isbot": {
|
|
32
|
+
"version": "^3.6.8",
|
|
33
|
+
"alwaysAddToPackageJson": true
|
|
34
|
+
},
|
|
35
|
+
"eslint": {
|
|
36
|
+
"version": "^8.38.0",
|
|
37
|
+
"alwaysAddToPackageJson": true
|
|
38
|
+
},
|
|
39
|
+
"@testing-library/react": {
|
|
40
|
+
"version": "^14.1.2",
|
|
41
|
+
"alwaysAddToPackageJson": false
|
|
42
|
+
},
|
|
43
|
+
"@testing-library/jest-dom": {
|
|
44
|
+
"version": "^6.1.4",
|
|
45
|
+
"alwaysAddToPackageJson": false
|
|
46
|
+
},
|
|
47
|
+
"@testing-library/user-event": {
|
|
48
|
+
"version": "^14.5.1",
|
|
49
|
+
"alwaysAddToPackageJson": false
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"18.1.0": {
|
|
54
|
+
"version": "18.1.0-beta.1",
|
|
55
|
+
"packages": {
|
|
56
|
+
"@remix-run/node": {
|
|
57
|
+
"version": "^2.6.0",
|
|
58
|
+
"alwaysAddToPackageJson": true
|
|
59
|
+
},
|
|
60
|
+
"@remix-run/react": {
|
|
61
|
+
"version": "^2.6.0",
|
|
62
|
+
"alwaysAddToPackageJson": true
|
|
63
|
+
},
|
|
64
|
+
"@remix-run/serve": {
|
|
65
|
+
"version": "^2.6.0",
|
|
66
|
+
"alwaysAddToPackageJson": true
|
|
67
|
+
},
|
|
68
|
+
"@remix-run/dev": {
|
|
69
|
+
"version": "^2.6.0",
|
|
70
|
+
"alwaysAddToPackageJson": true
|
|
71
|
+
},
|
|
72
|
+
"@remix-run/css-bundle": {
|
|
73
|
+
"version": "^2.6.0",
|
|
74
|
+
"alwaysAddToPackageJson": true
|
|
75
|
+
},
|
|
76
|
+
"@remix-run/eslint-config": {
|
|
77
|
+
"version": "^2.6.0",
|
|
78
|
+
"alwaysAddToPackageJson": true
|
|
79
|
+
},
|
|
80
|
+
"isbot": {
|
|
81
|
+
"version": "^4.4.0",
|
|
82
|
+
"alwaysAddToPackageJson": true
|
|
83
|
+
},
|
|
84
|
+
"eslint": {
|
|
85
|
+
"version": "^8.56.0",
|
|
86
|
+
"alwaysAddToPackageJson": true
|
|
87
|
+
},
|
|
88
|
+
"@testing-library/react": {
|
|
89
|
+
"version": "^14.1.2",
|
|
90
|
+
"alwaysAddToPackageJson": false
|
|
91
|
+
},
|
|
92
|
+
"@testing-library/jest-dom": {
|
|
93
|
+
"version": "^6.2.0",
|
|
94
|
+
"alwaysAddToPackageJson": false
|
|
95
|
+
},
|
|
96
|
+
"@testing-library/user-event": {
|
|
97
|
+
"version": "^14.5.2",
|
|
98
|
+
"alwaysAddToPackageJson": false
|
|
99
|
+
},
|
|
100
|
+
"typescript": {
|
|
101
|
+
"version": "^5.3.3",
|
|
102
|
+
"alwaysAddToPackageJson": false
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nx/remix",
|
|
3
|
+
"version": "0.0.0-pr-22179-271588f",
|
|
4
|
+
"description": "The Remix plugin for Nx contains executors and generators for managing Remix applications and libraries within an Nx workspace. It provides:\n\n\n- Integration with libraries such as Vitest, Jest, Cypress, and Storybook.\n\n- Generators for applications, libraries, routes, loaders, and more.\n\n- Library build support for publishing packages to npm or other registries.\n\n- Utilities for automatic workspace refactoring.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/nrwl/nx.git",
|
|
8
|
+
"directory": "packages/remix"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"Monorepo",
|
|
12
|
+
"Remix",
|
|
13
|
+
"React",
|
|
14
|
+
"Web",
|
|
15
|
+
"CLI"
|
|
16
|
+
],
|
|
17
|
+
"author": "Victor Savkin",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/nrwl/nx/issues"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://nx.dev",
|
|
23
|
+
"main": "./index.js",
|
|
24
|
+
"typings": "./index.d.ts",
|
|
25
|
+
"generators": "./generators.json",
|
|
26
|
+
"executors": "./executors.json",
|
|
27
|
+
"nx-migrations": {
|
|
28
|
+
"migrations": "./migrations.json"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@nx/devkit": "0.0.0-pr-22179-271588f",
|
|
32
|
+
"@nx/js": "0.0.0-pr-22179-271588f",
|
|
33
|
+
"@nx/react": "0.0.0-pr-22179-271588f",
|
|
34
|
+
"tslib": "^2.3.1",
|
|
35
|
+
"@phenomnomnominal/tsquery": "~5.0.1",
|
|
36
|
+
"@nrwl/remix": "0.0.0-pr-22179-271588f"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"exports": {
|
|
43
|
+
".": "./index.js",
|
|
44
|
+
"./plugin": "./plugin.js",
|
|
45
|
+
"./plugins/component-testing": "./plugins/component-testing/index.js",
|
|
46
|
+
"./package.json": "./package.json",
|
|
47
|
+
"./executors.json": "./executors.json",
|
|
48
|
+
"./generators.json": "./generators.json",
|
|
49
|
+
"./migrations.json": "./migrations.json",
|
|
50
|
+
"./generators": "./generators.js"
|
|
51
|
+
},
|
|
52
|
+
"type": "commonjs"
|
|
53
|
+
}
|
package/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createNodes, createDependencies, RemixPluginOptions, } from './src/plugins/plugin';
|
package/plugin.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDependencies = exports.createNodes = void 0;
|
|
4
|
+
var plugin_1 = require("./src/plugins/plugin");
|
|
5
|
+
Object.defineProperty(exports, "createNodes", { enumerable: true, get: function () { return plugin_1.createNodes; } });
|
|
6
|
+
Object.defineProperty(exports, "createDependencies", { enumerable: true, get: function () { return plugin_1.createDependencies; } });
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type ViteDevServer = {
|
|
2
|
+
framework: 'react';
|
|
3
|
+
bundler: 'vite';
|
|
4
|
+
viteConfig?: any;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Remix nx preset for Cypress Component Testing
|
|
8
|
+
*
|
|
9
|
+
* This preset contains the base configuration
|
|
10
|
+
* for your component tests that nx recommends.
|
|
11
|
+
* including a devServer that supports nx workspaces.
|
|
12
|
+
* you can easily extend this within your cypress config via spreading the preset
|
|
13
|
+
* @example
|
|
14
|
+
* export default defineConfig({
|
|
15
|
+
* component: {
|
|
16
|
+
* ...nxComponentTestingPreset(__dirname)
|
|
17
|
+
* // add your own config here
|
|
18
|
+
* }
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* @param pathToConfig will be used for loading project options and to construct the output paths for videos and screenshots
|
|
22
|
+
*/
|
|
23
|
+
export declare function nxComponentTestingPreset(pathToConfig: string): {
|
|
24
|
+
specPattern: string;
|
|
25
|
+
devServer: ViteDevServer;
|
|
26
|
+
videosFolder: string;
|
|
27
|
+
screenshotsFolder: string;
|
|
28
|
+
chromeWebSecurity: boolean;
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nxComponentTestingPreset = void 0;
|
|
4
|
+
const cypress_preset_1 = require("@nx/cypress/plugins/cypress-preset");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
/**
|
|
9
|
+
* Remix nx preset for Cypress Component Testing
|
|
10
|
+
*
|
|
11
|
+
* This preset contains the base configuration
|
|
12
|
+
* for your component tests that nx recommends.
|
|
13
|
+
* including a devServer that supports nx workspaces.
|
|
14
|
+
* you can easily extend this within your cypress config via spreading the preset
|
|
15
|
+
* @example
|
|
16
|
+
* export default defineConfig({
|
|
17
|
+
* component: {
|
|
18
|
+
* ...nxComponentTestingPreset(__dirname)
|
|
19
|
+
* // add your own config here
|
|
20
|
+
* }
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* @param pathToConfig will be used for loading project options and to construct the output paths for videos and screenshots
|
|
24
|
+
*/
|
|
25
|
+
function nxComponentTestingPreset(pathToConfig) {
|
|
26
|
+
const normalizedProjectRootPath = ['.ts', '.js'].some((ext) => pathToConfig.endsWith(ext))
|
|
27
|
+
? pathToConfig
|
|
28
|
+
: (0, path_1.dirname)(pathToConfig);
|
|
29
|
+
return {
|
|
30
|
+
...(0, cypress_preset_1.nxBaseCypressPreset)(pathToConfig),
|
|
31
|
+
specPattern: 'src/**/*.cy.{js,jsx,ts,tsx}',
|
|
32
|
+
devServer: {
|
|
33
|
+
...{ framework: 'react', bundler: 'vite' },
|
|
34
|
+
viteConfig: async () => {
|
|
35
|
+
const viteConfigPath = findViteConfig(normalizedProjectRootPath);
|
|
36
|
+
const { mergeConfig, loadConfigFromFile, searchForWorkspaceRoot } = await Promise.resolve().then(() => require('vite'));
|
|
37
|
+
const resolved = await loadConfigFromFile({
|
|
38
|
+
mode: 'watch',
|
|
39
|
+
command: 'serve',
|
|
40
|
+
}, viteConfigPath);
|
|
41
|
+
return mergeConfig(resolved.config, {
|
|
42
|
+
server: {
|
|
43
|
+
fs: {
|
|
44
|
+
allow: [
|
|
45
|
+
searchForWorkspaceRoot(normalizedProjectRootPath),
|
|
46
|
+
devkit_1.workspaceRoot,
|
|
47
|
+
(0, devkit_1.joinPathFragments)(devkit_1.workspaceRoot, 'node_modules/vite'),
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
exports.nxComponentTestingPreset = nxComponentTestingPreset;
|
|
57
|
+
function findViteConfig(projectRootFullPath) {
|
|
58
|
+
const allowsExt = ['js', 'mjs', 'ts', 'cjs', 'mts', 'cts'];
|
|
59
|
+
for (const ext of allowsExt) {
|
|
60
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(projectRootFullPath, `vite.config.${ext}`))) {
|
|
61
|
+
return (0, path_1.join)(projectRootFullPath, `vite.config.${ext}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const devkit_1 = require("@nx/devkit");
|
|
4
|
+
const js_1 = require("@nx/js");
|
|
5
|
+
const fileutils_1 = require("@nx/workspace/src/utilities/fileutils");
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const fs_extra_1 = require("fs-extra");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
function buildRemixBuildArgs(options) {
|
|
10
|
+
const args = ['build'];
|
|
11
|
+
if (options.sourcemap) {
|
|
12
|
+
args.push(`--sourcemap`);
|
|
13
|
+
}
|
|
14
|
+
return args;
|
|
15
|
+
}
|
|
16
|
+
async function runBuild(options, context) {
|
|
17
|
+
const projectRoot = context.projectGraph.nodes[context.projectName].data.root;
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const remixBin = require.resolve('@remix-run/dev/dist/cli');
|
|
20
|
+
const args = buildRemixBuildArgs(options);
|
|
21
|
+
const p = (0, child_process_1.fork)(remixBin, args, {
|
|
22
|
+
cwd: (0, path_1.join)(context.root, projectRoot),
|
|
23
|
+
stdio: 'inherit',
|
|
24
|
+
});
|
|
25
|
+
p.on('exit', (code) => {
|
|
26
|
+
if (code === 0)
|
|
27
|
+
resolve();
|
|
28
|
+
else
|
|
29
|
+
reject();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function buildExecutor(options, context) {
|
|
34
|
+
const projectRoot = context.projectGraph.nodes[context.projectName].data.root;
|
|
35
|
+
try {
|
|
36
|
+
await runBuild(options, context);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
devkit_1.logger.error(`Error occurred while trying to build application. See above for more details.`);
|
|
40
|
+
return { success: false };
|
|
41
|
+
}
|
|
42
|
+
if (!(0, fileutils_1.directoryExists)(options.outputPath)) {
|
|
43
|
+
(0, fs_extra_1.mkdir)(options.outputPath);
|
|
44
|
+
}
|
|
45
|
+
let packageJson;
|
|
46
|
+
if (options.generatePackageJson) {
|
|
47
|
+
packageJson = (0, js_1.createPackageJson)(context.projectName, context.projectGraph, {
|
|
48
|
+
target: context.targetName,
|
|
49
|
+
root: context.root,
|
|
50
|
+
isProduction: !options.includeDevDependenciesInPackageJson, // By default we remove devDependencies since this is a production build.
|
|
51
|
+
});
|
|
52
|
+
// Update `package.json` to reflect how users should run the build artifacts
|
|
53
|
+
packageJson.scripts ??= {};
|
|
54
|
+
// Don't override existing custom script since project may have its own server.
|
|
55
|
+
if (!packageJson.scripts.start) {
|
|
56
|
+
packageJson.scripts['start'] = 'remix-serve ./build/index.js';
|
|
57
|
+
}
|
|
58
|
+
updatePackageJson(packageJson, context);
|
|
59
|
+
(0, devkit_1.writeJsonFile)(`${options.outputPath}/package.json`, packageJson);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
packageJson = (0, devkit_1.readJsonFile)((0, path_1.join)(projectRoot, 'package.json'));
|
|
63
|
+
}
|
|
64
|
+
if (options.generateLockfile) {
|
|
65
|
+
const packageManager = (0, devkit_1.detectPackageManager)(context.root);
|
|
66
|
+
const lockFile = (0, js_1.createLockFile)(packageJson, context.projectGraph, packageManager);
|
|
67
|
+
(0, fs_extra_1.writeFileSync)(`${options.outputPath}/${(0, js_1.getLockFileName)(packageManager)}`, lockFile, {
|
|
68
|
+
encoding: 'utf-8',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// If output path is different from source path, then copy over the config and public files.
|
|
72
|
+
// This is the default behavior when running `nx build <app>`.
|
|
73
|
+
if (options.outputPath.replace(/\/$/, '') !== projectRoot) {
|
|
74
|
+
(0, fs_extra_1.copySync)((0, path_1.join)(projectRoot, 'public'), (0, path_1.join)(options.outputPath, 'public'), {
|
|
75
|
+
dereference: true,
|
|
76
|
+
});
|
|
77
|
+
(0, fs_extra_1.copySync)((0, path_1.join)(projectRoot, 'build'), (0, path_1.join)(options.outputPath, 'build'), {
|
|
78
|
+
dereference: true,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { success: true };
|
|
82
|
+
}
|
|
83
|
+
exports.default = buildExecutor;
|
|
84
|
+
function updatePackageJson(packageJson, context) {
|
|
85
|
+
if (!packageJson.scripts) {
|
|
86
|
+
packageJson.scripts = {};
|
|
87
|
+
}
|
|
88
|
+
if (!packageJson.scripts.start) {
|
|
89
|
+
packageJson.scripts.start = 'remix-serve build';
|
|
90
|
+
}
|
|
91
|
+
packageJson.dependencies ??= {};
|
|
92
|
+
// These are always required for a production Remix app to run.
|
|
93
|
+
const requiredPackages = [
|
|
94
|
+
'react',
|
|
95
|
+
'react-dom',
|
|
96
|
+
'isbot',
|
|
97
|
+
'@remix-run/css-bundle',
|
|
98
|
+
'@remix-run/node',
|
|
99
|
+
'@remix-run/react',
|
|
100
|
+
'@remix-run/serve',
|
|
101
|
+
'@remix-run/dev',
|
|
102
|
+
];
|
|
103
|
+
for (const pkg of requiredPackages) {
|
|
104
|
+
const externalNode = context.projectGraph.externalNodes[`npm:${pkg}`];
|
|
105
|
+
if (externalNode) {
|
|
106
|
+
packageJson.dependencies[pkg] ??= externalNode.data.version;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|