@gtkx/cli 2.0.0-beta.2 → 2.0.0-beta.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.
Files changed (144) hide show
  1. package/dist/cli.d.ts +1 -1
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +12 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/codegen/config-dependencies.d.ts +3 -0
  6. package/dist/codegen/config-dependencies.d.ts.map +1 -0
  7. package/dist/codegen/config-dependencies.js +355 -0
  8. package/dist/codegen/config-dependencies.js.map +1 -0
  9. package/dist/codegen/reference.d.ts.map +1 -1
  10. package/dist/codegen/reference.js +1 -0
  11. package/dist/codegen/reference.js.map +1 -1
  12. package/dist/codegen/run-codegen.d.ts +3 -2
  13. package/dist/codegen/run-codegen.d.ts.map +1 -1
  14. package/dist/codegen/run-codegen.js +33 -14
  15. package/dist/codegen/run-codegen.js.map +1 -1
  16. package/dist/codegen/store-resolver.d.ts +2 -0
  17. package/dist/codegen/store-resolver.d.ts.map +1 -1
  18. package/dist/codegen/store-resolver.js +6 -3
  19. package/dist/codegen/store-resolver.js.map +1 -1
  20. package/dist/commands/cleanup.d.ts +9 -0
  21. package/dist/commands/cleanup.d.ts.map +1 -0
  22. package/dist/commands/cleanup.js +31 -0
  23. package/dist/commands/cleanup.js.map +1 -0
  24. package/dist/commands/dev.d.ts +1 -0
  25. package/dist/commands/dev.d.ts.map +1 -1
  26. package/dist/commands/dev.js +13 -4
  27. package/dist/commands/dev.js.map +1 -1
  28. package/dist/commands/docs.d.ts.map +1 -1
  29. package/dist/commands/docs.js +1 -0
  30. package/dist/commands/docs.js.map +1 -1
  31. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  32. package/dist/deploy/freedesktop/validate.js +11 -4
  33. package/dist/deploy/freedesktop/validate.js.map +1 -1
  34. package/dist/deploy/nfpm/config.d.ts +3 -2
  35. package/dist/deploy/nfpm/config.d.ts.map +1 -1
  36. package/dist/deploy/nfpm/config.js +3 -3
  37. package/dist/deploy/nfpm/config.js.map +1 -1
  38. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  39. package/dist/deploy/node-runtime/index.js +2 -1
  40. package/dist/deploy/node-runtime/index.js.map +1 -1
  41. package/dist/deploy/payload/stage.d.ts.map +1 -1
  42. package/dist/deploy/payload/stage.js +24 -3
  43. package/dist/deploy/payload/stage.js.map +1 -1
  44. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  45. package/dist/deploy/settings/extra-files.js +4 -3
  46. package/dist/deploy/settings/extra-files.js.map +1 -1
  47. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -1
  48. package/dist/deploy/targets/nfpm-target.js +12 -7
  49. package/dist/deploy/targets/nfpm-target.js.map +1 -1
  50. package/dist/dev/entry-env.d.ts +2 -1
  51. package/dist/dev/entry-env.d.ts.map +1 -1
  52. package/dist/dev/entry-env.js +2 -1
  53. package/dist/dev/entry-env.js.map +1 -1
  54. package/dist/dev/runner-deps.d.ts +1 -1
  55. package/dist/dev/runner-deps.d.ts.map +1 -1
  56. package/dist/dev/runner-deps.js +3 -3
  57. package/dist/dev/runner-deps.js.map +1 -1
  58. package/dist/dev/runner-main.d.ts.map +1 -1
  59. package/dist/dev/runner-main.js +8 -3
  60. package/dist/dev/runner-main.js.map +1 -1
  61. package/dist/dev/supervisor.d.ts +3 -1
  62. package/dist/dev/supervisor.d.ts.map +1 -1
  63. package/dist/dev/supervisor.js +124 -27
  64. package/dist/dev/supervisor.js.map +1 -1
  65. package/dist/i18n/catalogs.d.ts.map +1 -1
  66. package/dist/i18n/catalogs.js +1 -0
  67. package/dist/i18n/catalogs.js.map +1 -1
  68. package/dist/i18n/source-messages.d.ts +3 -1
  69. package/dist/i18n/source-messages.d.ts.map +1 -1
  70. package/dist/i18n/source-messages.js +167 -37
  71. package/dist/i18n/source-messages.js.map +1 -1
  72. package/dist/internal/build-output.d.ts.map +1 -1
  73. package/dist/internal/build-output.js +53 -6
  74. package/dist/internal/build-output.js.map +1 -1
  75. package/dist/internal/docs-elements.d.ts +1 -0
  76. package/dist/internal/docs-elements.d.ts.map +1 -1
  77. package/dist/internal/docs-elements.js +5 -4
  78. package/dist/internal/docs-elements.js.map +1 -1
  79. package/dist/internal/errors.d.ts +2 -1
  80. package/dist/internal/errors.d.ts.map +1 -1
  81. package/dist/internal/errors.js +1 -1
  82. package/dist/internal/errors.js.map +1 -1
  83. package/dist/internal/parent-process.d.ts +12 -0
  84. package/dist/internal/parent-process.d.ts.map +1 -0
  85. package/dist/internal/parent-process.js +74 -0
  86. package/dist/internal/parent-process.js.map +1 -0
  87. package/dist/internal/prepare-project.d.ts +1 -0
  88. package/dist/internal/prepare-project.d.ts.map +1 -1
  89. package/dist/internal/prepare-project.js +8 -2
  90. package/dist/internal/prepare-project.js.map +1 -1
  91. package/dist/vite-plugins/ensure-store.d.ts +1 -1
  92. package/dist/vite-plugins/ensure-store.d.ts.map +1 -1
  93. package/dist/vite-plugins/ensure-store.js +2 -2
  94. package/dist/vite-plugins/ensure-store.js.map +1 -1
  95. package/dist/vite-plugins/i18n.d.ts +1 -1
  96. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  97. package/dist/vite-plugins/i18n.js +24 -11
  98. package/dist/vite-plugins/i18n.js.map +1 -1
  99. package/dist/vite-plugins/index.d.ts.map +1 -1
  100. package/dist/vite-plugins/index.js +3 -1
  101. package/dist/vite-plugins/index.js.map +1 -1
  102. package/dist/vite-plugins/native.d.ts.map +1 -1
  103. package/dist/vite-plugins/native.js +0 -4
  104. package/dist/vite-plugins/native.js.map +1 -1
  105. package/dist/vite-plugins/settings-worker-env.d.ts +1 -1
  106. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  107. package/dist/vite-plugins/settings-worker-env.js +2 -2
  108. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  109. package/dist/vitest-plugin.d.ts +2 -1
  110. package/dist/vitest-plugin.d.ts.map +1 -1
  111. package/dist/vitest-plugin.js +6 -6
  112. package/dist/vitest-plugin.js.map +1 -1
  113. package/package.json +12 -9
  114. package/src/cli.ts +12 -2
  115. package/src/codegen/config-dependencies.ts +470 -0
  116. package/src/codegen/reference.ts +1 -0
  117. package/src/codegen/run-codegen.ts +39 -17
  118. package/src/codegen/store-resolver.ts +8 -3
  119. package/src/commands/cleanup.ts +36 -0
  120. package/src/commands/dev.ts +26 -4
  121. package/src/commands/docs.ts +1 -0
  122. package/src/deploy/freedesktop/validate.ts +13 -4
  123. package/src/deploy/nfpm/config.ts +9 -3
  124. package/src/deploy/node-runtime/index.ts +2 -1
  125. package/src/deploy/payload/stage.ts +42 -3
  126. package/src/deploy/settings/extra-files.ts +5 -3
  127. package/src/deploy/targets/nfpm-target.ts +13 -6
  128. package/src/dev/entry-env.ts +2 -1
  129. package/src/dev/runner-deps.ts +3 -3
  130. package/src/dev/runner-main.ts +10 -3
  131. package/src/dev/supervisor.ts +164 -30
  132. package/src/i18n/catalogs.ts +1 -0
  133. package/src/i18n/source-messages.ts +240 -41
  134. package/src/internal/build-output.ts +79 -7
  135. package/src/internal/docs-elements.ts +10 -4
  136. package/src/internal/errors.ts +1 -1
  137. package/src/internal/parent-process.ts +110 -0
  138. package/src/internal/prepare-project.ts +9 -3
  139. package/src/vite-plugins/ensure-store.ts +2 -2
  140. package/src/vite-plugins/i18n.ts +30 -14
  141. package/src/vite-plugins/index.ts +8 -1
  142. package/src/vite-plugins/native.ts +0 -5
  143. package/src/vite-plugins/settings-worker-env.ts +2 -2
  144. package/src/vitest-plugin.ts +6 -6
@@ -1,9 +1,12 @@
1
+ import { armParentDeath } from "@gtkx/native/internal";
2
+ import { reapStaleHeadlessDisplays } from "@gtkx/vitest/headless";
1
3
  import { defineCommand } from "citty";
2
4
  import { resolveConfigWatch } from "../codegen/run-codegen.js";
3
5
  import { startHeadlessDevDisplay } from "../dev/headless.js";
4
6
  import { type DevWatch, runDevSupervisor } from "../dev/supervisor.js";
5
7
  import { splitApplicationArgs } from "../internal/application-args.js";
6
- import { entryArg } from "../internal/entry-arg.js";
8
+ import { configArg, entryArg } from "../internal/entry-arg.js";
9
+ import { getInitialProcessGroupOwner, initialParentId } from "../internal/parent-process.js";
7
10
  import { prepareProject } from "../internal/prepare-project.js";
8
11
 
9
12
  const DEV_MODE = "development";
@@ -15,6 +18,7 @@ const dev = defineCommand({
15
18
  },
16
19
  args: {
17
20
  ...entryArg,
21
+ ...configArg,
18
22
  headless: {
19
23
  type: "boolean",
20
24
  description: "Run on an isolated headless Wayland display",
@@ -25,17 +29,35 @@ const dev = defineCommand({
25
29
  },
26
30
  },
27
31
  async run({ args }) {
32
+ reapStaleHeadlessDisplays();
33
+ const initialProcessGroupOwner = getInitialProcessGroupOwner();
34
+
35
+ if (
36
+ !armParentDeath(
37
+ initialParentId,
38
+ initialProcessGroupOwner?.pid,
39
+ initialProcessGroupOwner?.startTime,
40
+ )
41
+ ) {
42
+ throw new Error("The process that launched gtkx dev exited during startup");
43
+ }
44
+
28
45
  if (args.size !== undefined && !args.headless) {
29
46
  throw new Error("--size requires --headless");
30
47
  }
31
48
 
32
- const { cwd, entry: entryPath } = await prepareProject(args, DEV_MODE);
33
- const watch: DevWatch | undefined = await resolveConfigWatch(cwd, DEV_MODE);
49
+ const { cwd, entry: entryPath, configFile, configDependencies } = await prepareProject(args, DEV_MODE);
50
+ const watch: DevWatch | undefined = await resolveConfigWatch(
51
+ cwd,
52
+ DEV_MODE,
53
+ configFile,
54
+ configDependencies,
55
+ );
34
56
  const { applicationArgs } = splitApplicationArgs(process.argv.slice(2));
35
57
  const stopHeadless = args.headless ? await startHeadlessDevDisplay(args.size) : undefined;
36
58
 
37
59
  try {
38
- await runDevSupervisor({ entryPath, cwd, args: applicationArgs, watch });
60
+ await runDevSupervisor({ entryPath, cwd, configFile, args: applicationArgs, watch });
39
61
  } finally {
40
62
  stopHeadless?.();
41
63
  }
@@ -68,6 +68,7 @@ const docs = defineCommand({
68
68
  outDir,
69
69
  basePath: args["base-path"],
70
70
  props: builtin.props,
71
+ acceptedChildTypes: builtin.acceptedChildTypes,
71
72
  omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),
72
73
  isForced: args.force,
73
74
  });
@@ -12,6 +12,7 @@ type MetainfoResult = {
12
12
  status: number;
13
13
  errors: string[];
14
14
  warnings: string[];
15
+ rules: string[];
15
16
  areWarningsFatal: boolean;
16
17
  };
17
18
 
@@ -25,6 +26,7 @@ const DIAGNOSTIC = /^(?<severity>[EIPW]): \S+ (?<rule>[\w-]+)/;
25
26
  const ERROR_SEVERITY = "E";
26
27
  const WARNING_SEVERITY = "W";
27
28
  const INFO_SEVERITY = "I";
29
+ const FATAL_WARNING_RULES: Set<string> = new Set(["unknown-tag"]);
28
30
 
29
31
  const REMEDY_FOR_RULE: Record<string, string> = {
30
32
  "component-summary-missing": "set `deploy.summary`",
@@ -33,6 +35,7 @@ const REMEDY_FOR_RULE: Record<string, string> = {
33
35
  "metainfo-legacy-path": "this file is generated; report it as a gtkx bug",
34
36
  "summary-has-dot-suffix": "drop the trailing period from `deploy.summary`",
35
37
  "summary-too-long": "shorten `deploy.summary`",
38
+ "unknown-tag": "remove the unsupported `deploy.metainfoExtra` element or use a `<custom>` value",
36
39
  "url-homepage-missing": "set `deploy.homepage`, or `homepage` in package.json",
37
40
  };
38
41
 
@@ -64,11 +67,15 @@ const remedyLines = (rules: string[]): string[] => {
64
67
  const invalid = (subject: string, output: string, rules: string[]): Error =>
65
68
  new Error([`${subject} is not valid:`, output.length > 0 ? output : "no output", ...remedyLines(rules)].join("\n"));
66
69
 
67
- const isFatalResult = ({ status, errors, warnings, areWarningsFatal }: MetainfoResult): boolean => {
70
+ const isFatalResult = ({ status, errors, warnings, rules, areWarningsFatal }: MetainfoResult): boolean => {
68
71
  if (errors.length > 0) {
69
72
  return true;
70
73
  }
71
74
 
75
+ if (rules.some((rule) => FATAL_WARNING_RULES.has(rule))) {
76
+ return true;
77
+ }
78
+
72
79
  if (areWarningsFatal && warnings.length > 0) {
73
80
  return true;
74
81
  }
@@ -78,7 +85,7 @@ const isFatalResult = ({ status, errors, warnings, areWarningsFatal }: MetainfoR
78
85
 
79
86
  const assertNotFatal = (result: MetainfoResult): void => {
80
87
  if (isFatalResult(result)) {
81
- throw invalid(result.subject, result.output, [...result.errors, ...result.warnings]);
88
+ throw invalid(result.subject, result.output, result.rules);
82
89
  }
83
90
  };
84
91
 
@@ -117,8 +124,10 @@ const validateMetainfo = (path: string, areWarningsFatal: boolean): void => {
117
124
 
118
125
  const errors = rulesIn(output, [ERROR_SEVERITY]);
119
126
  const warnings = rulesIn(output, [WARNING_SEVERITY]);
120
- assertNotFatal({ subject, output, status, errors, warnings, areWarningsFatal });
121
- reportDiagnostics(subject, [...warnings, ...rulesIn(output, [INFO_SEVERITY])]);
127
+ const infos = rulesIn(output, [INFO_SEVERITY]);
128
+ const rules = [...errors, ...warnings, ...infos];
129
+ assertNotFatal({ subject, output, status, errors, warnings, rules, areWarningsFatal });
130
+ reportDiagnostics(subject, [...warnings, ...infos]);
122
131
  };
123
132
 
124
133
  export { validateDesktopEntry, validateMetainfo };
@@ -114,6 +114,9 @@ const stagedFilesFor = (payload: DeployPayload, packager: NfpmPackager): StagedF
114
114
  ...payload.overlays[packager],
115
115
  ];
116
116
 
117
+ const glibcMinimumForPackage = (payload: DeployPayload, packager: NfpmPackager): string | null =>
118
+ glibcMinimumForFiles(stagedFilesFor(payload, packager).map((file) => file.abs));
119
+
117
120
  const packagerSettings = (settings: DeploySettings, packager: NfpmPackager): NfpmConfig =>
118
121
  packager === "rpm" ? rpmSettings(settings) : debSettings(settings);
119
122
 
@@ -123,11 +126,14 @@ const releaseFor = (settings: DeploySettings, packager: NfpmPackager): string =>
123
126
  const descriptionFor = (settings: DeploySettings, packager: NfpmPackager): string =>
124
127
  packager === "rpm" ? rpmDescription(settings) : debDescription(settings);
125
128
 
126
- const renderNfpmConfig = (payload: DeployPayload, packager: NfpmPackager): NfpmConfig => {
129
+ const renderNfpmConfig = (
130
+ payload: DeployPayload,
131
+ packager: NfpmPackager,
132
+ glibcMinimum: string | null,
133
+ ): NfpmConfig => {
127
134
  const settings = payload.settings;
128
135
  const isRpm = packager === "rpm";
129
136
  const staged = stagedFilesFor(payload, packager);
130
- const glibcMinimum = glibcMinimumForFiles(staged.map((file) => file.abs));
131
137
  const depends = resolveDepends(settings, glibcMinimum);
132
138
 
133
139
  return {
@@ -153,4 +159,4 @@ const renderNfpmConfig = (payload: DeployPayload, packager: NfpmPackager): NfpmC
153
159
  };
154
160
  };
155
161
 
156
- export { type NfpmPackager, packageNameFor, renderNfpmConfig };
162
+ export { glibcMinimumForPackage, type NfpmPackager, packageNameFor, renderNfpmConfig };
@@ -178,7 +178,8 @@ const resolveNodeRuntime = async (settings: DeploySettings): Promise<NodeRuntime
178
178
  const staged = await stageFromSource(settings, version, source);
179
179
  const isStripped = node.shouldStrip === false ? false : didStripBinary(staged.path);
180
180
  const elf = readElfInfo(staged.path);
181
- info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, glibc >= ${elf.glibcMinimum ?? "unknown"})`);
181
+ const glibcMinimum = elf.glibcMinimum ?? "unknown";
182
+ info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, runtime glibc >= ${glibcMinimum})`);
182
183
 
183
184
  return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };
184
185
  };
@@ -1,4 +1,4 @@
1
- import { sortStringsBy } from "@gtkx/utils";
1
+ import { sortStringsBy, warn } from "@gtkx/utils";
2
2
  import { existsSync, rmSync } from "node:fs";
3
3
  import { join, resolve } from "node:path";
4
4
  import type { DeploySettings, DeployTargetName, NodeRuntime, NoticeSection, StagedFile } from "../types.js";
@@ -82,9 +82,48 @@ const stageMetadata = (settings: DeploySettings, root: string, metadata: StagedM
82
82
  : [writeInto(root, join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`), metadata.mimePackage)]),
83
83
  ];
84
84
 
85
- const stageExtraFiles = (settings: DeploySettings, root: string): StagedFile[] =>
85
+ const generatedMetadataKind = (
86
+ settings: DeploySettings,
87
+ metadata: StagedMetadata,
88
+ destination: string,
89
+ ): string | null => {
90
+ if (destination === join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`)) {
91
+ return "desktop entry";
92
+ }
93
+
94
+ if (destination === join(SHARE_METAINFO, `${settings.applicationId}.metainfo.xml`)) {
95
+ return "metainfo";
96
+ }
97
+
98
+ if (
99
+ metadata.mimePackage !== null &&
100
+ destination === join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`)
101
+ ) {
102
+ return "MIME package";
103
+ }
104
+
105
+ return null;
106
+ };
107
+
108
+ const warnMetadataCollision = (
109
+ settings: DeploySettings,
110
+ metadata: StagedMetadata,
111
+ file: DeploySettings["extraFiles"][number],
112
+ ): void => {
113
+ const kind = generatedMetadataKind(settings, metadata, file.destination);
114
+
115
+ if (kind !== null) {
116
+ warn(
117
+ `extraFiles source "${file.source}" targeting "${file.destination}" is overridden by the ` +
118
+ `GTKX-generated ${kind}`,
119
+ );
120
+ }
121
+ };
122
+
123
+ const stageExtraFiles = (settings: DeploySettings, root: string, metadata: StagedMetadata): StagedFile[] =>
86
124
  settings.extraFiles.map((file) => {
87
125
  const source = resolve(settings.paths.root, file.source);
126
+ warnMetadataCollision(settings, metadata, file);
88
127
 
89
128
  return copyInto(root, file.destination, source, file.mode ?? executableModeFor(source));
90
129
  });
@@ -108,7 +147,7 @@ const stagePayload = ({ settings, node, metadata }: StageRequest): StagedFile[]
108
147
  ...stageNodeBinary(settings, root, node),
109
148
  ...stageRuntimeFiles(settings, root),
110
149
  ...stageCatalogs(settings, root),
111
- ...stageExtraFiles(settings, root),
150
+ ...stageExtraFiles(settings, root, metadata),
112
151
  ...stageMetadata(settings, root, metadata),
113
152
  ...stageIcons(settings, root),
114
153
  ...stageSchemas(settings, root),
@@ -1,5 +1,5 @@
1
1
  import { statSync } from "node:fs";
2
- import { resolve } from "node:path";
2
+ import { normalize, resolve } from "node:path";
3
3
  import type { DeployConfig, DeployExtraFile } from "../types.js";
4
4
 
5
5
  type ExtraFiles = NonNullable<DeployConfig["extraFiles"]>;
@@ -22,13 +22,15 @@ const assertSourceFile = (root: string, file: DeployExtraFile): void => {
22
22
  };
23
23
 
24
24
  const resolveExtraFile = (destination: string, entry: ExtraFileEntry): DeployExtraFile => {
25
+ const normalizedDestination = normalize(destination);
26
+
25
27
  if (typeof entry === "string") {
26
- return { destination, source: entry, mode: null };
28
+ return { destination: normalizedDestination, source: entry, mode: null };
27
29
  }
28
30
 
29
31
  const mode = entry.mode === undefined ? null : Number.parseInt(entry.mode, OCTAL_RADIX);
30
32
 
31
- return { destination, source: entry.source, mode };
33
+ return { destination: normalizedDestination, source: entry.source, mode };
32
34
  };
33
35
 
34
36
  const resolveExtraFiles = (root: string, deploy: DeployConfig): DeployExtraFile[] => {
@@ -1,7 +1,8 @@
1
+ import { info } from "@gtkx/utils";
1
2
  import { join } from "node:path";
2
3
  import { stringify } from "yaml";
3
4
  import type { DeployArtifact, DeployManifest, DeployPayload, DeployTarget } from "../types.js";
4
- import { type NfpmPackager, renderNfpmConfig } from "../nfpm/config.js";
5
+ import { glibcMinimumForPackage, type NfpmPackager, renderNfpmConfig } from "../nfpm/config.js";
5
6
  import { packWithNfpm } from "../nfpm/pack.js";
6
7
  import { TAR } from "../tools.js";
7
8
 
@@ -11,12 +12,18 @@ const PREFIX = "/usr";
11
12
  const manifestPathFor = (payload: DeployPayload, packager: NfpmPackager): string =>
12
13
  join(payload.settings.paths.targets, packager, MANIFEST_FILENAME);
13
14
 
14
- const renderManifests = (payload: DeployPayload, packager: NfpmPackager): DeployManifest[] => [
15
- {
15
+ const renderManifests = (payload: DeployPayload, packager: NfpmPackager): DeployManifest[] => {
16
+ const glibcMinimum = glibcMinimumForPackage(payload, packager);
17
+
18
+ if (glibcMinimum !== null) {
19
+ info(`${packager} package requires glibc >= ${glibcMinimum}`);
20
+ }
21
+
22
+ return [{
16
23
  path: manifestPathFor(payload, packager),
17
- contents: stringify(renderNfpmConfig(payload, packager), { lineWidth: 0 }),
18
- },
19
- ];
24
+ contents: stringify(renderNfpmConfig(payload, packager, glibcMinimum), { lineWidth: 0 }),
25
+ }];
26
+ };
20
27
 
21
28
  const packPackage = async (payload: DeployPayload, packager: NfpmPackager): Promise<DeployArtifact[]> => [
22
29
  await packWithNfpm(payload, packager, manifestPathFor(payload, packager)),
@@ -1,3 +1,4 @@
1
1
  const DEV_ENTRY_ENV = "GTKX_DEV_ENTRY";
2
+ const DEV_CONFIG_ENV = "GTKX_DEV_CONFIG";
2
3
 
3
- export { DEV_ENTRY_ENV };
4
+ export { DEV_CONFIG_ENV, DEV_ENTRY_ENV };
@@ -43,11 +43,11 @@ const waitForApplicationId = async (timeoutMs: number, shouldKeepWaiting: () =>
43
43
 
44
44
  const readFileRevision = (path: string): Promise<string> => readFile(path, "utf8");
45
45
 
46
- const defaultDevRunnerDeps = (): DevRunnerDeps => ({
46
+ const defaultDevRunnerDeps = (configFile: string): DevRunnerDeps => ({
47
47
  createServer,
48
48
  waitForApplicationId,
49
49
  getConfiguredApplicationId: async (root: string) => {
50
- const loaded = await loadConfig(root, { mode: DEV_MODE });
50
+ const loaded = await loadConfig(root, { mode: DEV_MODE, configFile });
51
51
 
52
52
  return loaded.config.applicationId;
53
53
  },
@@ -87,7 +87,7 @@ const defaultDevRunnerDeps = (): DevRunnerDeps => ({
87
87
  staleExportName,
88
88
  readFileRevision,
89
89
  plugins: (entryPath) => [
90
- ...gtkxVitePlugins({ mode: DEV_MODE, entryPath }),
90
+ ...gtkxVitePlugins({ mode: DEV_MODE, entryPath, configFile }),
91
91
  ...gtkxFastRefresh(),
92
92
  gtkxReactDomPrebundle(),
93
93
  ],
@@ -1,7 +1,7 @@
1
1
  import { loadConfig } from "@gtkx/config";
2
2
  import { error } from "@gtkx/utils";
3
3
  import { resolve } from "node:path";
4
- import { DEV_ENTRY_ENV } from "./entry-env.js";
4
+ import { DEV_CONFIG_ENV, DEV_ENTRY_ENV } from "./entry-env.js";
5
5
  import { prepareDevIconDir } from "./icon-dir.js";
6
6
  import { prepareDevLocaleDir } from "./locale-dir.js";
7
7
  import { createDevRunner } from "./runner.js";
@@ -22,13 +22,20 @@ const main = async (): Promise<void> => {
22
22
  process.exit(1);
23
23
  }
24
24
 
25
- const { config, root } = await loadConfig(cwd, { mode: "development" });
25
+ const configFile = process.env[DEV_CONFIG_ENV];
26
+
27
+ if (!configFile) {
28
+ error(`Missing ${DEV_CONFIG_ENV}`);
29
+ process.exit(1);
30
+ }
31
+
32
+ const { config, root } = await loadConfig(cwd, { mode: "development", configFile });
26
33
  prepareDevLocaleDir(root, config.applicationId);
27
34
  prepareDevSchemaDir(root);
28
35
  prepareDevIconDir(root, config.applicationId, config.applicationIcon);
29
36
  const entryPath = resolve(cwd, entryArg);
30
37
  const { defaultDevRunnerDeps } = await import("./runner-deps.js");
31
- const runner = createDevRunner(defaultDevRunnerDeps());
38
+ const runner = createDevRunner(defaultDevRunnerDeps(configFile));
32
39
  await runner.run(entryPath);
33
40
  };
34
41