@ronas-it/nx-generators 0.13.4 → 0.14.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/README.md CHANGED
@@ -300,3 +300,7 @@ Creates [Sentry](https://sentry.io/) integration for Expo/Next application.
300
300
  1. `directory` (optional) - the application directory that uses Sentry
301
301
 
302
302
  2. `dsn` (optional) - [Data Source Name](https://docs.sentry.io/concepts/key-terms/dsn-explainer/) of your Sentry project
303
+
304
+ ### 14. `dockerfile`
305
+
306
+ Generates a deployment-ready Dockerfile for Next.js applications in the monorepo.
package/generators.json CHANGED
@@ -79,6 +79,11 @@
79
79
  "factory": "./src/shared/generators/auth/generator",
80
80
  "schema": "./src/shared/generators/auth/schema.json",
81
81
  "description": "Creates auth related api libs and configures redux store "
82
+ },
83
+ "dockerfile": {
84
+ "factory": "./src/generators/dockerfile/generator",
85
+ "schema": "./src/generators/dockerfile/schema.json",
86
+ "description": "Generates dockerfile"
82
87
  }
83
88
  }
84
89
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronas-it/nx-generators",
3
- "version": "0.13.4",
3
+ "version": "0.14.0",
4
4
  "description": "Nx generators for Ronas IT projects",
5
5
  "license": "MIT",
6
6
  "author": "Ronas IT",
@@ -0,0 +1,74 @@
1
+ # Builder stage
2
+ FROM node:22-alpine AS builder
3
+
4
+ ARG CI_COMMIT_REF_SLUG=development
5
+ ARG CI_NX_APP_NAME
6
+ ARG CI_TARGET_BRANCH_NAME
7
+
8
+ RUN if [ -z "$CI_COMMIT_REF_SLUG" ]; then echo "CI_COMMIT_REF_SLUG is not set"; exit 1; fi
9
+ RUN if [ -z "$CI_NX_APP_NAME" ]; then echo "CI_NX_APP_NAME is not set"; exit 1; fi
10
+ RUN echo "CI_COMMIT_REF_SLUG: $CI_COMMIT_REF_SLUG"
11
+ RUN echo "CI_NX_APP_NAME: $CI_NX_APP_NAME"
12
+ RUN echo "CI_TARGET_BRANCH_NAME: $CI_TARGET_BRANCH_NAME"
13
+
14
+ ENV CI_COMMIT_REF_SLUG=${CI_COMMIT_REF_SLUG}
15
+ ENV CI_NX_APP_NAME=${CI_NX_APP_NAME}
16
+ ENV NEXT_TELEMETRY_DISABLED=1
17
+
18
+ WORKDIR /app
19
+
20
+ # Copy package.json and package-lock.json (if available)
21
+ COPY package*.json ./
22
+
23
+ # Install all dependencies, including devDependencies
24
+ RUN npm ci
25
+
26
+ # Copy the rest of the application
27
+ COPY . .
28
+
29
+ ENV NEXT_SHARP_PATH=/app/node_modules/sharp
30
+
31
+ RUN if [ "$CI_COMMIT_REF_SLUG" != "production" ]; then \
32
+ if [ -n "$CI_TARGET_BRANCH_NAME" ] && [ -f "/app/apps/${CI_NX_APP_NAME}/.env.${CI_TARGET_BRANCH_NAME}" ]; then \
33
+ cp "/app/apps/${CI_NX_APP_NAME}/.env.${CI_TARGET_BRANCH_NAME}" "/app/apps/${CI_NX_APP_NAME}/.env.production"; \
34
+ elif [ -f "/app/apps/${CI_NX_APP_NAME}/.env.${CI_COMMIT_REF_SLUG}" ]; then \
35
+ cp "/app/apps/${CI_NX_APP_NAME}/.env.${CI_COMMIT_REF_SLUG}" "/app/apps/${CI_NX_APP_NAME}/.env.production"; \
36
+ fi \
37
+ fi
38
+
39
+ RUN npx nx build ${CI_NX_APP_NAME} -c ${CI_COMMIT_REF_SLUG} --skip-nx-cache
40
+
41
+ # Runner stage
42
+ FROM node:22-alpine AS runner
43
+
44
+ ARG CI_COMMIT_REF_SLUG=development
45
+ ARG CI_NX_APP_NAME
46
+
47
+ RUN if [ -z "$CI_COMMIT_REF_SLUG" ]; then echo "CI_COMMIT_REF_SLUG is not set"; exit 1; fi
48
+ RUN if [ -z "$CI_NX_APP_NAME" ]; then echo "CI_NX_APP_NAME is not set"; exit 1; fi
49
+ RUN echo "CI_COMMIT_REF_SLUG: $CI_COMMIT_REF_SLUG"
50
+ RUN echo "CI_NX_APP_NAME: $CI_NX_APP_NAME"
51
+
52
+ ENV CI_COMMIT_REF_SLUG=${CI_COMMIT_REF_SLUG}
53
+ ENV CI_NX_APP_NAME=${CI_NX_APP_NAME}
54
+ ENV NODE_ENV=${CI_COMMIT_REF_SLUG}
55
+ ENV NEXT_TELEMETRY_DISABLED=1
56
+ ENV PORT=3000
57
+
58
+ WORKDIR /app
59
+
60
+ RUN addgroup --system --gid 1001 nodejs && \
61
+ adduser --system --uid 1001 nextjs
62
+
63
+ # Copy only the built application and necessary files
64
+ COPY --from=builder --chown=nextjs:nodejs /app/apps/${CI_NX_APP_NAME}/.next/standalone ./
65
+ COPY --from=builder --chown=nextjs:nodejs /app/apps/${CI_NX_APP_NAME}/.next/static ./apps/${CI_NX_APP_NAME}/.next/static/
66
+ COPY --from=builder --chown=nextjs:nodejs /app/apps/${CI_NX_APP_NAME}/public ./apps/${CI_NX_APP_NAME}/public
67
+
68
+ RUN chown -R nextjs:nodejs ./apps/${CI_NX_APP_NAME}/public
69
+
70
+ USER nextjs
71
+
72
+ EXPOSE 3000
73
+
74
+ CMD ["sh", "-c", "node apps/$CI_NX_APP_NAME/server.js"]
@@ -0,0 +1,2 @@
1
+ import { Tree } from '@nx/devkit';
2
+ export default function (tree: Tree): Promise<() => void>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const path = require("path");
5
+ const devkit_1 = require("@nx/devkit");
6
+ function default_1(tree) {
7
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
8
+ const projectRoot = `.`;
9
+ const dockerfilePath = (0, devkit_1.joinPathFragments)(projectRoot, 'Dockerfile');
10
+ if (tree.exists(dockerfilePath)) {
11
+ tree.delete(dockerfilePath);
12
+ console.log(`Removed existing Dockerfile`);
13
+ }
14
+ const templateSource = path.join(__dirname, 'files');
15
+ (0, devkit_1.generateFiles)(tree, templateSource, projectRoot, {
16
+ tmpl: '',
17
+ });
18
+ yield (0, devkit_1.formatFiles)(tree);
19
+ return () => {
20
+ (0, devkit_1.installPackagesTask)(tree);
21
+ };
22
+ });
23
+ }
24
+ exports.default = default_1;
25
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/dockerfile/generator.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAC7B,uCAAsG;AAEtG,mBAA+B,IAAU;;QACvC,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,MAAM,cAAc,GAAG,IAAA,0BAAiB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAErD,IAAA,sBAAa,EAAC,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE;YAC/C,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QAEH,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;QAExB,OAAO,GAAS,EAAE;YAChB,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;CAAA;AApBD,4BAoBC"}
@@ -0,0 +1,3 @@
1
+ export interface DockerfileGeneratorSchema {
2
+ name: string;
3
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "title": "Dockerfile generator",
4
+ "type": "object",
5
+ "properties": {
6
+ "name": "DockerfileGenerator"
7
+ }
8
+ }
@@ -46,7 +46,7 @@ export default async function RootLayout({ children, params }: RootLayoutProps):
46
46
  </head>
47
47
  <body>
48
48
  <% if(hasProviders) { %><Providers><% } %>
49
- <NextIntlClientProvider messages={pick(messages, 'web-shared')} locale={locale}>
49
+ <NextIntlClientProvider messages={pick(messages, '<%= sharedTranslationsKey %>')} locale={locale}>
50
50
  {children}
51
51
  </NextIntlClientProvider>
52
52
  <% if(hasProviders) { %></Providers><% } %>
@@ -2,7 +2,7 @@ import { useTranslations } from 'next-intl';
2
2
  import { ReactElement } from 'react';
3
3
 
4
4
  export default function Index(): ReactElement {
5
- const t = useTranslations('web-shared.HOME_PAGE');
5
+ const t = useTranslations('<%= sharedTranslationsKey %>.HOME_PAGE');
6
6
 
7
7
  return <div>{t('HOME_PAGE_TEXT')}</div>;
8
8
  }
@@ -12,7 +12,7 @@ export default getRequestConfig(async ({ requestLocale }) => {
12
12
  return {
13
13
  locale,
14
14
  messages: {
15
- 'web-shared': (await import(`../../../i18n/<%= directory %>/shared/${locale}.json`)).default
15
+ '<%= sharedTranslationsKey %>': (await import(`../../../i18n/<%= directory %>/shared/${locale}.json`)).default
16
16
  }
17
17
  };
18
18
  });
@@ -18,6 +18,7 @@ function nextAppGenerator(tree, options) {
18
18
  const i18nRoot = `i18n/${options.directory}`;
19
19
  const libPath = `${(0, utils_1.getImportPathPrefix)(tree)}/${options.directory}`;
20
20
  const tags = [`app:${options.directory}`, 'type:app'];
21
+ const sharedTranslationsKey = `${options.directory}-shared`;
21
22
  // Install @nx/next plugin
22
23
  (0, child_process_1.execSync)('npx nx add @nx/next', { stdio: 'inherit' });
23
24
  if (!(0, fs_1.existsSync)(appRoot)) {
@@ -56,12 +57,13 @@ function nextAppGenerator(tree, options) {
56
57
  // Add app files
57
58
  (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files'), appRoot, Object.assign(Object.assign({}, options), { formatName: utils_1.formatName,
58
59
  libPath,
59
- hasProviders, isStoreEnabled: options.withStore }));
60
+ hasProviders, isStoreEnabled: options.withStore, sharedTranslationsKey }));
60
61
  if (!hasProviders) {
61
62
  tree.delete(`${appRoot}/app/[locale]/providers.tsx`);
62
63
  }
63
64
  (0, utils_1.addNxAppTag)(tree, options.directory);
64
- (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'i18n'), i18nRoot, Object.assign(Object.assign({}, options), { formatName: utils_1.formatName }));
65
+ (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'i18n'), i18nRoot, Object.assign(Object.assign({}, options), { formatName: utils_1.formatName,
66
+ sharedTranslationsKey }));
65
67
  // Add dependencies
66
68
  (0, devkit_1.addDependenciesToPackageJson)(tree, dependencies_1.dependencies['next-app'], dependencies_1.devDependencies['next-app']);
67
69
  yield (0, devkit_1.formatFiles)(tree);
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/next-app/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../plugin/src/generators/next-app/generator.ts"],"names":[],"mappings":"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"}