]> git.wincent.com - wincent.git/commitdiff
refactor(fig): use Node v13 so that we can ES modules natively
authorGreg Hurrell <greg@hurrell.net>
Wed, 8 Apr 2020 22:17:57 +0000 (00:17 +0200)
committerGreg Hurrell <greg@hurrell.net>
Wed, 8 Apr 2020 22:20:48 +0000 (00:20 +0200)
Not sure if this is a stupid bleeding edge idea or not, but giving it a
try.

55 files changed:
aspects/launchd/index.ts
aspects/meta/index.ts
aspects/terminfo/index.ts
bin/n
bin/node
bin/yarn
package.json
src/Attributes.ts
src/Compiler.ts
src/Fig/Context.ts
src/Fig/TaskRegistry.ts
src/Fig/__tests__/compare-test.ts
src/Fig/compare.ts
src/Fig/globToRegExp.ts
src/Fig/index.ts
src/Fig/operations/command.ts
src/Fig/operations/file.ts
src/Fig/operations/template.ts
src/Fig/resource.ts
src/Fig/root.ts
src/Fig/status.ts
src/Fig/task.ts
src/Fig/variable.ts
src/__tests__/merge-test.ts
src/__tests__/regExpFromString-test.ts
src/__tests__/stringify-test.ts
src/__tests__/template-test.ts
src/console/index.ts
src/fs/__tests__/chmod-test.ts
src/fs/__tests__/rm-test.ts
src/fs/__tests__/touch-test.ts
src/fs/chmod.ts
src/fs/chown.ts
src/fs/cp.ts
src/fs/mkdir.ts
src/fs/rm.ts
src/fs/stat.ts
src/fs/tempdir.ts
src/fs/tempfile.ts
src/fs/touch.ts
src/getOptions.ts
src/main.ts
src/readAspect.ts
src/readProject.ts
src/regExpFromString.ts
src/spawn.ts
src/stringify.ts
src/template.ts
src/test/harness.ts
src/test/index.ts
src/types/JSONValue.ts
support/typegen/Builder.js
support/typegen/SCHEMAS.js
support/typegen/index.js
tsconfig.json

index 890537f86895849a3289786fbd127ce76b2259d1..aa501180cd99cad5b5c0457ef3d5654ecfceecf2 100644 (file)
@@ -1,4 +1,4 @@
-import {resource, template, task} from '../../src/Fig';
+import {resource, template, task} from '../../src/Fig/index.js';
 
 task('configure (global) LaunchDaemons', async () => {
     const items = [
index 0b6367dcc0840b0779aaa34165155181501fd890..39fa52ff2ec62c8e2488c29b91cacfa782f09e88 100644 (file)
@@ -2,9 +2,9 @@ import * as assert from 'assert';
 import {promises as fs} from 'fs';
 import {join} from 'path';
 
-import {resource, task, template} from '../../src/Fig';
-import Context from '../../src/Fig/Context';
-import tempdir from '../../src/fs/tempdir';
+import {resource, task, template} from '../../src/Fig/index.js';
+import Context from '../../src/Fig/Context.js';
+import tempdir from '../../src/fs/tempdir.js';
 
 // TODO: decide whether these should be tests... maybe they should be?
 task('template a file', async () => {
index b7c3e87f838364322b11d57e7257ef445a5bd568..8522b59fbb07509768c383eb2367dc71064c2094 100644 (file)
@@ -1,4 +1,4 @@
-import {command, file, resource, task, variable} from '../../src/Fig';
+import {command, file, resource, task, variable} from '../../src/Fig/index.js';
 
 task('create target directory', async () => {
     await file({
diff --git a/bin/n b/bin/n
index 84c192efa2572bc1b0ef65f86974afb38e04a455..6725c6f426808fdd5173027671c0152b1bc93f17 100755 (executable)
--- a/bin/n
+++ b/bin/n
@@ -17,11 +17,11 @@ if [[ ! -x $N_EXE ]]; then
   exit 1
 fi
 
-if ! "$N_EXE" which lts &> /dev/null; then
-  log_info "Installing Installing Node LTS version"
-  "$N_EXE" lts
+if ! "$N_EXE" which latest &> /dev/null; then
+  log_info "Installing Node latest version"
+  "$N_EXE" latest
 else
-  log_debug "Using Node LTS installation"
+  log_debug "Using Node latest installation"
 fi
 
 "$N_EXE" "$@"
index 712c83a797d6d6b122f69150efa8816501d9bd53..614013e3066555042526c28d89aa51d2f1e11d94 100755 (executable)
--- a/bin/node
+++ b/bin/node
@@ -6,4 +6,4 @@ REPO_ROOT="${BASH_SOURCE%/*}/.."
 
 source "$REPO_ROOT/bin/common"
 
-n run lts "$@"
+n run latest "$@"
index 65bfe2858148916f6d3ff15b47ad3407f4c3109a..c067f90fcd320cd4347d8e56f28840734ea0ccbf 100755 (executable)
--- a/bin/yarn
+++ b/bin/yarn
@@ -8,4 +8,4 @@ source "$REPO_ROOT/bin/common"
 
 YARN_EXE="$REPO_ROOT/vendor/yarn-v1.22.4/bin/yarn"
 
-n exec lts "$YARN_EXE" "$@"
+n exec latest "$YARN_EXE" "$@"
index ad1d1b47e230dbab00daae698bdab73e63cc00b0..4c820c50c7c748bacb594901c027624b597b1bb9 100644 (file)
@@ -12,6 +12,7 @@
         "format:check": "npx prettier --check \"**/*.{js,json,ts}\" \"*.md\" roles/dotfiles/files/.zsh/liferay/bin/portool",
         "format": "npx prettier --write \"**/*.{js,json,ts}\" \"*.md\" roles/dotfiles/files/.zsh/liferay/bin/portool"
     },
+    "type": "module",
     "dependencies": {
         "typescript": "3.8.3"
     },
index 502b934b86329e6927fa0defe6841f1eb0937cfb..be789e83ed14c2e9b341af172222b238cd10a5d0 100644 (file)
@@ -1,6 +1,6 @@
 import * as os from 'os';
 
-import stringify from './stringify';
+import stringify from './stringify.js';
 
 /**
  * Immutable system attributes (read-only).
index d18051bbea923bde8b78b478c95ad853adccb11a..d497fec84ab54e47703b8394e6b40b84ceb838e7 100644 (file)
@@ -1,8 +1,8 @@
 import {promises as fs} from 'fs';
 
-import {compile, fill} from './template';
+import {compile, fill} from './template.js';
 
-import type {Scope} from './template';
+import type {Scope} from './template.js';
 
 /**
  * Template compiler that manages a cache of compiled templates.
index d86cb0e7aaabd965df55b1ddf40cdd767c1d4b48..d4b9dd83291d8d69ffed1f18ad7b1174f44df73c 100644 (file)
@@ -1,14 +1,14 @@
 import * as assert from 'assert';
 
-import Attributes from '../Attributes';
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import prompt from '../prompt';
-import * as status from './status';
-import Compiler from '../Compiler';
-import TaskRegistry from './TaskRegistry';
+import Attributes from '../Attributes.js';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import prompt from '../prompt.js';
+import * as status from './status.js';
+import Compiler from '../Compiler.js';
+import TaskRegistry from './TaskRegistry.js';
 
-import type {Metadata} from '../ErrorWithMetadata';
-import type {Aspect} from '../types/Project';
+import type {Metadata} from '../ErrorWithMetadata.js';
+import type {Aspect} from '../types/Project.js';
 
 type Counts = {
     changed: number;
@@ -121,7 +121,7 @@ class Context {
     }
 
     get currentAspect(): Aspect {
-        assert(this.#currentAspect);
+        assert.ok(this.#currentAspect);
 
         return this.#currentAspect!;
     }
@@ -131,7 +131,7 @@ class Context {
     }
 
     get currentVariables(): Variables {
-        assert(this.#currentVariables);
+        assert.ok(this.#currentVariables);
 
         return this.#currentVariables!;
     }
index ec28c59b5192073bc02ea102a35ced5862411176..e1c1f58390c8be3f5a6154a899bef38205790d2b 100644 (file)
@@ -1,4 +1,4 @@
-import type {Aspect} from '../types/Project';
+import type {Aspect} from '../types/Project.js';
 
 type Callback = () => Promise<void>;
 
index ffe9a7a2089c8755ef1182ff7d11c5fd840acc2d..7c91166b01e0c66051ac16dba2756bfc891c00db 100644 (file)
@@ -8,9 +8,9 @@
 
 import {join} from 'path';
 
-import {describe, expect, test} from '../../test/harness';
-import compare from '../compare';
-import root from '../root';
+import {describe, expect, test} from '../../test/harness.js';
+import compare from '../compare.js';
+import root from '../root.js';
 
 /**
  * Helper to get fixtures (in "src/") irrespective of where we run from.
index fff1b9d1ae454d5167dc8482029efcdfe3ae2875..729e3b79ae3fe484d9eab767070875c0b5212092 100644 (file)
@@ -6,8 +6,8 @@
 import {promises as fs} from 'fs';
 import {dirname} from 'path';
 
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import stat from '../fs/stat';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import stat from '../fs/stat.js';
 
 // TODO: decide whether the Ansible definition of "force" (which we use below)
 // is the one that we want to actual stick with.
index 6b735096ca1aa8f0e30a86fa4caa884e8a403bfb..71589e91316d150471d4f3fee37c3698e5682487 100644 (file)
@@ -1,4 +1,5 @@
-import escapeRegExpPattern from '../escapeRegExpPattern';
+import escapeRegExpPattern from '../escapeRegExpPattern.js';
+
 /**
  * Just supports simple globs ("*") for now.
  */
index 33faff0ac1b132a0f4211ac16ffd8543373ec744..3b4424f38010e6d12289412a56b7c88bfb4d52f3 100644 (file)
@@ -1,10 +1,10 @@
-import {default as command} from './operations/command';
-import {default as file} from './operations/file';
-import * as resource from './resource';
-import {default as root} from './root';
-import {default as task} from './task';
-import {default as template} from './operations/template';
-import {default as variable} from './variable';
+import {default as command} from './operations/command.js';
+import {default as file} from './operations/file.js';
+import * as resource from './resource.js';
+import {default as root} from './root.js';
+import {default as task} from './task.js';
+import {default as template} from './operations/template.js';
+import {default as variable} from './variable.js';
 
 export {command};
 export {file};
index 8c38f6f7ff10e78f52e11152ee033c6c2e779198..71a20f60bfba5073aa2df36f60f02cdb2c5ab7d8 100644 (file)
@@ -1,7 +1,7 @@
-import ErrorWithMetadata from '../../ErrorWithMetadata';
-import expand from '../../path/expand';
-import spawn from '../../spawn';
-import Context from '../Context';
+import ErrorWithMetadata from '../../ErrorWithMetadata.js';
+import expand from '../../path/expand.js';
+import spawn from '../../spawn.js';
+import Context from '../Context.js';
 
 /**
  * Implements basic shell expansion (of ~).
index 976e97a5686f1db68514814098fadd7f2e2ab2ea..1ce86a080758d564b0083481f3cb8f653e38895c 100644 (file)
@@ -1,12 +1,12 @@
-import ErrorWithMetadata from '../../ErrorWithMetadata';
-import {log} from '../../console';
-import chown from '../../fs/chown';
-import cp from '../../fs/cp';
-import mkdir from '../../fs/mkdir';
-import tempfile from '../../fs/tempfile';
-import expand from '../../path/expand';
-import Context from '../Context';
-import compare from '../compare';
+import ErrorWithMetadata from '../../ErrorWithMetadata.js';
+import {log} from '../../console/index.js';
+import chown from '../../fs/chown.js';
+import cp from '../../fs/cp.js';
+import mkdir from '../../fs/mkdir.js';
+import tempfile from '../../fs/tempfile.js';
+import expand from '../../path/expand.js';
+import Context from '../Context.js';
+import compare from '../compare.js';
 
 export default async function file({
     contents,
index 540d4b56c888d6995ea55c6f98197f3790498a37..89aee593b9cd2bc548e8162d35ea47df9a0c6be1 100644 (file)
@@ -1,5 +1,5 @@
-import Context from '../Context';
-import file from './file';
+import Context from '../Context.js';
+import file from './file.js';
 
 export default async function template({
     force,
index b92c36f803b8b0738e6a009a33b704ebef88f66f..d41303e74ab5b802f21752becfb676038e687d73 100644 (file)
@@ -1,8 +1,8 @@
 import * as fs from 'fs';
 import {join} from 'path';
 
-import Context from './Context';
-import globToRegExp from './globToRegExp';
+import Context from './Context.js';
+import globToRegExp from './globToRegExp.js';
 
 // TODO: think about exporting these separately
 
index 9595d28ff0fea89eb784af6ab2e5eb6c3020f1c9..e9b9284c1ce8c3a3ea6deaef29b8eba15d89e577 100644 (file)
@@ -1,5 +1,8 @@
 import {dirname, join} from 'path';
 import {existsSync} from 'fs';
+import {fileURLToPath} from 'url';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
 
 /**
  * Determine repo root directory by walking up directory tree until we see the
index 61552299b6b239c65e24c9f83f5a39f2d44f7a27..87d76e41c0eb8a427c6bf3fbe268cf70c055da40 100644 (file)
@@ -1,4 +1,4 @@
-import {log} from '../console';
+import {log} from '../console/index.js';
 
 // TODO: ansible also has: unreachable, rescued, ignored
 // decide whether we need any of those.
index 1a42cc474d83ca5c1ae81fb5ed95bebb53083c25..11cdc2ddc6438bb4ccd67019238efa8f57d33ba7 100644 (file)
@@ -1,14 +1,17 @@
 import {relative, sep} from 'path';
+import * as url from 'url';
 
-import {assertAspect} from '../types/Project';
-import getCaller from '../getCaller';
-import Context from './Context';
-import {default as root} from './root';
+import {assertAspect} from '../types/Project.js';
+import getCaller from '../getCaller.js';
+import Context from './Context.js';
+import {default as root} from './root.js';
 
 export default function task(name: string, callback: () => Promise<void>) {
     const caller = getCaller();
 
-    const ancestors = relative(root, caller).split(sep);
+    const path = url.fileURLToPath(caller);
+
+    const ancestors = relative(root, path).split(sep);
 
     const aspect =
         ancestors[0] === 'lib' && ancestors[1] === 'aspects' && ancestors[2];
index 3256d36c954c5b0683df3c6973e8ee05a3a4619b..a1340c5b58d3b80aff8d5ace1e045fb4c382ba3c 100644 (file)
@@ -1,5 +1,5 @@
-import assert from '../assert';
-import Context from './Context';
+import assert from '../assert.js';
+import Context from './Context.js';
 
 export default function variable(
     name: string,
index 3e54b29eb16e87e136d458c2e94c8dbced23c12d..aaa61466e4a762b479237c6b24a0116953c5aa4d 100644 (file)
@@ -1,5 +1,5 @@
-import {expect, test} from '../test/harness';
-import merge from '../merge';
+import {expect, test} from '../test/harness.js';
+import merge from '../merge.js';
 
 test('merge() returns an single object', () => {
     expect(merge({example: 'obj'})).toEqual({example: 'obj'});
index 5fbf7428b047a9abb6508e098cdbbf0e28262119..3fa09c0b4a253b9c69644e2a9a74ccd443d2b799 100644 (file)
@@ -1,5 +1,5 @@
-import {expect, test} from '../test/harness';
-import regExpFromString from '../regExpFromString';
+import {expect, test} from '../test/harness.js';
+import regExpFromString from '../regExpFromString.js';
 
 test('regExpFromString() returns a RegExp', () => {
     const regExp = regExpFromString('/\\bword\\b/');
index add99a84fe5a4430731f12fe9379586f018b36c1..2db529922cc63feeaae8955a8af61a4e204f485d 100644 (file)
@@ -1,6 +1,6 @@
-import {expect, test} from '../test/harness';
-import dedent from '../dedent';
-import stringify from '../stringify';
+import {expect, test} from '../test/harness.js';
+import dedent from '../dedent.js';
+import stringify from '../stringify.js';
 
 test('stringify() null', () => {
     expect(stringify(null)).toBe('null');
index d528ac6960063fd912108f633e3bf2ade9df2a52..c89dc818bba7c7babe2c8a6e0e3ee32979d4a950 100644 (file)
@@ -1,6 +1,6 @@
-import dedent from '../dedent';
-import {expect, test} from '../test/harness';
-import {compile, fill, tokenize} from '../template';
+import dedent from '../dedent.js';
+import {expect, test} from '../test/harness.js';
+import {compile, fill, tokenize} from '../template.js';
 
 test('compile() compiles an empty template', () => {
     expect(compile('')).toBe(dedent`
index 397e368701c6d1244e1964061cd0840b862f6f66..3d3d5128985f26ae65c53dd8b01752b28c003f85 100644 (file)
@@ -1,7 +1,7 @@
 import {clearLine, cursorTo} from 'readline';
 
-import stringify from '../stringify';
-import COLORS from './colors';
+import stringify from '../stringify.js';
+import COLORS from './colors.js';
 
 export {COLORS};
 
index 2ba1cf91ab548332d9c4711c94350748578ab224..6034de187b7491dada9a342b301f6afcffd97593 100644 (file)
@@ -1,9 +1,9 @@
-import assert from '../../assert';
-import {expect, test} from '../../test/harness';
-import chmod from '../chmod';
-import stat from '../stat';
-import tempdir from '../tempdir';
-import tempfile from '../tempfile';
+import assert from '../../assert.js';
+import {expect, test} from '../../test/harness.js';
+import chmod from '../chmod.js';
+import stat from '../stat.js';
+import tempdir from '../tempdir.js';
+import tempfile from '../tempfile.js';
 
 test('chmod() changes the mode of a file', async () => {
     const path = await tempfile('chmod-test');
index f438e39f96dd9563f4ee3aa7e7e4dab6987e7f93..268d40ca27596a5ded04afa27b4dd46ac9ca9476 100644 (file)
@@ -1,12 +1,12 @@
 import {join} from 'path';
-import assert from '../../assert';
-import {expect, test} from '../../test/harness';
-import chmod from '../chmod';
-import rm from '../rm';
-import stat from '../stat';
-import tempdir from '../tempdir';
-import tempfile from '../tempfile';
-import touch from '../touch';
+import assert from '../../assert.js';
+import {expect, test} from '../../test/harness.js';
+import chmod from '../chmod.js';
+import rm from '../rm.js';
+import stat from '../stat.js';
+import tempdir from '../tempdir.js';
+import tempfile from '../tempfile.js';
+import touch from '../touch.js';
 
 test('rm() removes a file', async () => {
     const path = await tempfile('rm-test');
index 91608c6d9225c023b590ba603caacc61599ab5f0..25005d0d430a55395451140db00f4e34ca9cad01 100644 (file)
@@ -1,9 +1,9 @@
 import {join} from 'path';
-import assert from '../../assert';
-import {expect, test} from '../../test/harness';
-import stat from '../stat';
-import tempdir from '../tempdir';
-import touch from '../touch';
+import assert from '../../assert.js';
+import {expect, test} from '../../test/harness.js';
+import stat from '../stat.js';
+import tempdir from '../tempdir.js';
+import touch from '../touch.js';
 
 test('touch() creates a file', async () => {
     const path = await tempdir('rm-test');
index bc09dcda72c2d9c7d674d3dbe704cb87fe9d2801..dea172dc0df4eafd1aa5f240dd2a96a8a4b1f14d 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     sudo?: boolean;
index 9fa2e49dddc6f760bf72da4aa6717b490a940fd8..59dd6c7a1c8e41bb963dd434ea65a9fa18b9d235 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     group?: string;
index c9dab591c9aa79deb941272a1bb176ba8d1043a7..5089c9078afb37d82266b78f35f235acd3ec7693 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     sudo?: boolean;
index 2bea097684936721711b5097ae9187d8adac6e47..90d420b7c580a3089b4a2e50c182c88ff058582c 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     mode?: Mode;
index 11bf356d80f83432d4aa1d73df7593f067b63264..e684d4eff06a97beb6027e2df52ed7ce8b31debc 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     recurse?: boolean;
index c990fa9b610846fdd4241071923c3b1a3150cf4f..af28014c4ba0035f11c36d4dd67e2155139972c0 100644 (file)
@@ -1,6 +1,6 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import run from '../run';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import run from '../run.js';
 
 type Stats = {
     group: string;
index 6d0e01e2781431c3f80ef7c4b03ae3689ea12c91..4f37c7d8124f862c1b3844852746831e1ff2f74e 100644 (file)
@@ -1,7 +1,7 @@
 import {promises as fs} from 'fs';
 
-import {log} from '../console';
-import tempname from '../tempname';
+import {log} from '../console/index.js';
+import tempname from '../tempname.js';
 
 export default async function tempdir(prefix: string): Promise<string> {
     const path = tempname(prefix);
index 076a52383f8f2240c75d6660cd96eab70c5da0ff..508ab2f7a14dad58a18015120452e574ef550314 100644 (file)
@@ -1,7 +1,7 @@
 import {promises as fs} from 'fs';
 
-import {log} from '../console';
-import tempname from '../tempname';
+import {log} from '../console/index.js';
+import tempname from '../tempname.js';
 
 /**
  * Writes the `contents` to a temporary file and returns the path to that file.
index bca920c7b0d8e0013ce070114c0762a37abd5f38..f30abbb988a036044c463eba52cc699f62acb536 100644 (file)
@@ -1,8 +1,8 @@
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import Context from '../Fig/Context';
-import {log} from '../console';
-import run from '../run';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import Context from '../Fig/Context.js';
+import {log} from '../console/index.js';
+import run from '../run.js';
+import stringify from '../stringify.js';
 
 type Options = {
     sudo?: boolean;
index 80353aabfd5b1fa2ebb2d9585cf2e68eebe19b07..2d0eb7cf0740175efb84c4e82b8de610d4e6b184 100644 (file)
@@ -1,18 +1,18 @@
 import {promises as fs} from 'fs';
 import * as path from 'path';
 
-import {root} from './Fig';
-import {COLORS, LOG_LEVEL, log} from './console';
-import dedent from './dedent';
-import ErrorWithMetadata from './ErrorWithMetadata';
-import escapeRegExpPattern from './escapeRegExpPattern';
-import readAspect from './readAspect';
-import stringify from './stringify';
-
-import {assertAspect} from './types/Project';
-
-import type {LogLevel} from './console';
-import type {Aspect} from './types/Project';
+import {root} from './Fig/index.js';
+import {COLORS, LOG_LEVEL, log} from './console/index.js';
+import dedent from './dedent.js';
+import ErrorWithMetadata from './ErrorWithMetadata.js';
+import escapeRegExpPattern from './escapeRegExpPattern.js';
+import readAspect from './readAspect.js';
+import stringify from './stringify.js';
+
+import {assertAspect} from './types/Project.js';
+
+import type {LogLevel} from './console/index.js';
+import type {Aspect} from './types/Project.js';
 
 type Options = {
     focused: Set<Aspect>;
index d46bdc9dcbbb974fb2ae0b5bc221bd4eca1cd45c..44fa7e1959e6b78cba0ae0b7cd1c1f4f43bc16ed 100644 (file)
@@ -1,21 +1,21 @@
 import * as os from 'os';
 import * as path from 'path';
 
-import ErrorWithMetadata from './ErrorWithMetadata';
-import Context from './Fig/Context';
-import {root} from './Fig';
-import {debug, log, setLogLevel} from './console';
-import getOptions from './getOptions';
-import merge from './merge';
-import simplify from './path/simplify';
-import prompt from './prompt';
-import readAspect from './readAspect';
-import readProject from './readProject';
-import regExpFromString from './regExpFromString';
-import stringify from './stringify';
-import test from './test';
-
-import type {Aspect} from './types/Project';
+import ErrorWithMetadata from './ErrorWithMetadata.js';
+import Context from './Fig/Context.js';
+import {root} from './Fig/index.js';
+import {debug, log, setLogLevel} from './console/index.js';
+import getOptions from './getOptions.js';
+import merge from './merge.js';
+import simplify from './path/simplify.js';
+import prompt from './prompt.js';
+import readAspect from './readAspect.js';
+import readProject from './readProject.js';
+import regExpFromString from './regExpFromString.js';
+import stringify from './stringify.js';
+import test from './test/index.js';
+
+import type {Aspect} from './types/Project.js';
 
 async function main() {
     if (Context.attributes.uid === 0) {
@@ -185,13 +185,13 @@ async function main() {
 async function loadAspect(aspect: Aspect): Promise<void> {
     switch (aspect) {
         case 'launchd':
-            await import('../aspects/launchd');
+            await import('../aspects/launchd/index.js');
             break;
         case 'meta':
-            await import('../aspects/meta');
+            await import('../aspects/meta/index.js');
             break;
         case 'terminfo':
-            await import('../aspects/terminfo');
+            await import('../aspects/terminfo/index.js');
             break;
         default:
             const unreachable: never = aspect;
index 2221aee1c28ed75e94e3a239059c6067dc0ca8a2..9581d7febe143b0f9ba1c3da640991a075d1079f 100644 (file)
@@ -1,7 +1,7 @@
 import {promises as fs} from 'fs';
 
-import {log} from './console';
-import {Aspect, assertAspect} from './types/Aspect';
+import {log} from './console/index.js';
+import {Aspect, assertAspect} from './types/Aspect.js';
 
 export default async function readAspect(path: string): Promise<Aspect> {
     log.debug(`Reading aspect configuration: ${path}`);
index b7163e18cc830bc2254f036f06136b13b02d953b..48a529fcea0073f19f15d92ead6e770419a24ace 100644 (file)
@@ -1,7 +1,7 @@
 import {promises as fs} from 'fs';
 
-import {log} from './console';
-import {Project, assertProject} from './types/Project';
+import {log} from './console/index.js';
+import {Project, assertProject} from './types/Project.js';
 
 export default async function readProject(path: string): Promise<Project> {
     log.debug(`Reading project configuration: ${path}`);
index f399d0e0788147e508b0be59459eecc57673029e..8cb4ebb038290b4d111a831a2ec92a50d412d6b2 100644 (file)
@@ -1,4 +1,4 @@
-import stringify from './stringify';
+import stringify from './stringify.js';
 
 /**
  * Loose definition of "valid" RegExp.
index dd8f505f42edc71268c499aa2db12c38334a83b1..4ecca0a6913c667fa850f3f2538660aeb5d65769 100644 (file)
@@ -1,6 +1,6 @@
 import * as child_process from 'child_process';
 
-import ErrorWithMetadata from './ErrorWithMetadata';
+import ErrorWithMetadata from './ErrorWithMetadata.js';
 
 /**
  * Fire-and-forget child process execution.
index dd055f591d51805a315f764e2cbae966b5ad1bc2..40ea289f2554dc7ed6991dcab8ae75d6c6e9e5f3 100644 (file)
@@ -1,4 +1,4 @@
-import {LAQUO, RAQUO} from './Unicode';
+import {LAQUO, RAQUO} from './Unicode.js';
 
 const CIRCULAR = `${LAQUO}circular${RAQUO}`;
 
index f98795fe47bff6179423f3da7f142f3a58eec23b..b99a54e87123e33a4ba953039683a91ff328729f 100644 (file)
@@ -1,4 +1,4 @@
-import stringify from './stringify';
+import stringify from './stringify.js';
 
 export type Scope = {
     [property: string]: JSONValue;
index 9415ed9a3cf58eee1c3678bf884a1d4115b24d4b..c9494e5339c6efc68a997c5cf7417f7d4d15eade 100644 (file)
@@ -1,10 +1,17 @@
 import * as assert from 'assert';
 import {Writable} from 'stream';
 
-import ErrorWithMetadata from '../ErrorWithMetadata';
-import {RAQUO} from '../Unicode';
-import {COLORS, LOG_LEVEL, debug, getLogLevel, log, print} from '../console';
-import stringify from '../stringify';
+import ErrorWithMetadata from '../ErrorWithMetadata.js';
+import {RAQUO} from '../Unicode.js';
+import {
+    COLORS,
+    LOG_LEVEL,
+    debug,
+    getLogLevel,
+    log,
+    print,
+} from '../console/index.js';
+import stringify from '../stringify.js';
 
 const {green, red, yellow} = COLORS;
 
@@ -38,7 +45,7 @@ export function expect(value: unknown) {
 
         toMatch(expected: unknown) {
             if (expected instanceof RegExp) {
-                assert(
+                assert.ok(
                     expected.test(String(value)),
                     `Expected ${stringify(value)} to match ${stringify(
                         expected
index f659b5b7548742e19d1865dd443d65c3ba9c8a00..1e6de532e5360256c32e1009b57ffc8fb8f8d572 100644 (file)
@@ -1,14 +1,17 @@
 import {promises as fs} from 'fs';
 import * as path from 'path';
+import * as url from 'url';
 
-import {log} from '../console';
-import {run} from './harness';
+import {log} from '../console/index.js';
+import {run} from './harness.js';
 
 export default async function test() {
+    const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
+
     for await (const file of walk(path.join(__dirname, '..'))) {
         if (file.endsWith('-test.js')) {
             try {
-                require(file);
+                await import(file);
             } catch (error) {
                 log.error(error);
             }
index 14dd19aac5a845fb08c4db7861691956a2637208..fbcfc083011debc9bf9a26c5c84ef5dab91e19ea 100644 (file)
@@ -32,5 +32,5 @@ export function assertJSONValue(value: unknown): asserts value is JSONValue {
     return false;
   }
 
-  assert(isJSON(value));
+  assert.ok(isJSON(value));
 }
index aa6171327afcf2d682e1e218bf87f79224dbbd45..1620a8c15f35910f97da7d99ac8e3c9a3d77246e 100644 (file)
@@ -1,6 +1,6 @@
-const assert = require('assert');
+import * as assert from 'assert';
 
-class Builder {
+export default class Builder {
     constructor({tabWidth = 2} = {}) {
         this.indentLevel = 0;
         this.output = '';
@@ -50,7 +50,7 @@ class Builder {
     dedent() {
         this.indentLevel--;
 
-        assert(this.indentLevel >= 0, 'Indent level must be non-negative');
+        assert.ok(this.indentLevel >= 0, 'Indent level must be non-negative');
 
         return this;
     }
@@ -154,5 +154,3 @@ class Builder {
         return this;
     }
 }
-
-module.exports = Builder;
index 9224ca78e106ee90f9e9e4c9924975971a7e407c..cff9269a09fd210f31b143dd0437abe96b9f33a7 100644 (file)
@@ -1,7 +1,9 @@
-const fs = require('fs');
-const path = require('path');
+import * as fs from 'fs';
+import * as path from 'path';
+import * as url from 'url';
 
 const aspects = (() => {
+    const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
     const directory = path.join(__dirname, '../../aspects');
 
     const entries = fs.readdirSync(directory, {withFileTypes: true});
@@ -36,7 +38,7 @@ const DEFINITIONS = {
     },
 };
 
-const SCHEMAS = {
+export default {
     Aspect: {
         definitions: DEFINITIONS,
         properties: {
@@ -107,5 +109,3 @@ const SCHEMAS = {
         type: 'object',
     },
 };
-
-module.exports = SCHEMAS;
index 0f0ecbb52ccbb8246bc04900dbc5df91bc1432ed..37b9f205142cc3d3f23db0ab0eafb5ab01abb49c 100644 (file)
@@ -1,10 +1,11 @@
-const assert = require('assert');
-const fs = require('fs');
-const path = require('path');
+import * as assert from 'assert';
+import * as fs from 'fs';
+import * as path from 'path';
+import * as url from 'url';
 
-const Builder = require('./Builder');
+import Builder from './Builder.js';
 
-const SCHEMAS = require('./SCHEMAS');
+import SCHEMAS from './SCHEMAS.js';
 
 /**
  * Generate types and runtime assertion functions for the types defined in
@@ -17,7 +18,7 @@ const SCHEMAS = require('./SCHEMAS');
 function main() {
     for (const [typeName, typeSchema] of Object.entries(SCHEMAS)) {
         // We only generate interfaces, which means we need objects.
-        assert(typeSchema.type === 'object');
+        assert.ok(typeSchema.type === 'object');
 
         const b = new Builder();
 
@@ -32,8 +33,8 @@ function main() {
         b.docblock('vim: set nomodifiable :', '', '@generated').blank();
 
         // Don't know whether these will be needed yet, but add just in case.
-        b.line(`import assert from '../assert';`)
-            .line(`import {assertJSONValue} from './JSONValue';`)
+        b.line(`import assert from '../assert.js';`)
+            .line(`import {assertJSONValue} from './JSONValue.js';`)
             .blank();
 
         // Create types.
@@ -96,6 +97,8 @@ function main() {
 
         genAssertFunction(typeName, typeSchema, options);
 
+        const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
+
         fs.writeFileSync(
             path.join(__dirname, `../../src/types/${typeName}.ts`),
             b.output
@@ -202,7 +205,7 @@ function genAssertFunction(typeName, typeSchema, options) {
                                     if (target) {
                                         const definition = definitions[target];
 
-                                        assert(definition);
+                                        assert.ok(definition);
 
                                         if (definition.enum) {
                                             b.line(
@@ -237,7 +240,7 @@ function genAssertFunction(typeName, typeSchema, options) {
                     }
                 );
 
-                assert(
+                assert.ok(
                     !patternProperties ||
                         Object.keys(patternProperties).length <= 1
                 );
@@ -396,7 +399,7 @@ function genProperty(propertyName, propertySchema, options) {
 }
 
 function genPatternProperty(pattern, schema, options) {
-    assert(pattern === '.*');
+    assert.ok(pattern === '.*');
 
     const {builder: b, definitions} = options;
 
index 0fc78684716e99d9dfe72c4e3a2ca3264c9d3937..5a4846cfee39f7f903697aec20bb24d8a99c7237 100644 (file)
@@ -1,6 +1,7 @@
 {
     "compilerOptions": {
-        "module": "CommonJS",
+        "module": "esnext",
+        "moduleResolution": "node",
         "noFallthroughCasesInSwitch": true,
         "noImplicitReturns": true,
         "noUnusedLocals": true,