@temir.ra/create-template 0.5.5 → 0.6.1

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.
@@ -1,212 +1,212 @@
1
- import { cpSync, existsSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import {
4
- build,
5
- type BuildFailure,
6
- type OnResolveArgs,
7
- type OnResolveResult,
8
- type Plugin as EsbuildPlugin,
9
- type PluginBuild,
10
- type BuildOptions,
11
- type BuildResult
12
- } from 'esbuild';
13
-
14
- import IMPORT_MAP from './import-map.json';
15
-
16
-
17
- interface ExportConditions {
18
- [key: string]: string | undefined;
19
- entrypoint?: string;
20
- types?: string;
21
- browser?: string;
22
- import?: string;
23
- }
24
- interface Dependency {
25
- [key: string]: string;
26
- }
27
- interface PackageManifest {
28
- version: string;
29
- exports?: Record<string, ExportConditions>;
30
- dependencies?: Dependency;
31
- devDependencies?: Dependency;
32
- peerDependencies?: Dependency;
33
- }
34
-
35
- function getManifest(packageIdentifier?: string): PackageManifest {
36
-
37
- const manifestPath = packageIdentifier
38
- ? join('node_modules', packageIdentifier, 'package.json')
39
- : 'package.json'
40
- ;
41
-
42
- let manifest: PackageManifest;
43
-
44
- try {
45
- manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
46
- } catch {
47
- throw new Error(`[scripts/build-bundle.ts] Failed to read package manifest at '${manifestPath}'.`);
48
- }
49
-
50
- return manifest;
51
-
52
- }
53
- function getManifestEntrypoints(packageManifest: PackageManifest): string[] {
54
-
55
- const exports = packageManifest.exports;
56
- if (!exports)
57
- throw new Error(`[scripts/build-bundle.ts] Failed to read entrypoints from package manifest: 'exports' field is missing.`);
58
-
59
- const entrypoints = Object.entries(exports)
60
- .filter(([_, conditions]) => conditions.entrypoint)
61
- .map(([_, conditions]) => conditions.entrypoint as string);
62
-
63
- return entrypoints;
64
-
65
- }
66
- function getPackageVersion(manifest: PackageManifest, packageIdentifier?: string): string {
67
-
68
- let version: string | undefined;
69
- if (packageIdentifier) {
70
-
71
- const dependencies = {
72
- ...manifest.dependencies,
73
- ...manifest.devDependencies,
74
- ...manifest.peerDependencies,
75
- };
76
-
77
- version = dependencies[packageIdentifier];
78
- if (!version)
79
- throw new Error(`[scripts/build-bundle.ts] Failed to read version for package '${packageIdentifier}': package is not listed in dependencies.`);
80
-
81
- }
82
- else {
83
- if (!manifest.version)
84
- throw new Error('[scripts/build-bundle.ts] Failed to read package version from manifest: version field is missing.');
85
- version = manifest.version;
86
- }
87
-
88
- return version;
89
-
90
- }
91
-
92
- function resolveVersionInCdnUrl(importSpecifier: string, cdnUrl: string): string {
93
- if (cdnUrl.includes('<VERSION>')) {
94
- const manifest = getManifest();
95
- const version = getPackageVersion(manifest, importSpecifier);
96
- let resolvedVersion = version;
97
- if (resolvedVersion.startsWith('workspace:')) resolvedVersion = resolvedVersion.replace(/^workspace:/, '');
98
- if (resolvedVersion.startsWith('^') || resolvedVersion.startsWith('~')) resolvedVersion = resolvedVersion.substring(1);
99
- if (resolvedVersion.length === 0)
100
- throw new Error(`[scripts/build-bundle.ts] Failed to resolve version for package '${importSpecifier}': resolved version is empty.`);
101
- return cdnUrl.replace('<VERSION>', resolvedVersion);
102
- }
103
- return cdnUrl;
104
- }
105
-
106
- const esbuildLog: EsbuildPlugin = {
107
- name: 'esbuild-log',
108
- setup(build: PluginBuild) {
109
- const buildFormat = build.initialOptions.format ? `${build.initialOptions.format} ` : '';
110
- build.onStart(() => {
111
- console.log(`[esbuild-log plugin] ${buildFormat}build started...`);
112
- });
113
- build.onEnd((result: BuildResult<BuildOptions>) => {
114
- if (result.errors.length > 0) {
115
- console.error(`[esbuild-log plugin] ${buildFormat}build failed.`);
116
- } else {
117
- console.log(`[esbuild-log plugin] ${buildFormat}build finished.`);
118
- }
119
- });
120
- }
121
- }
122
- const COPY_FILES: string[] = [
123
- "buildinfo.txt",
124
- "buildinfo-template.txt",
125
- "CHANGELOG.md",
126
- "template/"
127
- ];
128
- const copyFiles: EsbuildPlugin = {
129
- name: 'copy-files',
130
- setup(build: PluginBuild) {
131
- build.onEnd((result: BuildResult<BuildOptions>) => {
132
- const outDir = build.initialOptions.outdir || 'dist/';
133
- console.log(`[copy-files plugin] Copying additional files to '${outDir}'...`);
134
- for (const file of COPY_FILES) {
135
- const destination = join(outDir, file);
136
- if (existsSync(file)) {
137
- cpSync(file, destination, { recursive: true });
138
- console.log(`[copy-files plugin] Copied '${file}' to '${destination}'.`);
139
- } else {
140
- console.warn(`[copy-files plugin] File '${file}' does not exist. Skipping...`);
141
- }
142
- }
143
- });
144
- }
145
- }
146
- const importMap: EsbuildPlugin = {
147
- name: 'import-map',
148
- setup(build: PluginBuild) {
149
-
150
- for (const [importSpecifier, urlTemplate] of Object.entries(IMPORT_MAP) as [string, string | null][]) {
151
-
152
- const url = urlTemplate ? resolveVersionInCdnUrl(importSpecifier, urlTemplate) : null;
153
- console.log(`[import-map plugin] '${importSpecifier}' → ${url ? `'${url}'` : 'external (no rewrite)'}`);
154
-
155
- const escapedSpecifier = importSpecifier.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
156
- build.onResolve(
157
- { filter: new RegExp(`^${escapedSpecifier}$`) },
158
- (args: OnResolveArgs): OnResolveResult | undefined => {
159
- return { path: url ?? args.path, external: true };
160
- }
161
- );
162
-
163
- }
164
-
165
- },
166
- };
167
-
168
-
169
- const entrypoints = getManifestEntrypoints(getManifest());
170
- console.log('[scripts/build-bundle.ts] Entrypoints:', entrypoints);
171
-
172
- const buildOptions: BuildOptions = {
173
- entryPoints: entrypoints,
174
- outdir: 'dist/',
175
- entryNames: '[dir]/[name].bundle',
176
- platform: 'node',
177
- format: 'esm',
178
- bundle: true,
179
- minify: true,
180
- sourcemap: 'external',
181
- plugins: [esbuildLog, copyFiles, importMap],
182
- };
183
-
184
- try {
185
- await build(buildOptions);
186
- } catch (error) {
187
- console.error('[scripts/build-bundle.ts] Build failed:');
188
- for (const message of (error as BuildFailure).errors) {
189
- console.error(message);
190
- }
191
- process.exit(1);
192
- }
193
-
194
- const omitIife = process.argv.includes('--omit-iife');
195
- if (!omitIife) {
196
- try {
197
- await build({
198
- ...buildOptions,
199
- entryNames: '[dir]/[name].bundle.iife',
200
- format: 'iife',
201
- banner: { js: 'var __importMetaUrl = document.currentScript && document.currentScript.src || \'\';' },
202
- define: { 'import.meta.url': '__importMetaUrl' },
203
- plugins: [esbuildLog, importMap],
204
- });
205
- } catch (error) {
206
- console.error('[scripts/build-bundle.ts] Build failed:');
207
- for (const message of (error as BuildFailure).errors) {
208
- console.error(message);
209
- }
210
- process.exit(1);
211
- }
212
- }
1
+ import { cpSync, existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import {
4
+ build,
5
+ type BuildFailure,
6
+ type OnResolveArgs,
7
+ type OnResolveResult,
8
+ type Plugin as EsbuildPlugin,
9
+ type PluginBuild,
10
+ type BuildOptions,
11
+ type BuildResult
12
+ } from 'esbuild';
13
+
14
+ import IMPORT_MAP from './import-map.json';
15
+
16
+
17
+ interface ExportConditions {
18
+ [key: string]: string | undefined;
19
+ entrypoint?: string;
20
+ types?: string;
21
+ browser?: string;
22
+ import?: string;
23
+ }
24
+ interface Dependency {
25
+ [key: string]: string;
26
+ }
27
+ interface PackageManifest {
28
+ version: string;
29
+ exports?: Record<string, ExportConditions>;
30
+ dependencies?: Dependency;
31
+ devDependencies?: Dependency;
32
+ peerDependencies?: Dependency;
33
+ }
34
+
35
+ function getManifest(packageIdentifier?: string): PackageManifest {
36
+
37
+ const manifestPath = packageIdentifier
38
+ ? join('node_modules', packageIdentifier, 'package.json')
39
+ : 'package.json'
40
+ ;
41
+
42
+ let manifest: PackageManifest;
43
+
44
+ try {
45
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
46
+ } catch {
47
+ throw new Error(`[scripts/build-bundle.ts] Failed to read package manifest at '${manifestPath}'.`);
48
+ }
49
+
50
+ return manifest;
51
+
52
+ }
53
+ function getManifestEntrypoints(packageManifest: PackageManifest): string[] {
54
+
55
+ const exports = packageManifest.exports;
56
+ if (!exports)
57
+ throw new Error(`[scripts/build-bundle.ts] Failed to read entrypoints from package manifest: 'exports' field is missing.`);
58
+
59
+ const entrypoints = Object.entries(exports)
60
+ .filter(([_, conditions]) => conditions.entrypoint)
61
+ .map(([_, conditions]) => conditions.entrypoint as string);
62
+
63
+ return entrypoints;
64
+
65
+ }
66
+ function getPackageVersion(manifest: PackageManifest, packageIdentifier?: string): string {
67
+
68
+ let version: string | undefined;
69
+ if (packageIdentifier) {
70
+
71
+ const dependencies = {
72
+ ...manifest.dependencies,
73
+ ...manifest.devDependencies,
74
+ ...manifest.peerDependencies,
75
+ };
76
+
77
+ version = dependencies[packageIdentifier];
78
+ if (!version)
79
+ throw new Error(`[scripts/build-bundle.ts] Failed to read version for package '${packageIdentifier}': package is not listed in dependencies.`);
80
+
81
+ }
82
+ else {
83
+ if (!manifest.version)
84
+ throw new Error('[scripts/build-bundle.ts] Failed to read package version from manifest: version field is missing.');
85
+ version = manifest.version;
86
+ }
87
+
88
+ return version;
89
+
90
+ }
91
+
92
+ function resolveVersionInCdnUrl(importSpecifier: string, cdnUrl: string): string {
93
+ if (cdnUrl.includes('<VERSION>')) {
94
+ const manifest = getManifest();
95
+ const version = getPackageVersion(manifest, importSpecifier);
96
+ let resolvedVersion = version;
97
+ if (resolvedVersion.startsWith('workspace:')) resolvedVersion = resolvedVersion.replace(/^workspace:/, '');
98
+ if (resolvedVersion.startsWith('^') || resolvedVersion.startsWith('~')) resolvedVersion = resolvedVersion.substring(1);
99
+ if (resolvedVersion.length === 0)
100
+ throw new Error(`[scripts/build-bundle.ts] Failed to resolve version for package '${importSpecifier}': resolved version is empty.`);
101
+ return cdnUrl.replace('<VERSION>', resolvedVersion);
102
+ }
103
+ return cdnUrl;
104
+ }
105
+
106
+ const esbuildLog: EsbuildPlugin = {
107
+ name: 'esbuild-log',
108
+ setup(build: PluginBuild) {
109
+ const buildFormat = build.initialOptions.format ? `${build.initialOptions.format} ` : '';
110
+ build.onStart(() => {
111
+ console.log(`[esbuild-log plugin] ${buildFormat}build started...`);
112
+ });
113
+ build.onEnd((result: BuildResult<BuildOptions>) => {
114
+ if (result.errors.length > 0) {
115
+ console.error(`[esbuild-log plugin] ${buildFormat}build failed.`);
116
+ } else {
117
+ console.log(`[esbuild-log plugin] ${buildFormat}build finished.`);
118
+ }
119
+ });
120
+ }
121
+ }
122
+ const COPY_FILES: string[] = [
123
+ "buildinfo.txt",
124
+ "buildinfo-template.txt",
125
+ "CHANGELOG.md",
126
+ "template/"
127
+ ];
128
+ const copyFiles: EsbuildPlugin = {
129
+ name: 'copy-files',
130
+ setup(build: PluginBuild) {
131
+ build.onEnd((result: BuildResult<BuildOptions>) => {
132
+ const outDir = build.initialOptions.outdir || 'dist/';
133
+ console.log(`[copy-files plugin] Copying additional files to '${outDir}'...`);
134
+ for (const file of COPY_FILES) {
135
+ const destination = join(outDir, file);
136
+ if (existsSync(file)) {
137
+ cpSync(file, destination, { recursive: true });
138
+ console.log(`[copy-files plugin] Copied '${file}' to '${destination}'.`);
139
+ } else {
140
+ console.warn(`[copy-files plugin] File '${file}' does not exist. Skipping...`);
141
+ }
142
+ }
143
+ });
144
+ }
145
+ }
146
+ const importMap: EsbuildPlugin = {
147
+ name: 'import-map',
148
+ setup(build: PluginBuild) {
149
+
150
+ for (const [importSpecifier, urlTemplate] of Object.entries(IMPORT_MAP) as [string, string | null][]) {
151
+
152
+ const url = urlTemplate ? resolveVersionInCdnUrl(importSpecifier, urlTemplate) : null;
153
+ console.log(`[import-map plugin] '${importSpecifier}' → ${url ? `'${url}'` : 'external (no rewrite)'}`);
154
+
155
+ const escapedSpecifier = importSpecifier.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
156
+ build.onResolve(
157
+ { filter: new RegExp(`^${escapedSpecifier}$`) },
158
+ (args: OnResolveArgs): OnResolveResult | undefined => {
159
+ return { path: url ?? args.path, external: true };
160
+ }
161
+ );
162
+
163
+ }
164
+
165
+ },
166
+ };
167
+
168
+
169
+ const entrypoints = getManifestEntrypoints(getManifest());
170
+ console.log('[scripts/build-bundle.ts] Entrypoints:', entrypoints);
171
+
172
+ const buildOptions: BuildOptions = {
173
+ entryPoints: entrypoints,
174
+ outdir: 'dist/',
175
+ entryNames: '[dir]/[name].bundle',
176
+ platform: 'node',
177
+ format: 'esm',
178
+ bundle: true,
179
+ minify: true,
180
+ sourcemap: 'external',
181
+ plugins: [esbuildLog, copyFiles, importMap],
182
+ };
183
+
184
+ try {
185
+ await build(buildOptions);
186
+ } catch (error) {
187
+ console.error('[scripts/build-bundle.ts] Build failed:');
188
+ for (const message of (error as BuildFailure).errors) {
189
+ console.error(message);
190
+ }
191
+ process.exit(1);
192
+ }
193
+
194
+ const omitIife = process.argv.includes('--omit-iife');
195
+ if (!omitIife) {
196
+ try {
197
+ await build({
198
+ ...buildOptions,
199
+ entryNames: '[dir]/[name].bundle.iife',
200
+ format: 'iife',
201
+ banner: { js: 'var __importMetaUrl = document.currentScript && document.currentScript.src || \'\';' },
202
+ define: { 'import.meta.url': '__importMetaUrl' },
203
+ plugins: [esbuildLog, importMap],
204
+ });
205
+ } catch (error) {
206
+ console.error('[scripts/build-bundle.ts] Build failed:');
207
+ for (const message of (error as BuildFailure).errors) {
208
+ console.error(message);
209
+ }
210
+ process.exit(1);
211
+ }
212
+ }
@@ -1,25 +1,25 @@
1
- import { spawnSync } from 'node:child_process';
2
- import { readFileSync, writeFileSync } from 'node:fs';
3
-
4
-
5
- let gitHash = '';
6
- try {
7
- const gitProc = spawnSync('git', ['rev-parse', '--short', 'HEAD']);
8
- if (gitProc.status === 0) {
9
- gitHash = gitProc.stdout.toString().trim();
10
- }
11
- else {
12
- console.warn(`[scripts/buildinfo.ts] Warning: Failed to get git hash. Prceding without...`);
13
- }
14
- } catch { }
15
-
16
- const packageJson: { version: string } = JSON.parse(readFileSync('package.json', 'utf-8'));
17
- const packageVersion = packageJson.version;
18
-
19
- const separator = packageVersion.includes('+') ? '.' : '+';
20
- const buildinfo = gitHash ? `${packageVersion}${separator}${gitHash}` : packageVersion;
21
-
22
- const buildinfoFilePath = 'buildinfo.txt';
23
- writeFileSync(buildinfoFilePath, buildinfo.trim(), 'utf-8');
24
-
25
- console.log(`[scripts/buildinfo.ts] Build info '${buildinfo}' written to '${buildinfoFilePath}'.`);
1
+ import { spawnSync } from 'node:child_process';
2
+ import { readFileSync, writeFileSync } from 'node:fs';
3
+
4
+
5
+ let gitHash = '';
6
+ try {
7
+ const gitProc = spawnSync('git', ['rev-parse', '--short', 'HEAD']);
8
+ if (gitProc.status === 0) {
9
+ gitHash = gitProc.stdout.toString().trim();
10
+ }
11
+ else {
12
+ console.warn(`[scripts/buildinfo.ts] Warning: Failed to get git hash. Prceding without...`);
13
+ }
14
+ } catch { }
15
+
16
+ const packageJson: { version: string } = JSON.parse(readFileSync('package.json', 'utf-8'));
17
+ const packageVersion = packageJson.version;
18
+
19
+ const separator = packageVersion.includes('+') ? '.' : '+';
20
+ const buildinfo = gitHash ? `${packageVersion}${separator}${gitHash}` : packageVersion;
21
+
22
+ const buildinfoFilePath = 'buildinfo.txt';
23
+ writeFileSync(buildinfoFilePath, buildinfo.trim(), 'utf-8');
24
+
25
+ console.log(`[scripts/buildinfo.ts] Build info '${buildinfo}' written to '${buildinfoFilePath}'.`);
@@ -1 +1 @@
1
- {}
1
+ {}
@@ -1,41 +1,41 @@
1
- #!/usr/bin/env node
2
-
3
- import { cpSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
4
- import { resolve } from 'node:path';
5
- import {
6
- templateUrl,
7
- changelogUrl,
8
- buildinfoUrl,
9
- readmeUrl
10
- } from './package-urls.js';
11
-
12
-
13
- try {
14
-
15
- const packageNameArgument = process.argv[2];
16
- if (!packageNameArgument)
17
- throw new Error('First argument must be the package name (e.g. "my-package" or "@my-scope/my-package").');
18
- const packageName = packageNameArgument.replace(/\\/g, '/');
19
-
20
- const destinationPath = resolve(process.cwd(), packageName);
21
-
22
- cpSync(templateUrl, destinationPath, { recursive: true });
23
- cpSync(changelogUrl, resolve(destinationPath, 'CHANGELOG-template.md'));
24
- cpSync(buildinfoUrl, resolve(destinationPath, 'buildinfo-template.txt'));
25
- cpSync(readmeUrl, resolve(destinationPath, 'README-template.md'));
26
-
27
- const packageJsonPath = resolve(destinationPath, 'package.json');
28
- const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
29
- packageJson.name = packageName;
30
- writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
31
-
32
- renameSync(resolve(destinationPath, 'gitignore'), resolve(destinationPath, '.gitignore'));
33
-
34
- console.log(`Template has been successfully instantiated at '${destinationPath}' with package name '${packageName}'.`);
35
-
36
- }
37
- catch (error) {
38
- const err = error instanceof Error ? error : new Error(String(error));
39
- console.error('Error:', err.message);
40
- process.exit(1);
41
- }
1
+ #!/usr/bin/env node
2
+
3
+ import { cpSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ import {
6
+ templateUrl,
7
+ changelogUrl,
8
+ buildinfoUrl,
9
+ readmeUrl
10
+ } from './package-urls.js';
11
+
12
+
13
+ try {
14
+
15
+ const packageNameArgument = process.argv[2];
16
+ if (!packageNameArgument)
17
+ throw new Error('First argument must be the package name (e.g. "my-package" or "@my-scope/my-package").');
18
+ const packageName = packageNameArgument.replace(/\\/g, '/');
19
+
20
+ const destinationPath = resolve(process.cwd(), packageName);
21
+
22
+ cpSync(templateUrl, destinationPath, { recursive: true });
23
+ cpSync(changelogUrl, resolve(destinationPath, 'CHANGELOG-template.md'));
24
+ cpSync(buildinfoUrl, resolve(destinationPath, 'buildinfo-template.txt'));
25
+ cpSync(readmeUrl, resolve(destinationPath, 'README-template.md'));
26
+
27
+ const packageJsonPath = resolve(destinationPath, 'package.json');
28
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
29
+ packageJson.name = packageName;
30
+ writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
31
+
32
+ renameSync(resolve(destinationPath, 'gitignore'), resolve(destinationPath, '.gitignore'));
33
+
34
+ console.log(`Template has been successfully instantiated at '${destinationPath}' with package name '${packageName}'.`);
35
+
36
+ }
37
+ catch (error) {
38
+ const err = error instanceof Error ? error : new Error(String(error));
39
+ console.error('Error:', err.message);
40
+ process.exit(1);
41
+ }
@@ -1,8 +1,8 @@
1
- export const packageUrl: URL = new URL('../', import.meta.url);
2
-
3
- export const distUrl: URL = new URL('dist/', packageUrl);
4
- export const buildinfoUrl: URL = new URL('buildinfo.txt', distUrl);
5
- export const changelogUrl: URL = new URL('CHANGELOG.md', distUrl);
6
- export const readmeUrl: URL = new URL('README.md', packageUrl);
7
-
8
- export const templateUrl: URL = new URL('template/', distUrl);
1
+ export const packageUrl: URL = new URL('../', import.meta.url);
2
+
3
+ export const distUrl: URL = new URL('dist/', packageUrl);
4
+ export const buildinfoUrl: URL = new URL('buildinfo.txt', distUrl);
5
+ export const changelogUrl: URL = new URL('CHANGELOG.md', distUrl);
6
+ export const readmeUrl: URL = new URL('README.md', packageUrl);
7
+
8
+ export const templateUrl: URL = new URL('template/', distUrl);
@@ -1,26 +1,26 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
- import { existsSync, readFileSync } from 'node:fs';
4
- import { buildinfoUrl, packageUrl } from '#src/package-urls.js';
5
-
6
-
7
- // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
8
- // Captures: [1]=major, [2]=minor, [3]=patch, [4]=pre-release, [5]=build-metadata
9
- const SEMVER_REGEX =
10
- /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
11
-
12
-
13
- describe('buildinfo.txt', () => {
14
-
15
- it('MUST exist at the specified location', async () => {
16
- assert.ok(existsSync(buildinfoUrl));
17
- assert.ok(!existsSync(new URL('wrong.txt', packageUrl)));
18
- });
19
-
20
- it('MUST contain a valid semver string', async () => {
21
- const buildinfo = readFileSync(buildinfoUrl, 'utf-8');
22
- assert.match(buildinfo, SEMVER_REGEX);
23
- assert.doesNotMatch('version zwölf', SEMVER_REGEX);
24
- });
25
-
26
- });
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import { buildinfoUrl, packageUrl } from '#src/package-urls.js';
5
+
6
+
7
+ // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
8
+ // Captures: [1]=major, [2]=minor, [3]=patch, [4]=pre-release, [5]=build-metadata
9
+ const SEMVER_REGEX =
10
+ /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
11
+
12
+
13
+ describe('buildinfo.txt', () => {
14
+
15
+ it('MUST exist at the specified location', async () => {
16
+ assert.ok(existsSync(buildinfoUrl));
17
+ assert.ok(!existsSync(new URL('wrong.txt', packageUrl)));
18
+ });
19
+
20
+ it('MUST contain a valid semver string', async () => {
21
+ const buildinfo = readFileSync(buildinfoUrl, 'utf-8');
22
+ assert.match(buildinfo, SEMVER_REGEX);
23
+ assert.doesNotMatch('version zwölf', SEMVER_REGEX);
24
+ });
25
+
26
+ });