diff --git a/.gitignore b/.gitignore index d95345e..d247aec 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,8 @@ typings/ # Output of 'npm pack' *.tgz +# ...except the vendored aontu build (tracks aontu GitHub main; not yet on npm) +!ts/vendor/*.tgz # Yarn Integrity file .yarn-integrity diff --git a/AGENTS.md b/AGENTS.md index e96b2e2..1918d10 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -92,6 +92,18 @@ Go **1.24+** is required (the `aontu/go` dependency declares `go 1.24.7`). 5. **Generated test fixtures go in `ts/test/_gen/`** (gitignored). Tests write their own fixtures there at runtime; do not commit them. +6. **`aontu` tracks GitHub `main` via a vendored tarball.** The npm package + lives in a monorepo subdir (`rjrodger/aontu` → `ts/`), which npm cannot + install from git, and `main` is ahead of the npm release. So + `ts/vendor/aontu-.tgz` is committed (whitelisted in `.gitignore` + against the global `*.tgz` rule) and referenced as + `"aontu": "file:vendor/aontu-.tgz"`. To bump: `git clone` aontu at + the target commit, `npm pack` its `ts/`, drop the new `.tgz` in + `ts/vendor/` (remove the old one), update the `file:` ref, then + `npm install && npm run build && npm test`. aontu's parser is + `@tabnas/jsonic`; the CLI bin requires it directly (an explicit dep, since + it is no longer hoisted transitively). + ## The Go port @@ -106,6 +118,12 @@ semantics match TypeScript. Two things differ by necessity: runtime, so the action *functions* are registered programmatically via `ModelSpec.Actions` (`map[string]ActionDef`) and bound to the config-declared names — see `go/producer.go`. +- **The config build is optional.** It is on by default; disable it with + `ModelSpec.config: false` (TS) / `ModelSpec.Config *bool` (Go, `nil` = on) + or the `--no-config` CLI flag. Disabled, the `Model` skips the config build + entirely (no `.model-config/` auto-creation, no actions) and builds the + model alone. Go's `Config` defaults to enabled via a `*bool` because the + bool zero value is `false`; keep TS and Go defaults in step. - **Watching polls modification times** (`go/watch.go`) rather than using chokidar. diff --git a/Makefile b/Makefile index d2a11e8..7fc71fe 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,10 @@ clean-go: # Publish the Go module: make publish-go V=0.1.1 publish-go: vet-go test-go @test -n "$(V)" || (echo "Usage: make publish-go V=x.y.z" && exit 1) - sed -i '' 's/^const Version = ".*"/const Version = "$(V)"/' go/model.go + # Portable in-place edit: GNU sed wants `-i`, BSD/macOS sed `-i ''`. + # A temp file plus mv sidesteps the difference. + sed 's/^const Version = ".*"/const Version = "$(V)"/' go/model.go > go/model.go.tmp \ + && mv go/model.go.tmp go/model.go git add go/model.go git commit -m "go: v$(V)" git tag go/v$(V) diff --git a/docs/explanation.md b/docs/explanation.md index 05d3e1a..02ab57d 100644 --- a/docs/explanation.md +++ b/docs/explanation.md @@ -161,6 +161,12 @@ An internal trigger producer on the config build kicks off the model build, so the two stay in step. In watch mode both the model's sources and the config's sources are watched, and a change to either rebuilds the model. +The config build is **optional**. When a `Model` is created with `config: false` +(or the CLI is run with `--no-config`), only the model build runs: nothing is +auto-created under `.model-config/`, no actions are declared or run, and the +model JSON is still written. This suits cases where you only want the unified +model — for example, generating `model.json` for another tool to consume. + ## Watching and incremental rebuilds diff --git a/docs/reference.md b/docs/reference.md index f60e541..b262f54 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -37,6 +37,7 @@ generated model JSON is written next to the root file. | `--debug ` | `-g` | string | `info` | Log level: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, `silent`. | | `--dryrun` | `-y` | boolean | `false` | Resolve and run the build, but redirect all file writes to an in-memory filesystem (nothing touches disk). | | `--build ` | `-b` | string | `''` | A [jsonic](https://github.com/jsonic-lang/jsonic) document of build arguments, exposed to actions as `build.args`. | +| `--no-config` | | boolean | `false` | Skip the `.model-config` build entirely: nothing is auto-created, no config-declared actions run, and the model is built on its own. | | `--help` | `-h` | boolean | | Print usage and exit. | | `--version` | `-v` | boolean | | Print version and exit. | @@ -59,6 +60,9 @@ voxgig-model --dryrun model/model.jsonic # Pass build arguments to actions voxgig-model -b '{env:prod, region:eu-west-1}' model/model.jsonic + +# Build the model alone, without the .model-config machinery +voxgig-model --no-config model/model.jsonic ``` ### `init` — scaffold a new model @@ -115,6 +119,12 @@ directory below the project root (e.g. `model/model.jsonic`). during a build. If it does not exist, the `Model` constructor creates a minimal one that imports the package's base config. +The config is **optional**. Pass `config: false` to `ModelSpec` (or `--no-config` +on the CLI) to skip it entirely: no `.model-config/` is created, no actions are +loaded or run, and the model is built on its own (the model JSON is still +written). In the Go API the field is `ModelSpec.Config *bool` — `nil` defaults to +enabled, a pointer to `false` disables it. + The config is itself a model, unified the same way as your main model. The keys the tool reads: @@ -289,6 +299,7 @@ interface ModelSpec { buildargs?: any // build arguments, exposed as build.args debug?: boolean | string // log level (string) or true => 'debug' dryrun?: boolean // redirect writes to an in-memory fs + config?: boolean // resolve .model-config (default true); false skips it idle?: number // watch debounce in ms (default 111) fs?: any // a custom fs implementation (e.g. memfs) log?: Log // a pre-built pino logger @@ -476,7 +487,7 @@ A single build (`Build.run`) proceeds as: 5. **post phase** — run every producer with `ctx.step = 'post'`. 6. **result** — return a `BuildResult` with `ok`, `producers`, `errs`, `runlog`. -A `Model` orchestrates **two** builds: +A `Model` orchestrates up to **two** builds: - The **config build** resolves `.model-config/model-config.jsonic` (writing `model-config.json`) and, via an internal trigger producer, drives the main @@ -487,6 +498,9 @@ A `Model` orchestrates **two** builds: In watch mode both the model's source files and the config's source files are watched; a change to either rebuilds the model. +When config is disabled (`config: false` / `--no-config`), the config build is +omitted: the model build runs directly and no config files are watched. + See [explanation](./explanation.md) for the reasoning and the caching and watch designs in depth. diff --git a/go/cmd/voxgig-model/main.go b/go/cmd/voxgig-model/main.go index 3362e2c..688ac49 100644 --- a/go/cmd/voxgig-model/main.go +++ b/go/cmd/voxgig-model/main.go @@ -36,8 +36,9 @@ func run(args []string, stderr io.Writer) int { watch := fs.Bool("w", false, "watch and rebuild on change") dryrun := fs.Bool("y", false, "dry run (write nothing to disk)") level := fs.String("g", "info", "log level: trace|debug|info|warn|error|silent") + noConfig := fs.Bool("no-config", false, "skip the .model-config build and run the model on its own") fs.Usage = func() { - fmt.Fprintln(stderr, "usage: voxgig-model [-w] [-y] [-g level] ") + fmt.Fprintln(stderr, "usage: voxgig-model [-w] [-y] [-g level] [-no-config] ") fs.PrintDefaults() } if err := fs.Parse(args); err != nil { @@ -60,10 +61,12 @@ func run(args []string, stderr io.Writer) int { return 1 } + enableConfig := !*noConfig m := model.New(model.ModelSpec{ Path: abs, Base: filepath.Dir(abs), Dryrun: *dryrun, + Config: &enableConfig, Log: model.NewLog(*level), }) diff --git a/go/cmd/voxgig-model/main_test.go b/go/cmd/voxgig-model/main_test.go index a11a55a..87e38b4 100644 --- a/go/cmd/voxgig-model/main_test.go +++ b/go/cmd/voxgig-model/main_test.go @@ -31,6 +31,23 @@ func TestCLIWritesModel(t *testing.T) { } } +func TestCLINoConfigSkipsConfig(t *testing.T) { + dir := t.TempDir() + root := filepath.Join(dir, "m.jsonic") + write(t, root, "a: 1\n") + + var out bytes.Buffer + if code := run([]string{"-no-config", "-g", "silent", root}, &out); code != 0 { + t.Fatalf("exit %d: %s", code, out.String()) + } + if _, err := os.Stat(filepath.Join(dir, "m.json")); err != nil { + t.Fatalf("model JSON not written: %v", err) + } + if _, err := os.Stat(filepath.Join(dir, ".model-config")); !os.IsNotExist(err) { + t.Fatal("-no-config should not create .model-config") + } +} + func TestCLIDryrunWritesNothing(t *testing.T) { dir := t.TempDir() root := filepath.Join(dir, "m.jsonic") diff --git a/go/config_test.go b/go/config_test.go index 88ef8bd..5e5f5dc 100644 --- a/go/config_test.go +++ b/go/config_test.go @@ -29,6 +29,70 @@ func TestConfigAutoCreated(t *testing.T) { } } +// With config disabled, New skips the .model-config build entirely: nothing is +// auto-created, Config() is nil, but the model is still written. +func TestConfigDisabled(t *testing.T) { + dir := t.TempDir() + writeFile(t, dir, "model.jsonic", "x: 1\n") + + disabled := false + m := New(ModelSpec{ + Path: filepath.Join(dir, "model.jsonic"), + Base: dir, + Config: &disabled, + }) + if br := m.Run(); !br.OK { + t.Fatalf("run failed: %v", br.Errs) + } + if _, err := os.Stat(filepath.Join(dir, ".model-config")); !os.IsNotExist(err) { + t.Fatalf(".model-config should not be created when config is disabled (err=%v)", err) + } + if _, err := os.Stat(filepath.Join(dir, "model.json")); err != nil { + t.Fatalf("model.json not written: %v", err) + } + if m.Config() != nil { + t.Fatal("Config() should be nil when config is disabled") + } +} + +// With config disabled, the action order falls back to the spec's Order even +// when a .model-config file is present (it is ignored). +func TestConfigDisabledIgnoresFileUsesOrder(t *testing.T) { + dir := t.TempDir() + mdir := filepath.Join(dir, "model") + cdir := filepath.Join(mdir, ".model-config") + if err := os.MkdirAll(cdir, 0o755); err != nil { + t.Fatal(err) + } + writeFile(t, mdir, "model.jsonic", "x: 1\n") + writeFile(t, cdir, "model-config.jsonic", + "sys: model: action: { a: load: 'x', b: load: 'y' }\n"+ + "sys: model: order: action: 'b,a'\n") + + var order []string + mk := func(n string) ActionDef { + return ActionDef{Run: func(_ map[string]any, _ *Build, _ *BuildContext) ActionResult { + order = append(order, n) + return ActionResult{OK: true} + }} + } + disabled := false + m := New(ModelSpec{ + Path: filepath.Join(mdir, "model.jsonic"), + Base: mdir, + Config: &disabled, + Actions: map[string]ActionDef{"a": mk("a"), "b": mk("b")}, + Order: []string{"a", "b"}, + }) + if br := m.Run(); !br.OK { + t.Fatalf("run failed: %v", br.Errs) + } + // Spec Order wins (a,b); the config file's order (b,a) is ignored. + if strings.Join(order, ",") != "a,b" { + t.Fatalf("action order = %v, want [a b] (from spec Order, config ignored)", order) + } +} + // The config's sys.model.order.action drives the action run order, overriding // the registry's default (sorted) order. func TestConfigDrivesActionOrder(t *testing.T) { diff --git a/go/go.mod b/go/go.mod index c34dd17..ac4d6d8 100644 --- a/go/go.mod +++ b/go/go.mod @@ -2,12 +2,14 @@ module github.com/voxgig/model/go go 1.24.7 -require github.com/rjrodger/aontu/go v0.1.3 +require github.com/rjrodger/aontu/go v0.1.4-0.20260622151248-c74b91f166cb require ( - github.com/jsonicjs/directive/go v0.1.4 // indirect - github.com/jsonicjs/expr/go v0.1.3 // indirect - github.com/jsonicjs/jsonic/go v0.1.22 // indirect - github.com/jsonicjs/multisource/go v0.1.6 // indirect - github.com/jsonicjs/path/go v0.1.2 // indirect + github.com/tabnas/directive/go v0.2.0 // indirect + github.com/tabnas/expr/go v0.2.0 // indirect + github.com/tabnas/json/go v0.2.0 // indirect + github.com/tabnas/jsonic/go v0.2.0 // indirect + github.com/tabnas/multisource/go v0.3.0 // indirect + github.com/tabnas/parser/go v0.2.0 // indirect + github.com/tabnas/path/go v0.2.0 // indirect ) diff --git a/go/go.sum b/go/go.sum index c1f1ed7..7483186 100644 --- a/go/go.sum +++ b/go/go.sum @@ -1,12 +1,18 @@ -github.com/jsonicjs/directive/go v0.1.4 h1:K7ai2ccoh8d23mjCK8/YMjEDbzb6+jWcepOL3YubpKo= -github.com/jsonicjs/directive/go v0.1.4/go.mod h1:PMjJ3EulIhdo1R0o9bOUvSUOTCPvM/xCzo1O35VBiXs= -github.com/jsonicjs/expr/go v0.1.3 h1:D7x+5AIM/CLX6A6VUiHBzfvRxufuGzXYB6gmPb1lv+A= -github.com/jsonicjs/expr/go v0.1.3/go.mod h1:6kmd1o4p4/FL4DVuCxwYAqX5YRYjF20hbIrHQM81Qoc= -github.com/jsonicjs/jsonic/go v0.1.22 h1:sam238fTyjDq0nby9TYS+aCCHprLl91ArQPWLCg2O0Y= -github.com/jsonicjs/jsonic/go v0.1.22/go.mod h1:ObNKlCG7esWoi4AHCpdgkILvPINV8bpvkbCd4llGGUg= -github.com/jsonicjs/multisource/go v0.1.6 h1:FGOySI7hmFjsmcI/mbnBF04DFFOb5FqR2fOydOCoSuA= -github.com/jsonicjs/multisource/go v0.1.6/go.mod h1:XzgM6nuW2MOAsVySsGtpp7fWSx9PTCXd4eIRSCAA/6o= -github.com/jsonicjs/path/go v0.1.2 h1:Pk7PZIiRq64iodssEVtaJw+4jHiJe84aFtmKDUasXAo= -github.com/jsonicjs/path/go v0.1.2/go.mod h1:ffXuSMg950pdfU3wapeK6QnyvZrV5yHFSj4ifwmsgmU= -github.com/rjrodger/aontu/go v0.1.3 h1:jEMxKpN8C7ijCaFCmXCL8r3YI7wtvYkeyVGYSbO4pCw= -github.com/rjrodger/aontu/go v0.1.3/go.mod h1:wvCO27yvs2Rdr8bLD/hEn4e0+Qxz6rQImkhC3y8lgzc= +github.com/rjrodger/aontu/go v0.1.4-0.20260622151248-c74b91f166cb h1:6KnptJbTI5YVUBF7TTaZpYpVnL49rorUchZjcN5mUlQ= +github.com/rjrodger/aontu/go v0.1.4-0.20260622151248-c74b91f166cb/go.mod h1:8Zr5tBVyW8/U+rwknohvMetWE54P1tRHixT8WEP+c1w= +github.com/tabnas/debug/go v0.2.0 h1:7NvwsdMdv0h/AS0lqxe1Fj3i+GzC4CDsRCND222YYI8= +github.com/tabnas/debug/go v0.2.0/go.mod h1:ScInhnXqJuXIiVuCCrLiX6R7sMhmviUk3535FJgnoi4= +github.com/tabnas/directive/go v0.2.0 h1:d9tzwQG2fyJ3W1l4kTHPjWYmqLf9QzRndU+uQOV1icI= +github.com/tabnas/directive/go v0.2.0/go.mod h1:NCXUWyi24dYonJV0V8MUzCNNb46jaNNKRAah22AzCTc= +github.com/tabnas/expr/go v0.2.0 h1:cS/t6B8ieRYUYPjyqTXs9ou3gmiRnV31MuAZ81RXiCc= +github.com/tabnas/expr/go v0.2.0/go.mod h1:aDMV8YKvH8pkilgHVqtFWSrOc/YBfMN3dBOzrY63vDI= +github.com/tabnas/json/go v0.2.0 h1:M2T6kMOHp7NGP48VoLKX9nvDNXibxgMHdvXgoD29jQw= +github.com/tabnas/json/go v0.2.0/go.mod h1:YrCYGqqvz3RWi2Rq9nzuTRf8YGvvNTeEbhmTT0394io= +github.com/tabnas/jsonic/go v0.2.0 h1:AHMrfPQ/NvB+2fxQT26byzNMTYC6a5C6fPoK8SuJLf8= +github.com/tabnas/jsonic/go v0.2.0/go.mod h1:u8tWdcVasozUrbHddZrj5qMPq0WwQ3Q4aDbjxhaSkhE= +github.com/tabnas/multisource/go v0.3.0 h1:wHvr2IU9ZlP760TAyZpm7AfzTZHLpX5ryXaVZ+sMZEs= +github.com/tabnas/multisource/go v0.3.0/go.mod h1:1jwWdrNmfu2KqYgfP5gkQcj9G6i/2TTKZFL4MqqJfFo= +github.com/tabnas/parser/go v0.2.0 h1:jpnX0kXTCX/1EKnL242UYhVcNVCdFq8JN54BNrz8nTg= +github.com/tabnas/parser/go v0.2.0/go.mod h1:WrlfEVyZ1QjEIowWiyEu3K1iHj7wxuPut5zoH9Trehk= +github.com/tabnas/path/go v0.2.0 h1:WQ3Wep8tD5KHl5nu3M6zYE3zODRJxxaa+FbXAJF3Uz0= +github.com/tabnas/path/go v0.2.0/go.mod h1:BX3CmO21Rhno8DxJnWMXNc9hlqoV1cmuG6efI7QZIio= diff --git a/go/model.go b/go/model.go index 3a2f234..9942a23 100644 --- a/go/model.go +++ b/go/model.go @@ -18,15 +18,16 @@ import ( // Version is the released version of the Go module. It is rewritten by // `make publish-go V=x.y.z` to match the git tag (go/vx.y.z). -const Version = "0.1.2" +const Version = "0.1.3" // DefaultIdle is the default watch debounce period. const DefaultIdle = 111 * time.Millisecond // Model unifies a .jsonic model and runs producers (the model writer and any // registered actions) over it. It can build once or watch and rebuild, and -// resolves a .model-config/model-config.jsonic config (auto-created when -// missing) that declares the action order. +// optionally resolves a .model-config/model-config.jsonic config (auto-created +// when missing) that declares the action order. The config is enabled by +// default; ModelSpec.Config can disable it (see New). type Model struct { config *Config build *Build @@ -51,7 +52,12 @@ func New(spec ModelSpec) *Model { idle = DefaultIdle } - config := newConfig(base, spec, log) + // Config is optional: a nil spec.Config defaults to enabled. When disabled, + // the .model-config/ build is skipped and the model runs on its own. + var config *Config + if spec.Config == nil || *spec.Config { + config = newConfig(base, spec, log) + } build := NewBuild(BuildSpec{ Name: "model", @@ -70,7 +76,9 @@ func New(spec ModelSpec) *Model { {Path: "/", Build: LocalProducer}, }, }) - build.Use["config"] = config + if config != nil { + build.Use["config"] = config + } m := &Model{ config: config, @@ -80,28 +88,34 @@ func New(spec ModelSpec) *Model { } // Re-resolve the config on each watch rebuild so config edits are picked up. - m.watch.reload = func() { - config.build.InvalidateCache() - config.Run() + if config != nil { + m.watch.reload = func() { + config.build.InvalidateCache() + config.Run() + } } return m } -// Run builds the config and then the model once, returning the model result. -// A failed config build is returned instead. +// Run builds the config (when enabled) and then the model once, returning the +// model result. A failed config build is returned instead. func (m *Model) Run() *BuildResult { - if cr := m.config.Run(); !cr.OK { - return cr + if m.config != nil { + if cr := m.config.Run(); !cr.OK { + return cr + } } return m.watch.Run(false) } -// Start builds once (config then model), then watches and rebuilds until Stop -// is called. It returns the initial model result. +// Start builds once (config when enabled, then model), then watches and +// rebuilds until Stop is called. It returns the initial model result. func (m *Model) Start() *BuildResult { - if cr := m.config.Run(); !cr.OK { - return cr + if m.config != nil { + if cr := m.config.Run(); !cr.OK { + return cr + } } return m.watch.Start() } diff --git a/go/types.go b/go/types.go index d000d80..30744b3 100644 --- a/go/types.go +++ b/go/types.go @@ -116,4 +116,11 @@ type ModelSpec struct { Idle time.Duration Watch WatchModes Log Log + + // Config resolves a .model-config/model-config.jsonic (auto-created when + // missing) that declares the build action order. A nil pointer defaults to + // enabled; set it to a pointer-to-false to skip the config entirely and run + // the model on its own (action order then comes from Order, else the + // registered Actions). + Config *bool } diff --git a/ts/bin/voxgig-model b/ts/bin/voxgig-model index 6c286b6..387edbe 100755 --- a/ts/bin/voxgig-model +++ b/ts/bin/voxgig-model @@ -7,7 +7,7 @@ const Path = require('node:path') const Pkg = require('../package.json') const { Model, initModel } = require('../dist/model.js') -const { Jsonic } = require('jsonic') +const { Jsonic } = require('@tabnas/jsonic') const { Shape, Fault, One, Any } = require('shape') @@ -82,7 +82,12 @@ function resolveOptions() { short: 'b', default: '' }, - + + // Skip the .model-config build and run the model on its own. + 'no-config': { + type: 'boolean', + }, + help: { type: 'boolean', short: 'h', @@ -102,6 +107,7 @@ function resolveOptions() { debug: args.values.debug, dryrun: args.values.dryrun, build: args.values.build, + config: !args.values['no-config'], help: !!args.values.help, version: !!args.values.version, } @@ -117,6 +123,7 @@ function validateOptions(rawOptions) { debug: One(String,Boolean), dryrun: false, build: Any(), + config: Boolean, help: Boolean, version: Boolean, }) @@ -198,6 +205,7 @@ async function generate(options) { debug: options.debug, dryrun: options.dryrun, buildargs: options.buildargs, + config: options.config, // TODO: read more complex options from elsewhere? watch: { @@ -234,11 +242,13 @@ Usage: --dryrun Perform a dry run, where no files are modified. -y - --build Provide a jsonic specification for build actions. + --build Provide a jsonic specification for build actions. -b + --no-config Skip the .model-config build and run the model on its own. + --debug Set log level (default: info): trace, error, debug, info, warn, fatal. - -g + -g --help Print this help message. -h diff --git a/ts/dist-test/cli.test.js b/ts/dist-test/cli.test.js index 682ed35..feb13ef 100644 --- a/ts/dist-test/cli.test.js +++ b/ts/dist-test/cli.test.js @@ -36,5 +36,18 @@ const BIN = __dirname + '/../bin/voxgig-model'; const args = JSON.parse(await (0, promises_1.readFile)(out, 'utf8')); node_assert_1.default.deepStrictEqual(args, { outer: { inner: 'VAL' } }); }); + // --no-config builds the model without creating .model-config or running any + // config-declared action. + (0, node_test_1.test)('no-config-skips-config', async () => { + const { existsSync } = require('node:fs'); + const dir = GEN + '/cli-noconfig'; + await (0, promises_1.rm)(dir, { recursive: true, force: true }); + await (0, promises_1.mkdir)(dir + '/model', { recursive: true }); + await (0, promises_1.writeFile)(dir + '/model/model.jsonic', 'top: 1\n'); + const res = (0, node_child_process_1.spawnSync)(process.execPath, [BIN, dir + '/model/model.jsonic', '--no-config', '-g', 'silent'], { encoding: 'utf8' }); + node_assert_1.default.strictEqual(res.status, 0, 'cli should exit 0\nstdout:' + res.stdout + '\nstderr:' + res.stderr); + node_assert_1.default.deepStrictEqual(JSON.parse(await (0, promises_1.readFile)(dir + '/model/model.json', 'utf8')), { top: 1 }); + node_assert_1.default.strictEqual(existsSync(dir + '/model/.model-config'), false, '--no-config should not create .model-config'); + }); }); //# sourceMappingURL=cli.test.js.map \ No newline at end of file diff --git a/ts/dist-test/cli.test.js.map b/ts/dist-test/cli.test.js.map index f46b697..f554264 100644 --- a/ts/dist-test/cli.test.js.map +++ b/ts/dist-test/cli.test.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../test/cli.test.ts"],"names":[],"mappings":";AAAA,oDAAoD;;;;;AAEpD,2DAA8C;AAC9C,+CAAiE;AACjE,yCAA0C;AAC1C,8DAAgC;AAGhC,MAAM,GAAG,GAAG,SAAS,GAAG,eAAe,CAAA;AACvC,MAAM,GAAG,GAAG,SAAS,GAAG,sBAAsB,CAAA;AAG9C,IAAA,oBAAQ,EAAC,KAAK,EAAE,GAAG,EAAE;IAEnB,4EAA4E;IAC5E,qDAAqD;IACrD,IAAA,gBAAI,EAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAA;QAC1B,MAAM,IAAA,aAAE,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,MAAM,IAAA,gBAAK,EAAC,GAAG,GAAG,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9D,MAAM,IAAA,gBAAK,EAAC,GAAG,GAAG,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEhD,MAAM,IAAA,oBAAS,EAAC,GAAG,GAAG,qBAAqB,EAAE,UAAU,CAAC,CAAA;QACxD,MAAM,IAAA,oBAAS,EAAC,GAAG,GAAG,0CAA0C,EAC9D,gEAAgE,CAAC,CAAA;QACnE,MAAM,IAAA,oBAAS,EAAC,GAAG,GAAG,sBAAsB,EAC1C,qCAAqC;YACrC,8DAA8D;YAC9D,uDAAuD;YACvD,iEAAiE;YACjE,2CAA2C;YAC3C,yBAAyB;YACzB,KAAK,CAAC,CAAA;QAER,MAAM,GAAG,GAAG,GAAG,GAAG,gBAAgB,CAAA;QAClC,MAAM,IAAA,aAAE,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9B,uEAAuE;QACvE,2CAA2C;QAC3C,MAAM,GAAG,GAAG,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EACpC,CAAC,GAAG,EAAE,GAAG,GAAG,qBAAqB,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAC/D,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;QAEvB,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAC9B,4BAA4B,GAAG,GAAG,CAAC,MAAM,GAAG,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;QAEvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAA;QACpD,qBAAM,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;AAEJ,CAAC,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../test/cli.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/dist-test/extra.test.js b/ts/dist-test/extra.test.js index 45be782..8442be0 100644 --- a/ts/dist-test/extra.test.js +++ b/ts/dist-test/extra.test.js @@ -133,6 +133,45 @@ function okResult(name) { const v = await b.run({ watch: false }); node_assert_1.default.strictEqual(v.ok, false); }); + // With config disabled, the model builds on its own: no .model-config/ is + // created, no actions run, but the model JSON is still written. + (0, node_test_1.test)('config-optional-skips-config', async () => { + const dir = GEN + '/ex-noconfig'; + await (0, promises_1.rm)(dir, { recursive: true, force: true }); + await (0, promises_1.mkdir)(dir + '/model', { recursive: true }); + await (0, promises_1.writeFile)(dir + '/model/m.jsonic', 'a: 1\n'); + const model = new model_1.Model({ + path: dir + '/model/m.jsonic', base: dir + '/model', debug: 'silent', + config: false, + }); + const br = await model.run(); + node_assert_1.default.ok(br.ok, 'build failed: ' + JSON.stringify(br.errs)); + node_assert_1.default.deepStrictEqual(JSON.parse(await (0, promises_1.readFile)(dir + '/model/m.json', 'utf8')), { a: 1 }); + node_assert_1.default.strictEqual(node_fs_1.default.existsSync(dir + '/model/.model-config'), false, '.model-config should not be created when config is disabled'); + }); + // An action declared in config is ignored when config is disabled, even if a + // .model-config file already exists. + (0, node_test_1.test)('config-optional-ignores-existing-config', async () => { + const dir = GEN + '/ex-noconfig-existing'; + await (0, promises_1.rm)(dir, { recursive: true, force: true }); + await (0, promises_1.mkdir)(dir + '/model/.model-config', { recursive: true }); + await (0, promises_1.mkdir)(dir + '/build', { recursive: true }); + await (0, promises_1.writeFile)(dir + '/model/m.jsonic', 'a: 1\n'); + await (0, promises_1.writeFile)(dir + '/model/.model-config/model-config.jsonic', "sys: model: action: { p: load: 'build/p' }\n"); + await (0, promises_1.writeFile)(dir + '/build/p.js', "const Path = require('node:path')\n" + + 'module.exports = async function p(model, build) {\n' + + " const root = Path.resolve(build.path, '..', '..')\n" + + " build.fs.writeFileSync(Path.resolve(root, 'p.txt'), 'OK')\n" + + ' return { ok: true }\n' + + '}\n'); + const model = new model_1.Model({ + path: dir + '/model/m.jsonic', base: dir + '/model', debug: 'silent', + config: false, + }); + const br = await model.run(); + node_assert_1.default.ok(br.ok, 'build failed: ' + JSON.stringify(br.errs)); + node_assert_1.default.strictEqual(node_fs_1.default.existsSync(dir + '/p.txt'), false, 'config action should not run when config is disabled'); + }); // An unresolved import makes aontu throw; the build collects it as an error // rather than letting it escape. (0, node_test_1.test)('unresolved-import-fails', async () => { diff --git a/ts/dist-test/extra.test.js.map b/ts/dist-test/extra.test.js.map index 51cd058..4436bac 100644 --- a/ts/dist-test/extra.test.js.map +++ b/ts/dist-test/extra.test.js.map @@ -1 +1 @@ -{"version":3,"file":"extra.test.js","sourceRoot":"","sources":["../test/extra.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extra.test.js","sourceRoot":"","sources":["../test/extra.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/dist/model.d.ts b/ts/dist/model.d.ts index afc9e62..26252d2 100644 --- a/ts/dist/model.d.ts +++ b/ts/dist/model.d.ts @@ -3,7 +3,7 @@ import { Config } from './config'; import { Watch } from './watch'; import { initModel } from './init'; declare class Model { - config: Config; + config?: Config; build: BuildSpec; watch: Watch; trigger_model: boolean; diff --git a/ts/dist/model.js b/ts/dist/model.js index 81df85d..4fbf588 100644 --- a/ts/dist/model.js +++ b/ts/dist/model.js @@ -63,8 +63,11 @@ class Model { .replaceAll(process.cwd(), '.') }); } - // Config is a special Watch to handle model config. - this.config = makeConfig(mspec, this.log, this.fs, { + // Config is a special Watch to handle model config. It is optional: when + // mspec.config is false, the .model-config/ build is skipped entirely and + // the model runs on its own (see run/start below). + const useConfig = false !== mspec.config; + this.config = !useConfig ? undefined : makeConfig(mspec, this.log, this.fs, { path: '/', build: async function trigger_model(build, ctx) { let pres = { @@ -109,7 +112,7 @@ class Model { debug: mspec.debug, dryrun: mspec.dryrun, buildargs: mspec.buildargs, - use: { config: self.config }, + use: self.config ? { config: self.config } : {}, res: [ { path: '/', @@ -127,16 +130,24 @@ class Model { }; this.watch = new watch_1.Watch(self.build, this.log); } - // Run once. + // Run once. With config enabled, the config build runs first and triggers + // the model build; without it, the model build runs directly. async run() { this.trigger_model = false; + if (!this.config) { + return this.watch.run('model', false, ''); + } const br = await this.config.run(false); return br.ok ? this.watch.run('model', false, '') : br; } // Start watching for file changes. Runs an initial build, then watches - // both the model files and the config files for ongoing changes. + // both the model files and (when enabled) the config files for ongoing + // changes. async start() { this.trigger_model = false; + if (!this.config) { + return this.watch.start(); + } const br = await this.config.run(true); if (!br.ok) { return br; @@ -150,7 +161,7 @@ class Model { async stop() { // start() also spins up a config-file watcher; stop both so no // chokidar handle is left open keeping the process alive. - await this.config.stop(); + await this.config?.stop(); return this.watch.stop(); } } diff --git a/ts/dist/model.js.map b/ts/dist/model.js.map index f848bf5..092138e 100644 --- a/ts/dist/model.js.map +++ b/ts/dist/model.js.map @@ -1 +1 @@ -{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/dist/producer/local.js b/ts/dist/producer/local.js index 9418931..f4e9d75 100644 --- a/ts/dist/producer/local.js +++ b/ts/dist/producer/local.js @@ -15,7 +15,9 @@ const local_producer = async (build, ctx) => { // TODO: need to provide project root via build let root = path_1.default.resolve(build.path, '..', '..'); // TODO: build should do this - let configBuildResult = build.use.config.watch.last; + // Config is optional: with no .model-config build linked in, there are no + // declared actions and the model runs on its own. + let configBuildResult = build.use.config?.watch?.last; let configBuild = configBuildResult?.build(); let config = configBuild?.model || {}; let actions = config.sys?.model?.action || diff --git a/ts/dist/producer/local.js.map b/ts/dist/producer/local.js.map index 6c75a61..a48d344 100644 --- a/ts/dist/producer/local.js.map +++ b/ts/dist/producer/local.js.map @@ -1 +1 @@ -{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/producer/local.ts"],"names":[],"mappings":";;;;;;AACA,gDAAuB;AAIvB,MAAM,iBAAiB,GAAG,UAAU,CAAA;AAEpC,wCAAwC;AACxC,MAAM,cAAc,GAAa,KAAK,EAAE,KAAY,EAAE,GAAiB,EAAE,EAAE;IAEzE,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACzC,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAA;IAE3C,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC;QACvB,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAA;QAE5C,+CAA+C;QAC/C,IAAI,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAE/C,6BAA6B;QAC7B,IAAI,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAA;QACnD,IAAI,WAAW,GAAG,iBAAiB,EAAE,KAAK,EAAE,CAAA;QAC5C,IAAI,MAAM,GAAG,WAAW,EAAE,KAAK,IAAI,EAAE,CAAA;QAErC,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM;YACrC,yBAAyB;YACzB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ;YAC3B,EAAE,CAAA;QAEJ,IAAI,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAA;QAC/C,QAAQ,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAClD,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QAE/E,eAAe;QACf,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC1B,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;YAE7B,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,IAAI;oBAC/B,wCAAwC,CAAC,CAAA;YAC7C,CAAC;YAED,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,gBAAgB,GAAG,IAAI,GAAG,4BAA4B,CAAC,CAAA;YAC3D,CAAC;YAED,IAAI,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;YAEhD,IAAI,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;YAEhC,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,MAAM,GAAG,MAAM,MAAM,CAAA;YACvB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAA;YAElC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,CAAA;IAE/F,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa;QACpE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;KACxD,CAAC,CAAA;IAEF,IAAI,EAAE,GAAG,IAAI,CAAA;IACb,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,MAAM,GAAG,KAAK,CAAA;IAElB,KAAK,IAAI,SAAS,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,oFAAoF;YACpF,IAAI,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;YAC1D,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACtC,MAAM,GAAG,MAAM,IAAI,IAAI,EAAE,MAAM,CAAA;YAE/B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAElB,IAAI,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAK;YAAC,CAAC;QACpB,CAAC;QACD,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;gBACpB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;oBACd,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS;oBAC9D,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,GAAG;iBACJ,CAAC,CAAA;gBACF,GAAG,CAAC,UAAU,GAAG,IAAI,CAAA;YACvB,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,IAAI,EAAE,GAAmB;QACvB,EAAE;QACF,MAAM;QACN,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;KACX,CAAA;IAED,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAIC,wCAAc"} \ No newline at end of file +{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/producer/local.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/dist/types.d.ts b/ts/dist/types.d.ts index 5455340..d896024 100644 --- a/ts/dist/types.d.ts +++ b/ts/dist/types.d.ts @@ -105,6 +105,7 @@ interface ModelSpec { dryrun?: boolean; buildargs?: any; fs?: any; + config?: boolean; watch?: { mod?: boolean; add?: boolean; diff --git a/ts/package.json b/ts/package.json index f56903b..b09c807 100644 --- a/ts/package.json +++ b/ts/package.json @@ -43,10 +43,11 @@ "LICENSE" ], "dependencies": { - "aontu": "0.46.0", + "@tabnas/jsonic": "0.2.0", + "aontu": "file:vendor/aontu-0.47.0.tgz", "chokidar": "5.0.0", - "shape": "10.1.0", - "memfs": "4.57.6" + "memfs": "4.57.6", + "shape": "10.1.0" }, "peerDependencies": { "@voxgig/util": ">=0", diff --git a/ts/src/model.ts b/ts/src/model.ts index 877d0ad..7d36d8c 100644 --- a/ts/src/model.ts +++ b/ts/src/model.ts @@ -30,7 +30,7 @@ import { initModel } from './init' class Model { - config: Config + config?: Config build: BuildSpec watch: Watch @@ -62,8 +62,12 @@ class Model { }) } - // Config is a special Watch to handle model config. - this.config = makeConfig(mspec, this.log, this.fs, { + // Config is a special Watch to handle model config. It is optional: when + // mspec.config is false, the .model-config/ build is skipped entirely and + // the model runs on its own (see run/start below). + const useConfig = false !== mspec.config + + this.config = !useConfig ? undefined : makeConfig(mspec, this.log, this.fs, { path: '/', build: async function trigger_model(build: Build, ctx: BuildContext) { let pres: ProducerResult = { @@ -117,7 +121,7 @@ class Model { debug: mspec.debug, dryrun: mspec.dryrun, buildargs: mspec.buildargs, - use: { config: self.config }, + use: self.config ? { config: self.config } : {}, res: [ { path: '/', @@ -138,18 +142,26 @@ class Model { } - // Run once. + // Run once. With config enabled, the config build runs first and triggers + // the model build; without it, the model build runs directly. async run(): Promise { this.trigger_model = false + if (!this.config) { + return this.watch.run('model', false, '') + } const br = await this.config.run(false) return br.ok ? this.watch.run('model', false, '') : br } // Start watching for file changes. Runs an initial build, then watches - // both the model files and the config files for ongoing changes. + // both the model files and (when enabled) the config files for ongoing + // changes. async start() { this.trigger_model = false + if (!this.config) { + return this.watch.start() + } const br = await this.config.run(true) if (!br.ok) { return br @@ -165,7 +177,7 @@ class Model { async stop() { // start() also spins up a config-file watcher; stop both so no // chokidar handle is left open keeping the process alive. - await this.config.stop() + await this.config?.stop() return this.watch.stop() } } diff --git a/ts/src/producer/local.ts b/ts/src/producer/local.ts index f2ecceb..8138e05 100644 --- a/ts/src/producer/local.ts +++ b/ts/src/producer/local.ts @@ -18,7 +18,9 @@ const local_producer: Producer = async (build: Build, ctx: BuildContext) => { let root = Path.resolve(build.path, '..', '..') // TODO: build should do this - let configBuildResult = build.use.config.watch.last + // Config is optional: with no .model-config build linked in, there are no + // declared actions and the model runs on its own. + let configBuildResult = build.use.config?.watch?.last let configBuild = configBuildResult?.build() let config = configBuild?.model || {} diff --git a/ts/src/types.ts b/ts/src/types.ts index adbd237..0965b66 100644 --- a/ts/src/types.ts +++ b/ts/src/types.ts @@ -131,6 +131,10 @@ interface ModelSpec { dryrun?: boolean buildargs?: any fs?: any + // Resolve a .model-config/model-config.jsonic (auto-created when missing) + // that declares the build actions and their order. Defaults to true; set + // false to skip the config entirely and run the model on its own. + config?: boolean watch?: { mod?: boolean // file modification add?: boolean // file addition diff --git a/ts/test/cli.test.ts b/ts/test/cli.test.ts index 81d4082..a168b47 100644 --- a/ts/test/cli.test.ts +++ b/ts/test/cli.test.ts @@ -48,4 +48,26 @@ describe('cli', () => { assert.deepStrictEqual(args, { outer: { inner: 'VAL' } }) }) + + // --no-config builds the model without creating .model-config or running any + // config-declared action. + test('no-config-skips-config', async () => { + const { existsSync } = require('node:fs') + const dir = GEN + '/cli-noconfig' + await rm(dir, { recursive: true, force: true }) + await mkdir(dir + '/model', { recursive: true }) + await writeFile(dir + '/model/model.jsonic', 'top: 1\n') + + const res = spawnSync(process.execPath, + [BIN, dir + '/model/model.jsonic', '--no-config', '-g', 'silent'], + { encoding: 'utf8' }) + + assert.strictEqual(res.status, 0, + 'cli should exit 0\nstdout:' + res.stdout + '\nstderr:' + res.stderr) + assert.deepStrictEqual(JSON.parse(await readFile(dir + '/model/model.json', 'utf8')), + { top: 1 }) + assert.strictEqual(existsSync(dir + '/model/.model-config'), false, + '--no-config should not create .model-config') + }) + }) diff --git a/ts/test/extra.test.ts b/ts/test/extra.test.ts index 282f54b..a544f31 100644 --- a/ts/test/extra.test.ts +++ b/ts/test/extra.test.ts @@ -161,6 +161,58 @@ describe('extra', () => { }) + // With config disabled, the model builds on its own: no .model-config/ is + // created, no actions run, but the model JSON is still written. + test('config-optional-skips-config', async () => { + const dir = GEN + '/ex-noconfig' + await rm(dir, { recursive: true, force: true }) + await mkdir(dir + '/model', { recursive: true }) + await writeFile(dir + '/model/m.jsonic', 'a: 1\n') + + const model = new Model({ + path: dir + '/model/m.jsonic', base: dir + '/model', debug: 'silent', + config: false, + }) + const br = await model.run() + + assert.ok(br.ok, 'build failed: ' + JSON.stringify(br.errs)) + assert.deepStrictEqual(JSON.parse(await readFile(dir + '/model/m.json', 'utf8')), { a: 1 }) + assert.strictEqual(Fs.existsSync(dir + '/model/.model-config'), false, + '.model-config should not be created when config is disabled') + }) + + + // An action declared in config is ignored when config is disabled, even if a + // .model-config file already exists. + test('config-optional-ignores-existing-config', async () => { + const dir = GEN + '/ex-noconfig-existing' + await rm(dir, { recursive: true, force: true }) + await mkdir(dir + '/model/.model-config', { recursive: true }) + await mkdir(dir + '/build', { recursive: true }) + + await writeFile(dir + '/model/m.jsonic', 'a: 1\n') + await writeFile(dir + '/model/.model-config/model-config.jsonic', + "sys: model: action: { p: load: 'build/p' }\n") + await writeFile(dir + '/build/p.js', + "const Path = require('node:path')\n" + + 'module.exports = async function p(model, build) {\n' + + " const root = Path.resolve(build.path, '..', '..')\n" + + " build.fs.writeFileSync(Path.resolve(root, 'p.txt'), 'OK')\n" + + ' return { ok: true }\n' + + '}\n') + + const model = new Model({ + path: dir + '/model/m.jsonic', base: dir + '/model', debug: 'silent', + config: false, + }) + const br = await model.run() + + assert.ok(br.ok, 'build failed: ' + JSON.stringify(br.errs)) + assert.strictEqual(Fs.existsSync(dir + '/p.txt'), false, + 'config action should not run when config is disabled') + }) + + // An unresolved import makes aontu throw; the build collects it as an error // rather than letting it escape. test('unresolved-import-fails', async () => { diff --git a/ts/vendor/aontu-0.47.0.tgz b/ts/vendor/aontu-0.47.0.tgz new file mode 100644 index 0000000..cc54682 Binary files /dev/null and b/ts/vendor/aontu-0.47.0.tgz differ