@prestack/thread 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +563 -0
- package/dist/core/actor.d.ts +1 -1
- package/dist/core/actor.js +5 -4
- package/dist/core/actor.ts +5 -4
- package/dist/core/attach.d.ts +0 -7
- package/dist/core/attach.js +38 -67
- package/dist/core/attach.ts +34 -80
- package/dist/core/chain.js +13 -17
- package/dist/core/chain.ts +11 -15
- package/dist/core/condition.d.ts +4 -4
- package/dist/core/condition.js +2 -2
- package/dist/core/descend.d.ts +4 -2
- package/dist/core/descend.js +91 -23
- package/dist/core/descend.ts +90 -21
- package/dist/core/errors/catalogue.d.ts +52 -0
- package/dist/{operations/errors/errors.js → core/errors/catalogue.js} +1 -1
- package/dist/{operations/errors/errors.ts → core/errors/catalogue.ts} +1 -1
- package/dist/{operations/errors/catalog.d.ts → core/errors/error.d.ts} +2 -3
- package/dist/{operations/errors/catalog.js → core/errors/error.js} +1 -16
- package/dist/{operations/errors/catalog.ts → core/errors/error.ts} +3 -19
- package/dist/core/errors/namespaces.d.ts +3 -0
- package/dist/core/errors/namespaces.js +15 -0
- package/dist/core/errors/namespaces.ts +19 -0
- package/dist/core/finding.js +2 -2
- package/dist/core/finding.ts +1 -2
- package/dist/core/init.d.ts +1 -1
- package/dist/core/init.js +51 -5
- package/dist/core/init.ts +58 -5
- package/dist/core/invoked.d.ts +1 -1
- package/dist/core/invoked.js +3 -1
- package/dist/core/invoked.ts +5 -2
- package/dist/core/round.js +36 -22
- package/dist/core/round.ts +26 -9
- package/dist/core/rows.d.ts +4 -0
- package/dist/core/rows.js +31 -2
- package/dist/core/rows.ts +33 -1
- package/dist/core/scope.d.ts +1 -0
- package/dist/core/scope.js +1 -0
- package/dist/core/scope.ts +2 -0
- package/dist/core/thread.d.ts +3 -3
- package/dist/core/tree.d.ts +4 -1
- package/dist/core/tree.js +26 -6
- package/dist/core/tree.ts +29 -6
- package/dist/core/types.d.ts +3 -3
- package/dist/core/types.js +3 -1
- package/dist/core/types.ts +2 -1
- package/dist/derivation/attach.js +3 -2
- package/dist/derivation/attach.ts +2 -1
- package/dist/derivation/generators/build.js +6 -6
- package/dist/derivation/generators/build.ts +1 -1
- package/dist/derivation/generators/check.js +1 -1
- package/dist/derivation/generators/determinism.js +1 -1
- package/dist/derivation/generators/release.js +60 -47
- package/dist/derivation/generators/release.ts +66 -43
- package/dist/derivation/release.d.ts +7 -3
- package/dist/derivation/release.js +14 -1
- package/dist/derivation/release.ts +22 -2
- package/dist/integrations/attach.d.ts +4 -0
- package/dist/integrations/attach.js +37 -56
- package/dist/integrations/attach.ts +54 -60
- package/dist/integrations/cli.d.ts +37 -0
- package/dist/integrations/cli.js +440 -0
- package/dist/integrations/cli.ts +543 -0
- package/dist/{core/files.d.ts → integrations/disk.d.ts} +16 -24
- package/dist/integrations/disk.js +435 -0
- package/dist/integrations/disk.ts +465 -0
- package/dist/integrations/generators/read.js +6 -6
- package/dist/integrations/generators/read.ts +4 -4
- package/dist/integrations/generators/vault.js +10 -11
- package/dist/integrations/generators/vault.ts +4 -5
- package/dist/{operations/http.d.ts → integrations/https.d.ts} +10 -6
- package/dist/integrations/https.js +170 -0
- package/dist/integrations/https.ts +216 -0
- package/dist/integrations/pglite.d.ts +26 -0
- package/dist/integrations/pglite.js +143 -0
- package/dist/integrations/pglite.ts +206 -0
- package/dist/integrations/secret.d.ts +8 -2
- package/dist/integrations/secret.js +3 -5
- package/dist/integrations/secret.ts +10 -6
- package/dist/integrations/target.d.ts +155 -14
- package/dist/integrations/target.js +171 -50
- package/dist/integrations/target.ts +377 -61
- package/dist/integrations/vault.d.ts +1 -0
- package/dist/integrations/vault.js +20 -5
- package/dist/integrations/vault.ts +17 -5
- package/dist/integrity/attach.js +8 -77
- package/dist/integrity/attach.ts +7 -76
- package/dist/integrity/check-threads.js +5 -5
- package/dist/integrity/check-threads.ts +2 -2
- package/dist/integrity/constraint.d.ts +0 -1
- package/dist/integrity/constraint.js +267 -366
- package/dist/integrity/constraint.ts +267 -375
- package/dist/integrity/generators/compiler.js +14 -17
- package/dist/integrity/generators/compiler.ts +10 -15
- package/dist/integrity/generators/gate.js +15 -15
- package/dist/integrity/generators/gate.ts +10 -10
- package/dist/integrity/generators/issues.js +7 -7
- package/dist/integrity/generators/publish.js +39 -57
- package/dist/integrity/generators/publish.ts +44 -55
- package/dist/integrity/generators/trial.d.ts +3 -3
- package/dist/integrity/generators/trial.js +133 -165
- package/dist/integrity/generators/trial.ts +145 -169
- package/dist/integrity/lint.js +9 -13
- package/dist/integrity/lint.ts +7 -10
- package/dist/integrity/lsp/bin.js +5 -4
- package/dist/integrity/lsp/bin.ts +3 -1
- package/dist/integrity/lsp/diagnostics.js +3 -3
- package/dist/integrity/lsp/diagnostics.ts +1 -1
- package/dist/integrity/lsp/lint.js +19 -30
- package/dist/integrity/lsp/lint.ts +16 -32
- package/dist/integrity/lsp/server.js +3 -3
- package/dist/integrity/slopnator.d.ts +3 -13
- package/dist/integrity/slopnator.js +59 -38
- package/dist/integrity/slopnator.ts +54 -38
- package/dist/integrity/slopnators/sl_broken_lineage.js +2 -2
- package/dist/integrity/slopnators/sl_declared_elsewhere.js +1 -1
- package/dist/integrity/slopnators/sl_derived_drift.js +4 -4
- package/dist/integrity/slopnators/sl_derived_drift.ts +1 -1
- package/dist/integrity/slopnators/sl_door_in_a_node.js +220 -0
- package/dist/integrity/slopnators/sl_door_in_a_node.ts +250 -0
- package/dist/integrity/slopnators/sl_inert_island.js +10 -8
- package/dist/integrity/slopnators/sl_inert_island.ts +8 -6
- package/dist/integrity/slopnators/sl_missing_row.js +6 -51
- package/dist/integrity/slopnators/sl_missing_row.ts +4 -50
- package/dist/integrity/slopnators/sl_no_barrel.js +1 -1
- package/dist/integrity/slopnators/sl_no_child_process.js +36 -18
- package/dist/integrity/slopnators/sl_no_child_process.ts +44 -18
- package/dist/integrity/slopnators/sl_no_dispatch_bypass.js +80 -149
- package/dist/integrity/slopnators/sl_no_dispatch_bypass.ts +95 -147
- package/dist/integrity/slopnators/sl_no_import_cycle.js +15 -4
- package/dist/integrity/slopnators/sl_no_import_cycle.ts +20 -4
- package/dist/integrity/slopnators/sl_no_such_command.js +2 -2
- package/dist/integrity/slopnators/sl_no_such_command.ts +1 -1
- package/dist/integrity/slopnators/sl_outside_an_operation.js +20 -0
- package/dist/integrity/slopnators/sl_outside_an_operation.ts +25 -0
- package/dist/integrity/slopnators/sl_screen_holds_only_declared.d.ts +2 -0
- package/dist/integrity/slopnators/sl_screen_holds_only_declared.js +61 -0
- package/dist/integrity/slopnators/sl_screen_holds_only_declared.ts +70 -0
- package/dist/integrity/slopnators/sl_secret_literal.js +1 -33
- package/dist/integrity/slopnators/sl_secret_literal.ts +1 -33
- package/dist/integrity/slopnators/sl_stale_path.js +5 -22
- package/dist/integrity/slopnators/sl_stale_path.ts +4 -20
- package/dist/integrity/slopnators/sl_twice_meant.js +1 -1
- package/dist/integrity/slopnators/sl_twice_parented.js +29 -5
- package/dist/integrity/slopnators/sl_twice_parented.ts +28 -4
- package/dist/integrity/slopnators/sl_undeclared_crossing.d.ts +4 -1
- package/dist/integrity/slopnators/sl_undeclared_crossing.js +426 -62
- package/dist/integrity/slopnators/sl_undeclared_crossing.ts +454 -70
- package/dist/integrity/slopnators/sl_undeclared_destination.js +59 -25
- package/dist/integrity/slopnators/sl_undeclared_destination.ts +69 -21
- package/dist/integrity/slopnators/sl_undeclared_list.d.ts +2 -0
- package/dist/integrity/slopnators/sl_undeclared_list.js +363 -0
- package/dist/integrity/slopnators/sl_undeclared_list.ts +358 -0
- package/dist/integrity/slopnators/sl_undeclared_node.js +1 -11
- package/dist/integrity/slopnators/sl_undeclared_node.ts +0 -10
- package/dist/integrity/slopnators/sl_undeclared_operation.js +111 -29
- package/dist/integrity/slopnators/sl_undeclared_operation.ts +134 -26
- package/dist/integrity/slopnators/sl_undeclared_variant.js +2 -2
- package/dist/integrity/slopnators/sl_undeclared_webhook.d.ts +2 -0
- package/dist/integrity/slopnators/sl_undeclared_webhook.js +90 -0
- package/dist/integrity/slopnators/sl_undeclared_webhook.ts +108 -0
- package/dist/integrity/slopnators/sl_underived_route.d.ts +2 -0
- package/dist/integrity/slopnators/sl_underived_route.js +61 -0
- package/dist/integrity/slopnators/sl_underived_route.ts +72 -0
- package/dist/integrity/slopnators/sl_ungoverned_island.js +3 -3
- package/dist/integrity/slopnators/sl_ungoverned_island.ts +1 -1
- package/dist/integrity/slopnators/sl_unlisted_program.d.ts +2 -0
- package/dist/integrity/slopnators/sl_unlisted_program.js +39 -0
- package/dist/integrity/slopnators/sl_unlisted_program.ts +40 -0
- package/dist/integrity/slopnators/sl_unnamed_island.js +1 -1
- package/dist/integrity/slopnators/sl_unpaired_member.js +3 -3
- package/dist/integrity/slopnators/sl_unpaired_member.ts +1 -1
- package/dist/integrity/slopnators/sl_unpaired_slopnator.js +4 -4
- package/dist/integrity/slopnators/sl_unpaired_slopnator.ts +1 -1
- package/dist/integrity/slopnators/sl_unprefixed_member.js +5 -31
- package/dist/integrity/slopnators/sl_unprefixed_member.ts +2 -28
- package/dist/integrity/slopnators/sl_unthreaded.js +11 -7
- package/dist/integrity/slopnators/sl_unthreaded.ts +6 -7
- package/dist/integrity/slopnators/sl_untranslated_key.js +2 -25
- package/dist/integrity/slopnators/sl_untranslated_key.ts +1 -25
- package/dist/integrity/slopnators/sl_unvaulted_secret.d.ts +2 -0
- package/dist/integrity/slopnators/sl_unvaulted_secret.js +107 -0
- package/dist/integrity/slopnators/sl_unvaulted_secret.ts +132 -0
- package/dist/integrity/slopnators/sl_unversioned.js +6 -4
- package/dist/integrity/slopnators/sl_unversioned.ts +5 -3
- package/dist/integrity/sweep.d.ts +1 -0
- package/dist/integrity/sweep.js +105 -42
- package/dist/integrity/sweep.ts +115 -42
- package/dist/knowledge/attach.js +4 -3
- package/dist/knowledge/attach.ts +3 -2
- package/dist/knowledge/generators/docsgen.js +8 -6
- package/dist/knowledge/generators/docsgen.ts +4 -2
- package/dist/knowledge/generators/glossary.js +4 -4
- package/dist/knowledge/generators/glossary.ts +1 -1
- package/dist/operations/access.d.ts +23 -0
- package/dist/operations/access.js +28 -1
- package/dist/operations/access.ts +43 -0
- package/dist/operations/attach.js +33 -113
- package/dist/operations/attach.ts +51 -117
- package/dist/operations/capabilities.d.ts +14 -5
- package/dist/operations/capabilities.js +13 -4
- package/dist/operations/capabilities.ts +27 -8
- package/dist/operations/dispatch.d.ts +8 -2
- package/dist/operations/dispatch.js +128 -185
- package/dist/operations/dispatch.ts +138 -191
- package/dist/operations/error-results.d.ts +1 -1
- package/dist/operations/error-results.js +2 -2
- package/dist/operations/error-results.ts +2 -2
- package/dist/operations/generators/capability.d.ts +11 -1
- package/dist/operations/generators/capability.js +481 -224
- package/dist/operations/generators/capability.ts +562 -233
- package/dist/operations/generators/compile.js +66 -39
- package/dist/operations/generators/compile.ts +78 -39
- package/dist/operations/generators/permits.js +11 -12
- package/dist/operations/generators/permits.ts +3 -4
- package/dist/operations/generators/seed.d.ts +1 -0
- package/dist/operations/generators/seed.js +19 -17
- package/dist/operations/generators/seed.ts +22 -14
- package/dist/operations/generators/trial.d.ts +6 -8
- package/dist/operations/generators/trial.js +200 -70
- package/dist/operations/generators/trial.ts +230 -93
- package/dist/operations/nodes.d.ts +15 -16
- package/dist/operations/nodes.ts +16 -17
- package/dist/operations/operations.d.ts +40 -4
- package/dist/operations/operations.js +1 -0
- package/dist/operations/operations.ts +61 -4
- package/dist/operations/result.d.ts +2 -2
- package/dist/operations/result.ts +2 -2
- package/package.json +1 -4
- package/dist/core/answers.d.ts +0 -171
- package/dist/core/answers.js +0 -789
- package/dist/core/answers.ts +0 -999
- package/dist/core/client.d.ts +0 -63
- package/dist/core/client.js +0 -249
- package/dist/core/client.ts +0 -289
- package/dist/core/files.js +0 -171
- package/dist/core/files.ts +0 -222
- package/dist/integrations/module.d.ts +0 -6
- package/dist/integrations/module.js +0 -153
- package/dist/integrations/module.ts +0 -191
- package/dist/integrity/slopnators/sl_unkept_rows.js +0 -104
- package/dist/integrity/slopnators/sl_unkept_rows.ts +0 -111
- package/dist/integrity/slopnators/sl_unseamed_reach.js +0 -73
- package/dist/integrity/slopnators/sl_unseamed_reach.ts +0 -79
- package/dist/operations/cost.d.ts +0 -14
- package/dist/operations/cost.js +0 -37
- package/dist/operations/cost.ts +0 -58
- package/dist/operations/errors/errors.d.ts +0 -52
- package/dist/operations/http.js +0 -124
- package/dist/operations/http.ts +0 -169
- package/dist/operations/memory.d.ts +0 -104
- package/dist/operations/memory.js +0 -365
- package/dist/operations/memory.ts +0 -470
- package/dist/operations/metering.d.ts +0 -55
- package/dist/operations/metering.js +0 -247
- package/dist/operations/metering.ts +0 -328
- package/dist/operations/queue-policy.d.ts +0 -3
- package/dist/operations/queue-policy.js +0 -8
- package/dist/operations/queue-policy.ts +0 -10
- package/dist/operations/seams.d.ts +0 -239
- package/dist/operations/seams.js +0 -45
- package/dist/operations/seams.ts +0 -364
- package/dist/operations/store.d.ts +0 -14
- package/dist/operations/store.js +0 -1
- package/dist/operations/store.ts +0 -29
- /package/dist/{operations → core}/errors/classes.d.ts +0 -0
- /package/dist/{operations → core}/errors/classes.js +0 -0
- /package/dist/{operations → core}/errors/classes.ts +0 -0
- /package/dist/integrity/slopnators/{sl_unkept_rows.d.ts → sl_door_in_a_node.d.ts} +0 -0
- /package/dist/integrity/slopnators/{sl_unseamed_reach.d.ts → sl_outside_an_operation.d.ts} +0 -0
package/dist/core/scope.ts
CHANGED
|
@@ -16,3 +16,5 @@ export const idOf = (name: string): string | undefined => {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export const ours = (name: string): boolean => idOf(name) !== undefined
|
|
19
|
+
|
|
20
|
+
export const installed = (at: string): boolean => at.startsWith('node_modules/') && ours(at.split('/').slice(1, 3).join('/'))
|
package/dist/core/thread.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface Member extends Threaded {
|
|
|
20
20
|
readonly version: number;
|
|
21
21
|
}
|
|
22
22
|
export declare const PREFIXES: {
|
|
23
|
-
readonly workflow:
|
|
24
|
-
readonly view:
|
|
25
|
-
readonly agent:
|
|
23
|
+
readonly workflow: 'wf_';
|
|
24
|
+
readonly view: 'vw_';
|
|
25
|
+
readonly agent: 'agt_';
|
|
26
26
|
};
|
package/dist/core/tree.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { FOLDER } from '../integrations/disk.ts';
|
|
2
|
+
export { FOLDER };
|
|
1
3
|
export interface Tree {
|
|
2
4
|
readonly at: string;
|
|
3
5
|
readonly dir: string;
|
|
@@ -5,8 +7,9 @@ export interface Tree {
|
|
|
5
7
|
readonly root: string;
|
|
6
8
|
}
|
|
7
9
|
export declare class UnthreadedRepositoryError extends Error {
|
|
8
|
-
constructor(from: string);
|
|
10
|
+
constructor(from: string, floor?: string);
|
|
9
11
|
}
|
|
12
|
+
export declare function folder(): string;
|
|
10
13
|
export declare function findTree(from?: string): Tree;
|
|
11
14
|
export declare function strayFiles(root: string, prefix: string, ends: string): readonly string[];
|
|
12
15
|
export declare function inTree(tree: Tree, file: string): string;
|
package/dist/core/tree.js
CHANGED
|
@@ -1,16 +1,34 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync } from
|
|
1
|
+
import { FOLDER, attached, existsSync, readdirSync, statSync } from '../integrations/disk.js';
|
|
2
2
|
import { dirname, join, relative, resolve } from 'node:path';
|
|
3
|
-
import { cwd } from 'node:process';
|
|
3
|
+
import { cwd, env } from 'node:process';
|
|
4
|
+
export { FOLDER };
|
|
4
5
|
const NAMES = ['_threads', 'threads'];
|
|
5
6
|
const ROOT = 'thread.ts';
|
|
6
7
|
export class UnthreadedRepositoryError extends Error {
|
|
7
|
-
constructor(from) {
|
|
8
|
-
super(
|
|
8
|
+
constructor(from, floor) {
|
|
9
|
+
super('no tree above ' + from + ' — looked for a ' + NAMES.map((one) => one + '/').join(' or ') + ' directory in every directory up to ' + (floor === undefined ? 'the filesystem root' : floor + ', the folder this was pointed at') + '. ' +
|
|
9
10
|
'Run `thread init` to write one.');
|
|
10
11
|
this.name = 'UnthreadedRepositoryError';
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
function given() {
|
|
15
|
+
const named = env[FOLDER];
|
|
16
|
+
return named === undefined ? '' : named;
|
|
17
|
+
}
|
|
18
|
+
export function folder() {
|
|
19
|
+
const named = given();
|
|
20
|
+
if (named !== '')
|
|
21
|
+
return resolve(named);
|
|
22
|
+
if (attached())
|
|
23
|
+
throw new Error('this is answering for a tree on another machine and nothing said which folder that is. ' +
|
|
24
|
+
FOLDER +
|
|
25
|
+
' carries it and is not set here. Falling back to the folder this process was started in would read ' +
|
|
26
|
+
'the wrong tree and report it as yours, so it stopped instead.');
|
|
27
|
+
return cwd();
|
|
28
|
+
}
|
|
29
|
+
export function findTree(from = folder()) {
|
|
30
|
+
const named = given();
|
|
31
|
+
const floor = attached() && named !== '' ? resolve(named) : undefined;
|
|
14
32
|
let at = resolve(from);
|
|
15
33
|
for (;;) {
|
|
16
34
|
for (const name of NAMES) {
|
|
@@ -20,7 +38,9 @@ export function findTree(from = cwd()) {
|
|
|
20
38
|
}
|
|
21
39
|
const up = dirname(at);
|
|
22
40
|
if (up === at)
|
|
23
|
-
throw new UnthreadedRepositoryError(from);
|
|
41
|
+
throw new UnthreadedRepositoryError(from, floor);
|
|
42
|
+
if (at === floor)
|
|
43
|
+
throw new UnthreadedRepositoryError(from, floor);
|
|
24
44
|
at = up;
|
|
25
45
|
}
|
|
26
46
|
}
|
package/dist/core/tree.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync } from '
|
|
1
|
+
import { FOLDER, attached, existsSync, readdirSync, statSync } from '../integrations/disk.ts'
|
|
2
2
|
import { dirname, join, relative, resolve } from 'node:path'
|
|
3
|
-
import { cwd } from 'node:process'
|
|
3
|
+
import { cwd, env } from 'node:process'
|
|
4
|
+
|
|
5
|
+
export { FOLDER }
|
|
4
6
|
|
|
5
7
|
const NAMES = ['_threads', 'threads'] as const
|
|
6
8
|
const ROOT = 'thread.ts'
|
|
@@ -13,16 +15,36 @@ export interface Tree {
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
export class UnthreadedRepositoryError extends Error {
|
|
16
|
-
constructor(from: string) {
|
|
18
|
+
constructor(from: string, floor?: string) {
|
|
17
19
|
super(
|
|
18
|
-
|
|
20
|
+
'no tree above ' + from + ' — looked for a ' + NAMES.map((one) => one + '/').join(' or ') + ' directory in every directory up to ' + (floor === undefined ? 'the filesystem root' : floor + ', the folder this was pointed at') + '. ' +
|
|
19
21
|
'Run `thread init` to write one.',
|
|
20
22
|
)
|
|
21
23
|
this.name = 'UnthreadedRepositoryError'
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
function given(): string {
|
|
28
|
+
const named = env[FOLDER]
|
|
29
|
+
return named === undefined ? '' : named
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function folder(): string {
|
|
33
|
+
const named = given()
|
|
34
|
+
if (named !== '') return resolve(named)
|
|
35
|
+
if (attached())
|
|
36
|
+
throw new Error(
|
|
37
|
+
'this is answering for a tree on another machine and nothing said which folder that is. ' +
|
|
38
|
+
FOLDER +
|
|
39
|
+
' carries it and is not set here. Falling back to the folder this process was started in would read ' +
|
|
40
|
+
'the wrong tree and report it as yours, so it stopped instead.',
|
|
41
|
+
)
|
|
42
|
+
return cwd()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function findTree(from: string = folder()): Tree {
|
|
46
|
+
const named = given()
|
|
47
|
+
const floor = attached() && named !== '' ? resolve(named) : undefined
|
|
26
48
|
let at = resolve(from)
|
|
27
49
|
for (;;) {
|
|
28
50
|
for (const name of NAMES) {
|
|
@@ -30,7 +52,8 @@ export function findTree(from: string = cwd()): Tree {
|
|
|
30
52
|
if (existsSync(dir) && statSync(dir).isDirectory()) return { at, dir, name, root: join(dir, ROOT) }
|
|
31
53
|
}
|
|
32
54
|
const up = dirname(at)
|
|
33
|
-
if (up === at) throw new UnthreadedRepositoryError(from)
|
|
55
|
+
if (up === at) throw new UnthreadedRepositoryError(from, floor)
|
|
56
|
+
if (at === floor) throw new UnthreadedRepositoryError(from, floor)
|
|
34
57
|
at = up
|
|
35
58
|
}
|
|
36
59
|
}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export declare const VALUE_TYPES: readonly [
|
|
1
|
+
export declare const VALUE_TYPES: readonly ['text', 'number', 'boolean', 'date', 'timestamp', 'json'];
|
|
2
2
|
export type ValueType = (typeof VALUE_TYPES)[number];
|
|
3
|
-
export declare const KEYBOARDS: readonly [
|
|
3
|
+
export declare const KEYBOARDS: readonly ['text', 'numeric', 'decimal', 'tel', 'email', 'url', 'search'];
|
|
4
4
|
export type Keyboard = (typeof KEYBOARDS)[number];
|
|
5
|
-
export declare const ENTRY_MODES: readonly [
|
|
5
|
+
export declare const ENTRY_MODES: readonly ['plain', 'calculator', 'masked'];
|
|
6
6
|
export type EntryMode = (typeof ENTRY_MODES)[number];
|
|
7
7
|
export type Checked = {
|
|
8
8
|
readonly ok: true;
|
package/dist/core/types.js
CHANGED
|
@@ -233,7 +233,9 @@ export const FORMATS = [
|
|
|
233
233
|
check: instant,
|
|
234
234
|
requires: ['now'],
|
|
235
235
|
shown: (value, facts) => {
|
|
236
|
-
const now = facts.now
|
|
236
|
+
const now = facts.now;
|
|
237
|
+
if (now === undefined)
|
|
238
|
+
return String(value);
|
|
237
239
|
const gap = Date.parse(String(value)) - now;
|
|
238
240
|
const UNITS = [
|
|
239
241
|
['year', 31_536_000_000],
|
package/dist/core/types.ts
CHANGED
|
@@ -270,7 +270,8 @@ export const FORMATS: readonly Format[] = [
|
|
|
270
270
|
check: instant,
|
|
271
271
|
requires: ['now'],
|
|
272
272
|
shown: (value, facts) => {
|
|
273
|
-
const now = facts.now
|
|
273
|
+
const now = facts.now
|
|
274
|
+
if (now === undefined) return String(value)
|
|
274
275
|
const gap = Date.parse(String(value)) - now
|
|
275
276
|
const UNITS: readonly (readonly [Intl.RelativeTimeFormatUnit, number])[] = [
|
|
276
277
|
['year', 31_536_000_000],
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SHAPED } from '../core/init.js';
|
|
2
|
+
import { quoted } from '../core/rows.js';
|
|
2
3
|
const DESCRIBES = 'What turns a declaration into a file: the rows that state something is to be made, and the generators that make it. They are kept apart so you can read what an app declares without opening the machinery that builds it.';
|
|
3
4
|
const DERIVATION_SOURCE = [
|
|
4
|
-
|
|
5
|
+
`import type { Threaded } from '${SHAPED}'`,
|
|
5
6
|
'',
|
|
6
7
|
'export const DERIVATION: Threaded = {',
|
|
7
8
|
" id: 'derivation',",
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { Attaching } from '../core/attach.ts'
|
|
2
2
|
|
|
3
|
+
import { SHAPED } from '../core/init.ts'
|
|
3
4
|
import { quoted } from '../core/rows.ts'
|
|
4
5
|
|
|
5
6
|
const DESCRIBES =
|
|
6
7
|
'What turns a declaration into a file: the rows that state something is to be made, and the generators that make it. They are kept apart so you can read what an app declares without opening the machinery that builds it.'
|
|
7
8
|
|
|
8
9
|
const DERIVATION_SOURCE = [
|
|
9
|
-
|
|
10
|
+
`import type { Threaded } from '${SHAPED}'`,
|
|
10
11
|
'',
|
|
11
12
|
'export const DERIVATION: Threaded = {',
|
|
12
13
|
" id: 'derivation',",
|
|
@@ -10,12 +10,12 @@ import { relative, resolve } from 'node:path';
|
|
|
10
10
|
import { argv, stderr, stdout } from 'node:process';
|
|
11
11
|
import { pathToFileURL } from 'node:url';
|
|
12
12
|
import { build } from 'esbuild';
|
|
13
|
-
import { descend, reached } from
|
|
14
|
-
import { existsSync, readFileSync } from
|
|
15
|
-
import { exit, invoked } from
|
|
16
|
-
import { valuesIn } from
|
|
17
|
-
import { findTree } from
|
|
18
|
-
import { servesBrowser } from
|
|
13
|
+
import { descend, reached } from '../../core/descend.js';
|
|
14
|
+
import { existsSync, readFileSync } from '../../integrations/disk.js';
|
|
15
|
+
import { exit, invoked } from '../../core/invoked.js';
|
|
16
|
+
import { valuesIn } from '../../core/rows.js';
|
|
17
|
+
import { findTree } from '../../core/tree.js';
|
|
18
|
+
import { servesBrowser } from '../../integrations/target.js';
|
|
19
19
|
const TREE = findTree();
|
|
20
20
|
const ROOT = TREE.at;
|
|
21
21
|
const OUTSIDE = /(^|\/)node_modules(\/|$)/;
|
|
@@ -5,7 +5,7 @@ import { pathToFileURL } from 'node:url'
|
|
|
5
5
|
import { build } from 'esbuild'
|
|
6
6
|
|
|
7
7
|
import { descend, reached, type Pass } from '../../core/descend.ts'
|
|
8
|
-
import { existsSync, readFileSync } from '../../
|
|
8
|
+
import { existsSync, readFileSync } from '../../integrations/disk.ts'
|
|
9
9
|
import { exit, invoked } from '../../core/invoked.ts'
|
|
10
10
|
import { valuesIn } from '../../core/rows.ts'
|
|
11
11
|
import { findTree } from '../../core/tree.ts'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bodyHash, parseGenerated } from
|
|
1
|
+
import { bodyHash, parseGenerated } from './determinism.js';
|
|
2
2
|
export function checkGenerated(expected, read, options = {}) {
|
|
3
3
|
const checks = [];
|
|
4
4
|
const expectedPaths = new Set(expected.map((file) => file.path));
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
2
|
import { argv, stderr, stdout } from 'node:process';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { CHECKED_BY, KINDS, LISTENS, SAID, WRITES, WRITTEN_BY, kindOf } from "../release.js";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from '../../integrations/disk.js';
|
|
4
|
+
import { exit, invoked } from '../../core/invoked.js';
|
|
5
|
+
import { marked, valuesIn } from '../../core/rows.js';
|
|
6
|
+
import { ours } from '../../core/scope.js';
|
|
7
|
+
import { findTree, inTree } from '../../core/tree.js';
|
|
8
|
+
import { CHECKED_BY, KINDS, LISTENS, SAID, WRITES, WRITTEN_BY, kindOf } from '../release.js';
|
|
10
9
|
const TREE = findTree();
|
|
11
10
|
const MANIFEST = 'package.json';
|
|
11
|
+
const addressed = (rows) => rows.flatMap((one) => [...(one.at === undefined ? [] : [one.at]), ...addressed(one.derives ?? [])]);
|
|
12
12
|
const mark = (one) => marked([one.id ?? '', one.at ?? '']);
|
|
13
13
|
function releases() {
|
|
14
14
|
const at = inTree(TREE, 'derivation.ts');
|
|
@@ -22,45 +22,41 @@ function releases() {
|
|
|
22
22
|
return [];
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
const at = inTree(TREE, 'secrets.ts');
|
|
27
|
-
if (!existsSync(at))
|
|
28
|
-
return [];
|
|
25
|
+
function manager() {
|
|
29
26
|
try {
|
|
30
|
-
const held =
|
|
31
|
-
|
|
27
|
+
const held = JSON.parse(readFileSync(join(TREE.at, MANIFEST), 'utf8'));
|
|
28
|
+
const said = typeof held.packageManager === 'string' ? held.packageManager.split('@')[0] : undefined;
|
|
29
|
+
return said === undefined || said === '' ? 'npm' : said;
|
|
32
30
|
}
|
|
33
31
|
catch {
|
|
34
|
-
return
|
|
32
|
+
return 'npm';
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
function scripted() {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const scripts = held.scripts ?? {};
|
|
41
|
-
return {
|
|
42
|
-
build: scripts['build'] === undefined ? 'npm run build' : 'npm run build',
|
|
43
|
-
start: scripts['start'] === undefined ? 'npm start' : 'npm start',
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
return { build: 'npm run build', start: 'npm start' };
|
|
48
|
-
}
|
|
36
|
+
const tool = manager();
|
|
37
|
+
return { build: `${tool} run build`, start: tool === 'npm' ? 'npm start' : `${tool} start` };
|
|
49
38
|
}
|
|
50
39
|
function dockerfile(build, start) {
|
|
40
|
+
const tool = manager();
|
|
41
|
+
const corepack = tool === 'npm' ? [] : ['RUN corepack enable'];
|
|
42
|
+
const lock = tool === 'npm' ? 'package-lock.json*' : `${tool}-lock.yaml*`;
|
|
43
|
+
const first = tool === 'npm'
|
|
44
|
+
? 'RUN npm ci --omit=dev --ignore-scripts || npm install --omit=dev --ignore-scripts'
|
|
45
|
+
: `RUN ${tool} install --prod --frozen-lockfile --ignore-scripts || ${tool} install --prod --ignore-scripts`;
|
|
46
|
+
const all = tool === 'npm' ? 'RUN npm install --ignore-scripts' : `RUN ${tool} install --ignore-scripts`;
|
|
51
47
|
return [
|
|
52
|
-
'# GENERATED by thread — do not edit. It is derived from what this app declares.',
|
|
53
|
-
'',
|
|
54
48
|
'FROM node:22-slim AS build',
|
|
55
49
|
'WORKDIR /app',
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
...corepack,
|
|
51
|
+
`COPY package.json ${lock} ./`,
|
|
52
|
+
first,
|
|
58
53
|
'COPY . .',
|
|
59
|
-
|
|
54
|
+
all,
|
|
60
55
|
`RUN ${build}`,
|
|
61
56
|
'',
|
|
62
57
|
'FROM node:22-slim',
|
|
63
58
|
'WORKDIR /app',
|
|
59
|
+
...corepack,
|
|
64
60
|
'ENV NODE_ENV=production',
|
|
65
61
|
'COPY --from=build /app ./',
|
|
66
62
|
`EXPOSE ${String(LISTENS)}`,
|
|
@@ -68,28 +64,27 @@ function dockerfile(build, start) {
|
|
|
68
64
|
'',
|
|
69
65
|
].join('\n');
|
|
70
66
|
}
|
|
71
|
-
function compose(id
|
|
67
|
+
function compose(id) {
|
|
72
68
|
return [
|
|
73
|
-
'# GENERATED by thread — do not edit. It is derived from what this app declares.',
|
|
74
|
-
'',
|
|
75
69
|
'services:',
|
|
76
70
|
` ${id}:`,
|
|
77
71
|
' build: .',
|
|
78
72
|
' ports:',
|
|
79
73
|
` - "${String(LISTENS)}:${String(LISTENS)}"`,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
74
|
+
'',
|
|
75
|
+
].join('\n');
|
|
76
|
+
}
|
|
77
|
+
function withheld() {
|
|
78
|
+
return [
|
|
79
|
+
'.thread',
|
|
80
|
+
'node_modules',
|
|
81
|
+
'.git',
|
|
86
82
|
'',
|
|
87
83
|
].join('\n');
|
|
88
84
|
}
|
|
89
85
|
function made() {
|
|
90
86
|
const found = new Map();
|
|
91
87
|
const rows = releases();
|
|
92
|
-
const secrets = named();
|
|
93
88
|
const { build, start } = scripted();
|
|
94
89
|
for (const one of rows) {
|
|
95
90
|
const id = one.id;
|
|
@@ -100,7 +95,8 @@ function made() {
|
|
|
100
95
|
continue;
|
|
101
96
|
if (kind === 'docker') {
|
|
102
97
|
found.set('Dockerfile', dockerfile(build, start));
|
|
103
|
-
found.set('compose.yaml', compose(id
|
|
98
|
+
found.set('compose.yaml', compose(id));
|
|
99
|
+
found.set('.dockerignore', withheld());
|
|
104
100
|
}
|
|
105
101
|
}
|
|
106
102
|
return found;
|
|
@@ -120,7 +116,12 @@ function run() {
|
|
|
120
116
|
`\`thread create release\` — it is ${KINDS.join(' or ')}, and the prefix on its id says which.\n`);
|
|
121
117
|
return 0;
|
|
122
118
|
}
|
|
123
|
-
const words =
|
|
119
|
+
const words = argv.slice(2).filter((one) => !one.startsWith('-'));
|
|
120
|
+
if (words[0] !== undefined && words[0] !== 'read') {
|
|
121
|
+
stderr.write('release: `' + words[0] + '` is not something this command does. `thread release` writes the release, and ' +
|
|
122
|
+
'`thread release read <mark>` prints one. Nothing was written.\n');
|
|
123
|
+
return 1;
|
|
124
|
+
}
|
|
124
125
|
if (words[0] === 'read') {
|
|
125
126
|
const which = words[1];
|
|
126
127
|
const one = rows.find((row) => mark(row) === which);
|
|
@@ -132,10 +133,10 @@ function run() {
|
|
|
132
133
|
}
|
|
133
134
|
const kind = kindOf(one.id ?? '');
|
|
134
135
|
stdout.write(`${String(one.id)} — ${kind === undefined ? 'a release of a kind this generator does not recognise' : SAID[kind]}\n`);
|
|
135
|
-
for (const
|
|
136
|
-
stdout.write(`\n${
|
|
136
|
+
for (const one of kind === undefined ? [] : WRITES[kind]) {
|
|
137
|
+
stdout.write(`\n${one.at} — ${one.describes}\n`);
|
|
137
138
|
try {
|
|
138
|
-
stdout.write(readFileSync(join(TREE.at,
|
|
139
|
+
stdout.write(readFileSync(join(TREE.at, one.at), 'utf8'));
|
|
139
140
|
}
|
|
140
141
|
catch {
|
|
141
142
|
stdout.write('(nothing is there)\n');
|
|
@@ -145,6 +146,16 @@ function run() {
|
|
|
145
146
|
}
|
|
146
147
|
const files = made();
|
|
147
148
|
const checking = argv.includes('--check');
|
|
149
|
+
const stated = new Set(addressed(rows));
|
|
150
|
+
const stray = [...files.keys()].filter((one) => !stated.has(one));
|
|
151
|
+
if (stray.length > 0) {
|
|
152
|
+
stderr.write(`release: this release produces ${stray.join(', ')}, and no row names ${stray.length === 1 ? 'it' : 'them'}. ` +
|
|
153
|
+
`Writing ${stray.length === 1 ? 'it' : 'them'} would leave a file this tree does not declare, and the descent ` +
|
|
154
|
+
'reports that three steps later as a file nobody can account for. Take the release out with `thread remove ' +
|
|
155
|
+
'<its id>` and declare it again — the maker writes one row per file this kind produces, so all of them arrive ' +
|
|
156
|
+
'together. Nothing was written.\n');
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
148
159
|
const shipped = installed();
|
|
149
160
|
if (shipped.length > 0) {
|
|
150
161
|
stderr.write(`release: this app installs ${shipped.join(', ')} as a dependency, and what a host runs may hold ` +
|
|
@@ -176,8 +187,10 @@ function run() {
|
|
|
176
187
|
}
|
|
177
188
|
for (const [at, text] of files)
|
|
178
189
|
writeFileSync(join(TREE.at, at), text, 'utf8');
|
|
179
|
-
stdout.write(
|
|
180
|
-
|
|
190
|
+
stdout.write('release: wrote ' + [...files.keys()].join(', ') + ' — built and started by what this app\'s own manifest ' +
|
|
191
|
+
'declares, listening on ' + String(LISTENS) + '.\n' +
|
|
192
|
+
'release: no secret is named there. A secret is read from the sealed store at the moment it is used, and ' +
|
|
193
|
+
'naming it here would be telling whoever deploys this to put a credential in the environment instead.\n');
|
|
181
194
|
return 0;
|
|
182
195
|
}
|
|
183
196
|
if (invoked(import.meta.url))
|