@pasosdejesus/m 0.27.2 → 0.28.0
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/README.md +2 -2
- package/dist/CHANGELOG.md +126 -0
- package/dist/compose/derive.d.ts +53 -0
- package/dist/compose/derive.d.ts.map +1 -0
- package/dist/compose/derive.js +128 -0
- package/dist/compose/derive.js.map +1 -0
- package/dist/compose/discover.d.ts +32 -0
- package/dist/compose/discover.d.ts.map +1 -0
- package/dist/compose/discover.js +96 -0
- package/dist/compose/discover.js.map +1 -0
- package/dist/compose/index.d.ts +17 -0
- package/dist/compose/index.d.ts.map +1 -0
- package/dist/compose/index.js +16 -0
- package/dist/compose/index.js.map +1 -0
- package/dist/compose/manifest.d.ts +89 -0
- package/dist/compose/manifest.d.ts.map +1 -0
- package/dist/compose/manifest.js +16 -0
- package/dist/compose/manifest.js.map +1 -0
- package/dist/compose/sync.d.ts +12 -0
- package/dist/compose/sync.d.ts.map +1 -0
- package/dist/compose/sync.js +27 -0
- package/dist/compose/sync.js.map +1 -0
- package/dist/compose/usage.d.ts +54 -0
- package/dist/compose/usage.d.ts.map +1 -0
- package/dist/compose/usage.js +167 -0
- package/dist/compose/usage.js.map +1 -0
- package/dist/compose/vendor.d.ts +45 -0
- package/dist/compose/vendor.d.ts.map +1 -0
- package/dist/compose/vendor.js +147 -0
- package/dist/compose/vendor.js.map +1 -0
- package/dist/compose/verify.d.ts +11 -0
- package/dist/compose/verify.d.ts.map +1 -0
- package/dist/compose/verify.js +74 -0
- package/dist/compose/verify.js.map +1 -0
- package/dist/e2e/env.d.ts +1 -1
- package/dist/e2e/env.js +3 -3
- package/dist/e2e/env.js.map +1 -1
- package/dist/e2e/local-node.js +1 -1
- package/dist/e2e/local-node.js.map +1 -1
- package/dist/e2e/wallet-mock.js +1 -1
- package/dist/e2e/wallet-mock.js.map +1 -1
- package/dist/e2e/warmup.js +1 -1
- package/dist/e2e/warmup.js.map +1 -1
- package/dist/engine.d.ts +3 -16
- package/dist/engine.d.ts.map +1 -1
- package/dist/i18n/locales/cli.d.ts.map +1 -1
- package/dist/i18n/locales/cli.js +16 -10
- package/dist/i18n/locales/cli.js.map +1 -1
- package/dist/m.js +13 -10
- package/dist/m.js.map +1 -1
- package/dist/shadcn_components/ui/button.d.ts +1 -1
- package/dist/tasks/create.d.ts +1 -1
- package/dist/tasks/create.d.ts.map +1 -1
- package/dist/tasks/create.js +5 -13
- package/dist/tasks/create.js.map +1 -1
- package/dist/tasks/db.d.ts +2 -1
- package/dist/tasks/db.d.ts.map +1 -1
- package/dist/tasks/db.js +14 -11
- package/dist/tasks/db.js.map +1 -1
- package/dist/tasks/e2e-summary.js +1 -1
- package/dist/tasks/e2e-summary.js.map +1 -1
- package/dist/tasks/e2e.js +1 -1
- package/dist/tasks/e2e.js.map +1 -1
- package/dist/tasks/engine.d.ts.map +1 -1
- package/dist/tasks/engine.js +246 -17
- package/dist/tasks/engine.js.map +1 -1
- package/dist/tasks/msip.d.ts +11 -0
- package/dist/tasks/msip.d.ts.map +1 -0
- package/dist/tasks/{base-model.js → msip.js} +161 -25
- package/dist/tasks/msip.js.map +1 -0
- package/dist/tasks/warmup.js +1 -1
- package/dist/tasks/warmup.js.map +1 -1
- package/dist/templates/apps/hardhat/README.md +0 -8
- package/dist/templates/apps/nextjs/bin/m +3 -0
- package/dist/templates/apps/nextjs/tests/global-setup.ts +28 -0
- package/dist/templates/apps/nextjs/vitest.config.ts +3 -0
- package/dist/test-utils/console.d.ts +1 -1
- package/dist/test-utils/console.js +1 -1
- package/dist/test-utils/kysely-mocks.d.ts +1 -1
- package/dist/test-utils/kysely-mocks.js +1 -1
- package/dist/test-utils/wallet-mocks.js +1 -1
- package/dist/test-utils/wallet-setup.js +1 -1
- package/dist/util/engines.d.ts +4 -6
- package/dist/util/engines.d.ts.map +1 -1
- package/dist/util/engines.js +5 -38
- package/dist/util/engines.js.map +1 -1
- package/dist/util/msip.d.ts +17 -0
- package/dist/util/msip.d.ts.map +1 -0
- package/dist/util/msip.js +86 -0
- package/dist/util/msip.js.map +1 -0
- package/dist/wallet/index.js +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/next/i18n.d.ts +1 -1
- package/dist/wallet/next/i18n.js +1 -1
- package/dist/wallet/next/index.js +1 -1
- package/dist/wallet/next/index.js.map +1 -1
- package/dist/wallet/next/namespaces.d.ts +1 -1
- package/dist/wallet/next/namespaces.js +1 -1
- package/dist/wallet/storage/idb.d.ts +1 -1
- package/dist/wallet/storage/idb.js +1 -1
- package/package.json +4 -6
- package/src/e2e/README.md +6 -6
- package/src/tasks/README.md +3 -3
- package/src/test-utils/README.md +2 -2
- package/src/wallet/README.md +4 -4
- package/dist/base-model/baseline.generated.d.ts +0 -48
- package/dist/base-model/baseline.generated.d.ts.map +0 -1
- package/dist/base-model/baseline.generated.js +0 -930
- package/dist/base-model/baseline.generated.js.map +0 -1
- package/dist/base-model/check.d.ts +0 -6
- package/dist/base-model/check.d.ts.map +0 -1
- package/dist/base-model/check.js +0 -195
- package/dist/base-model/check.js.map +0 -1
- package/dist/base-model/forward/baseline_1_0_0.d.ts +0 -3
- package/dist/base-model/forward/baseline_1_0_0.d.ts.map +0 -1
- package/dist/base-model/forward/baseline_1_0_0.js +0 -23
- package/dist/base-model/forward/baseline_1_0_0.js.map +0 -1
- package/dist/base-model/forward/index.d.ts +0 -28
- package/dist/base-model/forward/index.d.ts.map +0 -1
- package/dist/base-model/forward/index.js +0 -126
- package/dist/base-model/forward/index.js.map +0 -1
- package/dist/base-model/forward/index.test.d.ts +0 -2
- package/dist/base-model/forward/index.test.d.ts.map +0 -1
- package/dist/base-model/forward/index.test.js +0 -65
- package/dist/base-model/forward/index.test.js.map +0 -1
- package/dist/base-model/forward/policy.d.ts +0 -16
- package/dist/base-model/forward/policy.d.ts.map +0 -1
- package/dist/base-model/forward/policy.js +0 -37
- package/dist/base-model/forward/policy.js.map +0 -1
- package/dist/base-model/forward/policy.test.d.ts +0 -2
- package/dist/base-model/forward/policy.test.d.ts.map +0 -1
- package/dist/base-model/forward/policy.test.js +0 -40
- package/dist/base-model/forward/policy.test.js.map +0 -1
- package/dist/base-model/forward/types.d.ts +0 -21
- package/dist/base-model/forward/types.d.ts.map +0 -1
- package/dist/base-model/forward/types.js +0 -2
- package/dist/base-model/forward/types.js.map +0 -1
- package/dist/base-model/generate.d.ts +0 -42
- package/dist/base-model/generate.d.ts.map +0 -1
- package/dist/base-model/generate.js +0 -241
- package/dist/base-model/generate.js.map +0 -1
- package/dist/base-model/guidelines.d.ts +0 -13
- package/dist/base-model/guidelines.d.ts.map +0 -1
- package/dist/base-model/guidelines.js +0 -61
- package/dist/base-model/guidelines.js.map +0 -1
- package/dist/base-model/index.d.ts +0 -24
- package/dist/base-model/index.d.ts.map +0 -1
- package/dist/base-model/index.js +0 -29
- package/dist/base-model/index.js.map +0 -1
- package/dist/base-model/parse-structure.d.ts +0 -4
- package/dist/base-model/parse-structure.d.ts.map +0 -1
- package/dist/base-model/parse-structure.js +0 -170
- package/dist/base-model/parse-structure.js.map +0 -1
- package/dist/base-model/queries.d.ts +0 -34
- package/dist/base-model/queries.d.ts.map +0 -1
- package/dist/base-model/queries.js +0 -118
- package/dist/base-model/queries.js.map +0 -1
- package/dist/base-model/references/learn-tg.d.ts +0 -21
- package/dist/base-model/references/learn-tg.d.ts.map +0 -1
- package/dist/base-model/references/learn-tg.js +0 -65
- package/dist/base-model/references/learn-tg.js.map +0 -1
- package/dist/base-model/references/msip.d.ts +0 -29
- package/dist/base-model/references/msip.d.ts.map +0 -1
- package/dist/base-model/references/msip.js +0 -33
- package/dist/base-model/references/msip.js.map +0 -1
- package/dist/base-model/types.d.ts +0 -207
- package/dist/base-model/types.d.ts.map +0 -1
- package/dist/base-model/types.js +0 -10
- package/dist/base-model/types.js.map +0 -1
- package/dist/base-model/version.d.ts +0 -19
- package/dist/base-model/version.d.ts.map +0 -1
- package/dist/base-model/version.js +0 -26
- package/dist/base-model/version.js.map +0 -1
- package/dist/base-model/wallet-link.d.ts +0 -69
- package/dist/base-model/wallet-link.d.ts.map +0 -1
- package/dist/base-model/wallet-link.js +0 -220
- package/dist/base-model/wallet-link.js.map +0 -1
- package/dist/base-model/wallet-link.test.d.ts +0 -2
- package/dist/base-model/wallet-link.test.d.ts.map +0 -1
- package/dist/base-model/wallet-link.test.js +0 -147
- package/dist/base-model/wallet-link.test.js.map +0 -1
- package/dist/e2e/env.test.d.ts +0 -2
- package/dist/e2e/env.test.d.ts.map +0 -1
- package/dist/e2e/env.test.js +0 -72
- package/dist/e2e/env.test.js.map +0 -1
- package/dist/e2e/full-wallet.test.d.ts +0 -2
- package/dist/e2e/full-wallet.test.d.ts.map +0 -1
- package/dist/e2e/full-wallet.test.js +0 -63
- package/dist/e2e/full-wallet.test.js.map +0 -1
- package/dist/e2e/in-app-wallet.test.d.ts +0 -2
- package/dist/e2e/in-app-wallet.test.d.ts.map +0 -1
- package/dist/e2e/in-app-wallet.test.js +0 -52
- package/dist/e2e/in-app-wallet.test.js.map +0 -1
- package/dist/e2e/local-node.test.d.ts +0 -2
- package/dist/e2e/local-node.test.d.ts.map +0 -1
- package/dist/e2e/local-node.test.js +0 -43
- package/dist/e2e/local-node.test.js.map +0 -1
- package/dist/e2e/retry.test.d.ts +0 -2
- package/dist/e2e/retry.test.d.ts.map +0 -1
- package/dist/e2e/retry.test.js +0 -43
- package/dist/e2e/retry.test.js.map +0 -1
- package/dist/e2e/signer.test.d.ts +0 -2
- package/dist/e2e/signer.test.d.ts.map +0 -1
- package/dist/e2e/signer.test.js +0 -57
- package/dist/e2e/signer.test.js.map +0 -1
- package/dist/e2e/siwe-optional.test.d.ts +0 -2
- package/dist/e2e/siwe-optional.test.d.ts.map +0 -1
- package/dist/e2e/siwe-optional.test.js +0 -13
- package/dist/e2e/siwe-optional.test.js.map +0 -1
- package/dist/e2e/wallet-mock.test.d.ts +0 -2
- package/dist/e2e/wallet-mock.test.d.ts.map +0 -1
- package/dist/e2e/wallet-mock.test.js +0 -28
- package/dist/e2e/wallet-mock.test.js.map +0 -1
- package/dist/e2e/warmup.test.d.ts +0 -2
- package/dist/e2e/warmup.test.d.ts.map +0 -1
- package/dist/e2e/warmup.test.js +0 -67
- package/dist/e2e/warmup.test.js.map +0 -1
- package/dist/engine.test.d.ts +0 -2
- package/dist/engine.test.d.ts.map +0 -1
- package/dist/engine.test.js +0 -35
- package/dist/engine.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -11
- package/dist/index.test.js.map +0 -1
- package/dist/tasks/base-model.d.ts +0 -5
- package/dist/tasks/base-model.d.ts.map +0 -1
- package/dist/tasks/base-model.js.map +0 -1
- package/dist/tasks/create.test.d.ts +0 -2
- package/dist/tasks/create.test.d.ts.map +0 -1
- package/dist/tasks/create.test.js +0 -41
- package/dist/tasks/create.test.js.map +0 -1
- package/dist/tasks/e2e.test.d.ts +0 -2
- package/dist/tasks/e2e.test.d.ts.map +0 -1
- package/dist/tasks/e2e.test.js +0 -108
- package/dist/tasks/e2e.test.js.map +0 -1
- package/dist/tasks/update.test.d.ts +0 -2
- package/dist/tasks/update.test.d.ts.map +0 -1
- package/dist/tasks/update.test.js +0 -79
- package/dist/tasks/update.test.js.map +0 -1
- package/dist/tasks/warmup.test.d.ts +0 -2
- package/dist/tasks/warmup.test.d.ts.map +0 -1
- package/dist/tasks/warmup.test.js +0 -40
- package/dist/tasks/warmup.test.js.map +0 -1
- package/dist/templates/apps/nextjs/tests/index.test.ts +0 -7
- package/dist/templates/apps/nextjs/tests/test-utils.example.test.ts +0 -169
- package/dist/templates/apps/nextjs/tsconfig.test.json +0 -38
- package/dist/test-utils/console.test.d.ts +0 -2
- package/dist/test-utils/console.test.d.ts.map +0 -1
- package/dist/test-utils/console.test.js +0 -70
- package/dist/test-utils/console.test.js.map +0 -1
- package/dist/test-utils/kysely-mocks.test.d.ts +0 -2
- package/dist/test-utils/kysely-mocks.test.d.ts.map +0 -1
- package/dist/test-utils/kysely-mocks.test.js +0 -126
- package/dist/test-utils/kysely-mocks.test.js.map +0 -1
- package/dist/test-utils/wallet-mocks.test.d.ts +0 -2
- package/dist/test-utils/wallet-mocks.test.d.ts.map +0 -1
- package/dist/test-utils/wallet-mocks.test.js +0 -55
- package/dist/test-utils/wallet-mocks.test.js.map +0 -1
- package/dist/test-utils/wallet-setup.test.d.ts +0 -2
- package/dist/test-utils/wallet-setup.test.d.ts.map +0 -1
- package/dist/test-utils/wallet-setup.test.js +0 -18
- package/dist/test-utils/wallet-setup.test.js.map +0 -1
- package/dist/util/engines.test.d.ts +0 -2
- package/dist/util/engines.test.d.ts.map +0 -1
- package/dist/util/engines.test.js +0 -79
- package/dist/util/engines.test.js.map +0 -1
- package/dist/wallet/biometric.test.d.ts +0 -2
- package/dist/wallet/biometric.test.d.ts.map +0 -1
- package/dist/wallet/biometric.test.js +0 -44
- package/dist/wallet/biometric.test.js.map +0 -1
- package/dist/wallet/crypto.test.d.ts +0 -2
- package/dist/wallet/crypto.test.d.ts.map +0 -1
- package/dist/wallet/crypto.test.js +0 -34
- package/dist/wallet/crypto.test.js.map +0 -1
- package/dist/wallet/destinations.test.d.ts +0 -2
- package/dist/wallet/destinations.test.d.ts.map +0 -1
- package/dist/wallet/destinations.test.js +0 -34
- package/dist/wallet/destinations.test.js.map +0 -1
- package/dist/wallet/external-provider.test.d.ts +0 -2
- package/dist/wallet/external-provider.test.d.ts.map +0 -1
- package/dist/wallet/external-provider.test.js +0 -44
- package/dist/wallet/external-provider.test.js.map +0 -1
- package/dist/wallet/indexeddb.test.d.ts +0 -2
- package/dist/wallet/indexeddb.test.d.ts.map +0 -1
- package/dist/wallet/indexeddb.test.js +0 -28
- package/dist/wallet/indexeddb.test.js.map +0 -1
- package/dist/wallet/kdf.test.d.ts +0 -2
- package/dist/wallet/kdf.test.d.ts.map +0 -1
- package/dist/wallet/kdf.test.js +0 -54
- package/dist/wallet/kdf.test.js.map +0 -1
- package/dist/wallet/next/components.test.d.ts +0 -2
- package/dist/wallet/next/components.test.d.ts.map +0 -1
- package/dist/wallet/next/components.test.js +0 -122
- package/dist/wallet/next/components.test.js.map +0 -1
- package/dist/wallet/next/useInAppWallet.test.d.ts +0 -2
- package/dist/wallet/next/useInAppWallet.test.d.ts.map +0 -1
- package/dist/wallet/next/useInAppWallet.test.js +0 -261
- package/dist/wallet/next/useInAppWallet.test.js.map +0 -1
- package/dist/wallet/provider.test.d.ts +0 -2
- package/dist/wallet/provider.test.d.ts.map +0 -1
- package/dist/wallet/provider.test.js +0 -170
- package/dist/wallet/provider.test.js.map +0 -1
- package/dist/wallet/signer.test.d.ts +0 -2
- package/dist/wallet/signer.test.d.ts.map +0 -1
- package/dist/wallet/signer.test.js +0 -62
- package/dist/wallet/signer.test.js.map +0 -1
- package/dist/wallet/storage.test.d.ts +0 -2
- package/dist/wallet/storage.test.d.ts.map +0 -1
- package/dist/wallet/storage.test.js +0 -103
- package/dist/wallet/storage.test.js.map +0 -1
- package/dist/wallet/wallet.test.d.ts +0 -2
- package/dist/wallet/wallet.test.d.ts.map +0 -1
- package/dist/wallet/wallet.test.js +0 -150
- package/dist/wallet/wallet.test.js.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composición de motores (https://gitlab.com/pasosdeJesus/m/-/work_items/39) — tipos puros.
|
|
3
|
+
*
|
|
4
|
+
* Un motor se describe con **dos archivos**:
|
|
5
|
+
* - `m-engine.json` → **intención** (a mano): montaje, motores/tablas
|
|
6
|
+
* que usa, capacidades, futuros renombres.
|
|
7
|
+
* - `m-engine.generated.ts` → **hechos derivados** (generado por `eng:sync`):
|
|
8
|
+
* nombre/versión, modelo, contratos, vistas, comandos.
|
|
9
|
+
*
|
|
10
|
+
* Regla de oro: lo que se **deriva** no se escribe a mano; lo que es **intención**
|
|
11
|
+
* (y no se puede derivar) va en `m-engine.json`.
|
|
12
|
+
*
|
|
13
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/compose/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `eng:sync [<motor>] [--check]` (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D3) — **genera** `m-engine.generated.ts`
|
|
3
|
+
* from the motor's sources. Idempotent: re-running with no source change is a
|
|
4
|
+
* no-op. With `--check` it writes nothing and reports whether it is stale.
|
|
5
|
+
*
|
|
6
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
7
|
+
*/
|
|
8
|
+
import type { SyncResult } from './manifest.js';
|
|
9
|
+
export declare function sync(dir: string, options?: {
|
|
10
|
+
check?: boolean;
|
|
11
|
+
}): SyncResult;
|
|
12
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/compose/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE/C,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,CAa/E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `eng:sync [<motor>] [--check]` (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D3) — **genera** `m-engine.generated.ts`
|
|
3
|
+
* from the motor's sources. Idempotent: re-running with no source change is a
|
|
4
|
+
* no-op. With `--check` it writes nothing and reports whether it is stale.
|
|
5
|
+
*
|
|
6
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { basename, dirname, join } from 'node:path';
|
|
10
|
+
import { GENERATED_RELATIVE, deriveFrom, renderGenerated } from './derive.js';
|
|
11
|
+
import { readIntention, readPackageJson } from './discover.js';
|
|
12
|
+
export function sync(dir, options = {}) {
|
|
13
|
+
if (!readIntention(dir))
|
|
14
|
+
throw new Error(`not a motor (no m-engine.json): ${dir}`);
|
|
15
|
+
const pkg = readPackageJson(dir);
|
|
16
|
+
const derived = deriveFrom(dir, pkg?.name ?? basename(dir), pkg?.version ?? '0.0.0', pkg);
|
|
17
|
+
const contents = renderGenerated(derived);
|
|
18
|
+
const path = join(dir, GENERATED_RELATIVE);
|
|
19
|
+
const existing = existsSync(path) ? readFileSync(path, 'utf-8') : null;
|
|
20
|
+
const changed = existing !== contents;
|
|
21
|
+
if (!options.check && changed) {
|
|
22
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
23
|
+
writeFileSync(path, contents, 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
return { path, changed };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/compose/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEnD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG9D,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,UAA+B,EAAE;IACjE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAA;IAClF,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,IAAI,OAAO,EAAE,GAAG,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACtE,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,CAAA;IACrC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;QAC9B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autocontención (https://gitlab.com/pasosdeJesus/m/-/work_items/39 D7/§4): "lo que el proyecto usa" se deriva de sus
|
|
3
|
+
* **`import`/código** —las tablas de los motores que referencia— y se compara con
|
|
4
|
+
* lo **declarado** en su `m-engine.json` (`engines.<motor>.tables`) para reportar
|
|
5
|
+
* `missing`/`extra`.
|
|
6
|
+
*
|
|
7
|
+
* Herramienta: la API **sintáctica** de `tsc` (`ts.createSourceFile`, sin
|
|
8
|
+
* `Program`); si `typescript` no está disponible, `grep`-like por nombre. Alcance:
|
|
9
|
+
* `src/**` y `app/**`; `node_modules` fuera.
|
|
10
|
+
*
|
|
11
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
12
|
+
*/
|
|
13
|
+
import { type PackageJson } from './discover.js';
|
|
14
|
+
export interface DeclaredUsage {
|
|
15
|
+
/** Unión de las tablas declaradas (`engines.<motor>.tables`). */
|
|
16
|
+
all: string[];
|
|
17
|
+
byMotor: Record<string, string[]>;
|
|
18
|
+
}
|
|
19
|
+
export interface UsageReport {
|
|
20
|
+
used: string[];
|
|
21
|
+
missing: string[];
|
|
22
|
+
extra: string[];
|
|
23
|
+
}
|
|
24
|
+
/** Fuentes del proyecto (`src/**`, `app/**`). */
|
|
25
|
+
export declare function projectSources(rootDir: string): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Tablas (de `tables`) que el código del proyecto referencia. Con `typescript`
|
|
28
|
+
* usa el parser sintáctico (identificadores y literales de cadena); si no, un
|
|
29
|
+
* chequeo por nombre con límites de palabra.
|
|
30
|
+
*/
|
|
31
|
+
export declare function tablesUsed(rootDir: string, tables: readonly string[]): string[];
|
|
32
|
+
/** Tablas declaradas por un proyecto en su `m-engine.json` (`engines.<motor>.tables`). */
|
|
33
|
+
export declare function declaredUsage(projectDir: string): DeclaredUsage;
|
|
34
|
+
/** Compara lo usado contra lo declarado: `missing` (usado y no declarado) y `extra`. */
|
|
35
|
+
export declare function usageReport(used: readonly string[], declared: readonly string[]): UsageReport;
|
|
36
|
+
export interface ImportFinding {
|
|
37
|
+
/** Paquete externo importado. */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Archivo donde se importa (el primero que se encuentra). */
|
|
40
|
+
file: string;
|
|
41
|
+
/** `true` cuando el import está sólo en pruebas (`*.test.ts`). */
|
|
42
|
+
dev: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Paquete de un especificador (`@alcance/pkg/sub` → `@alcance/pkg`); `null` si es relativo o `node:`. */
|
|
45
|
+
export declare function packageOf(specifier: string): string | null;
|
|
46
|
+
/** Paquetes externos que importa un motor (`src/**`), con el archivo y si es sólo de pruebas. */
|
|
47
|
+
export declare function importedPackages(motorDir: string): ImportFinding[];
|
|
48
|
+
/**
|
|
49
|
+
* "El motor declara lo que usa": imports externos de `src/**` que no están en las
|
|
50
|
+
* `dependencies`/`peerDependencies`/`optionalDependencies` del motor (para pruebas,
|
|
51
|
+
* vale también `devDependencies`).
|
|
52
|
+
*/
|
|
53
|
+
export declare function undeclaredImports(motorDir: string, pkg: PackageJson | null): ImportFinding[];
|
|
54
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/compose/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAE/D,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAYD,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAUD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAyB/E;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAQ/D;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAQ7F;AAED,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,GAAG,EAAE,OAAO,CAAA;CACb;AAED,0GAA0G;AAC1G,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1D;AA2BD,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAelE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,aAAa,EAAE,CAQ5F"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autocontención (https://gitlab.com/pasosdeJesus/m/-/work_items/39 D7/§4): "lo que el proyecto usa" se deriva de sus
|
|
3
|
+
* **`import`/código** —las tablas de los motores que referencia— y se compara con
|
|
4
|
+
* lo **declarado** en su `m-engine.json` (`engines.<motor>.tables`) para reportar
|
|
5
|
+
* `missing`/`extra`.
|
|
6
|
+
*
|
|
7
|
+
* Herramienta: la API **sintáctica** de `tsc` (`ts.createSourceFile`, sin
|
|
8
|
+
* `Program`); si `typescript` no está disponible, `grep`-like por nombre. Alcance:
|
|
9
|
+
* `src/**` y `app/**`; `node_modules` fuera.
|
|
10
|
+
*
|
|
11
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { readIntention } from './discover.js';
|
|
17
|
+
function walk(dir, acc) {
|
|
18
|
+
if (!existsSync(dir))
|
|
19
|
+
return;
|
|
20
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
21
|
+
if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name.startsWith('.'))
|
|
22
|
+
continue;
|
|
23
|
+
const full = join(dir, entry.name);
|
|
24
|
+
if (entry.isDirectory())
|
|
25
|
+
walk(full, acc);
|
|
26
|
+
else if (/\.tsx?$/.test(entry.name) && !/\.d\.ts$/.test(entry.name))
|
|
27
|
+
acc.push(full);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Fuentes del proyecto (`src/**`, `app/**`). */
|
|
31
|
+
export function projectSources(rootDir) {
|
|
32
|
+
const files = [];
|
|
33
|
+
for (const base of ['src', 'app'])
|
|
34
|
+
walk(join(rootDir, base), files);
|
|
35
|
+
return files;
|
|
36
|
+
}
|
|
37
|
+
function tryLoadTypescript() {
|
|
38
|
+
try {
|
|
39
|
+
return createRequire(import.meta.url)('typescript');
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Tablas (de `tables`) que el código del proyecto referencia. Con `typescript`
|
|
47
|
+
* usa el parser sintáctico (identificadores y literales de cadena); si no, un
|
|
48
|
+
* chequeo por nombre con límites de palabra.
|
|
49
|
+
*/
|
|
50
|
+
export function tablesUsed(rootDir, tables) {
|
|
51
|
+
const names = new Set(tables);
|
|
52
|
+
if (names.size === 0)
|
|
53
|
+
return [];
|
|
54
|
+
const used = new Set();
|
|
55
|
+
const ts = tryLoadTypescript();
|
|
56
|
+
for (const file of projectSources(rootDir)) {
|
|
57
|
+
const text = readFileSync(file, 'utf-8');
|
|
58
|
+
if (!ts) {
|
|
59
|
+
for (const name of names) {
|
|
60
|
+
if (new RegExp(`\\b${name}\\b`).test(text))
|
|
61
|
+
used.add(name);
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
|
|
66
|
+
const visit = (node) => {
|
|
67
|
+
const candidate = ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)
|
|
68
|
+
? node.text
|
|
69
|
+
: undefined;
|
|
70
|
+
if (candidate !== undefined && names.has(candidate))
|
|
71
|
+
used.add(candidate);
|
|
72
|
+
ts.forEachChild(node, visit);
|
|
73
|
+
};
|
|
74
|
+
visit(source);
|
|
75
|
+
}
|
|
76
|
+
return [...used].sort();
|
|
77
|
+
}
|
|
78
|
+
/** Tablas declaradas por un proyecto en su `m-engine.json` (`engines.<motor>.tables`). */
|
|
79
|
+
export function declaredUsage(projectDir) {
|
|
80
|
+
const intention = readIntention(projectDir);
|
|
81
|
+
const byMotor = {};
|
|
82
|
+
for (const [motor, ref] of Object.entries(intention?.engines ?? {})) {
|
|
83
|
+
if (ref.tables && ref.tables.length > 0)
|
|
84
|
+
byMotor[motor] = [...ref.tables];
|
|
85
|
+
}
|
|
86
|
+
const all = [...new Set(Object.values(byMotor).flat())].sort();
|
|
87
|
+
return { all, byMotor };
|
|
88
|
+
}
|
|
89
|
+
/** Compara lo usado contra lo declarado: `missing` (usado y no declarado) y `extra`. */
|
|
90
|
+
export function usageReport(used, declared) {
|
|
91
|
+
const usedSet = new Set(used);
|
|
92
|
+
const declaredSet = new Set(declared);
|
|
93
|
+
return {
|
|
94
|
+
used: [...usedSet].sort(),
|
|
95
|
+
missing: [...usedSet].filter((table) => !declaredSet.has(table)).sort(),
|
|
96
|
+
extra: [...declaredSet].filter((table) => !usedSet.has(table)).sort(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Paquete de un especificador (`@alcance/pkg/sub` → `@alcance/pkg`); `null` si es relativo o `node:`. */
|
|
100
|
+
export function packageOf(specifier) {
|
|
101
|
+
if (!specifier || specifier.startsWith('.') || specifier.startsWith('/') || specifier.startsWith('node:'))
|
|
102
|
+
return null;
|
|
103
|
+
const [first, second] = specifier.split('/');
|
|
104
|
+
if (specifier.startsWith('@'))
|
|
105
|
+
return second ? `${first}/${second}` : null;
|
|
106
|
+
return first || null;
|
|
107
|
+
}
|
|
108
|
+
/** Especificadores de módulo de unas fuentes (import/export … from/require). */
|
|
109
|
+
function moduleSpecifiers(file, text, ts) {
|
|
110
|
+
if (!ts) {
|
|
111
|
+
// Fallback sin `typescript`: cuenta también el texto emitido dentro de plantillas.
|
|
112
|
+
const found = [];
|
|
113
|
+
for (const re of [/from\s+['"]([^'"]+)['"]/g, /require\(\s*['"]([^'"]+)['"]\s*\)/g]) {
|
|
114
|
+
for (const match of text.matchAll(re))
|
|
115
|
+
found.push(match[1]);
|
|
116
|
+
}
|
|
117
|
+
return found;
|
|
118
|
+
}
|
|
119
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
|
|
120
|
+
const found = [];
|
|
121
|
+
const visit = (node) => {
|
|
122
|
+
const specifier = (ts.isImportDeclaration(node) || ts.isExportDeclaration(node))
|
|
123
|
+
? node.moduleSpecifier
|
|
124
|
+
: (ts.isImportEqualsDeclaration(node) && ts.isExternalModuleReference(node.moduleReference))
|
|
125
|
+
? node.moduleReference.expression
|
|
126
|
+
: undefined;
|
|
127
|
+
if (specifier && ts.isStringLiteralLike(specifier))
|
|
128
|
+
found.push(specifier.text);
|
|
129
|
+
ts.forEachChild(node, visit);
|
|
130
|
+
};
|
|
131
|
+
visit(source);
|
|
132
|
+
return found;
|
|
133
|
+
}
|
|
134
|
+
/** Paquetes externos que importa un motor (`src/**`), con el archivo y si es sólo de pruebas. */
|
|
135
|
+
export function importedPackages(motorDir) {
|
|
136
|
+
const ts = tryLoadTypescript();
|
|
137
|
+
const byName = new Map();
|
|
138
|
+
for (const file of projectSources(motorDir)) {
|
|
139
|
+
const text = readFileSync(file, 'utf-8');
|
|
140
|
+
for (const specifier of moduleSpecifiers(file, text, ts)) {
|
|
141
|
+
const name = packageOf(specifier);
|
|
142
|
+
if (!name)
|
|
143
|
+
continue;
|
|
144
|
+
const dev = /\.test\.tsx?$/.test(file);
|
|
145
|
+
const previous = byName.get(name);
|
|
146
|
+
if (previous && (!previous.dev || dev))
|
|
147
|
+
continue;
|
|
148
|
+
byName.set(name, { name, file, dev });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* "El motor declara lo que usa": imports externos de `src/**` que no están en las
|
|
155
|
+
* `dependencies`/`peerDependencies`/`optionalDependencies` del motor (para pruebas,
|
|
156
|
+
* vale también `devDependencies`).
|
|
157
|
+
*/
|
|
158
|
+
export function undeclaredImports(motorDir, pkg) {
|
|
159
|
+
const declared = new Set([
|
|
160
|
+
...Object.keys(pkg?.dependencies ?? {}),
|
|
161
|
+
...Object.keys(pkg?.peerDependencies ?? {}),
|
|
162
|
+
...Object.keys(pkg?.optionalDependencies ?? {}),
|
|
163
|
+
]);
|
|
164
|
+
const devDeclared = new Set([...declared, ...Object.keys(pkg?.devDependencies ?? {})]);
|
|
165
|
+
return importedPackages(motorDir).filter((finding) => !(finding.dev ? devDeclared : declared).has(finding.name));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/compose/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendorización "etapa 0" (https://gitlab.com/pasosdeJesus/m/-/work_items/39 D17): copia trazable de un motor dentro del
|
|
3
|
+
* consumidor (`packages/generated/<motor>`), con **procedencia** (motor, versión,
|
|
4
|
+
* origen y `sha256`) para poder medir **drift** contra el original. Adoptar un
|
|
5
|
+
* cambio del motor = **regenerar** (`eng:sync --vendor`), no fusionar a mano.
|
|
6
|
+
*
|
|
7
|
+
* "Porque ¿quién de vosotros, queriendo edificar una torre, no se sienta primero y calcula los gastos…?" (Lucas 14:28)
|
|
8
|
+
*/
|
|
9
|
+
import { type PackageJson } from './discover.js';
|
|
10
|
+
export interface Provenance {
|
|
11
|
+
motor: string;
|
|
12
|
+
version: string;
|
|
13
|
+
source: string;
|
|
14
|
+
sha256: string;
|
|
15
|
+
}
|
|
16
|
+
/** `sha256` del esquema de referencia del motor (`db/structure.sql`), o `null`. */
|
|
17
|
+
export declare function structureSha(dir: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* `tsconfig.json` de la copia vendorizada: proyecto **autónomo** (no hereda de `m`),
|
|
20
|
+
* de modo que cada copia se compile por separado (`tsc -b`) y no pese en el
|
|
21
|
+
* consumidor (mismo criterio que sus paquetes de motor, p. ej. `gdcluster`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function vendoredTsconfig(): string;
|
|
24
|
+
/** `package.json` de la copia vendorizada: paquete propio, compilable por separado. */
|
|
25
|
+
export declare function vendoredPackageJson(motorDir: string, pkg: PackageJson | null): string;
|
|
26
|
+
/**
|
|
27
|
+
* Motor original con el que medir el drift de una copia vendorizada: el `--from`
|
|
28
|
+
* (la carpeta del motor, o un checkout donde vive en `packages/<motor>`), y si no
|
|
29
|
+
* la `source` de la procedencia.
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveOrigin(from: string | null, motorName: string, provenanceSource?: string): string | null;
|
|
32
|
+
/** Copia un motor a `outDir` con procedencia. Regenera: borra `outDir` primero. */
|
|
33
|
+
export declare function vendor(motorDir: string, outDir: string): Provenance;
|
|
34
|
+
/** Lee la procedencia de una copia vendorizada, o `null`. */
|
|
35
|
+
export declare function readProvenance(outDir: string): Provenance | null;
|
|
36
|
+
/** Quita una copia vendorizada. Devuelve `true` si existía. */
|
|
37
|
+
export declare function unvendor(outDir: string): boolean;
|
|
38
|
+
export type DriftCode = 'ok' | 'drift' | 'absent';
|
|
39
|
+
export interface DriftFinding {
|
|
40
|
+
code: DriftCode;
|
|
41
|
+
message: string;
|
|
42
|
+
}
|
|
43
|
+
/** Mide el drift de una copia vendorizada contra el motor original. */
|
|
44
|
+
export declare function drift(outDir: string, originalDir: string): DriftFinding;
|
|
45
|
+
//# sourceMappingURL=vendor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.d.ts","sourceRoot":"","sources":["../../src/compose/vendor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAkC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAmBzC;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAwBrF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS9G;AAED,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAwBnE;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQhE;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,YAAY,CAUvE"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendorización "etapa 0" (https://gitlab.com/pasosdeJesus/m/-/work_items/39 D17): copia trazable de un motor dentro del
|
|
3
|
+
* consumidor (`packages/generated/<motor>`), con **procedencia** (motor, versión,
|
|
4
|
+
* origen y `sha256`) para poder medir **drift** contra el original. Adoptar un
|
|
5
|
+
* cambio del motor = **regenerar** (`eng:sync --vendor`), no fusionar a mano.
|
|
6
|
+
*
|
|
7
|
+
* "Porque ¿quién de vosotros, queriendo edificar una torre, no se sienta primero y calcula los gastos…?" (Lucas 14:28)
|
|
8
|
+
*/
|
|
9
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
11
|
+
import { basename, join } from 'node:path';
|
|
12
|
+
import { readIntention, readPackageJson } from './discover.js';
|
|
13
|
+
/** Archivos/entradas que se copian del motor a la copia vendorizada. */
|
|
14
|
+
const VENDORED = ['src', 'db', 'm-engine.json', 'm-engine.generated.ts'];
|
|
15
|
+
/** `sha256` del esquema de referencia del motor (`db/structure.sql`), o `null`. */
|
|
16
|
+
export function structureSha(dir) {
|
|
17
|
+
const file = join(dir, 'db', 'structure.sql');
|
|
18
|
+
if (!existsSync(file))
|
|
19
|
+
return null;
|
|
20
|
+
return createHash('sha256').update(readFileSync(file)).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `tsconfig.json` de la copia vendorizada: proyecto **autónomo** (no hereda de `m`),
|
|
24
|
+
* de modo que cada copia se compile por separado (`tsc -b`) y no pese en el
|
|
25
|
+
* consumidor (mismo criterio que sus paquetes de motor, p. ej. `gdcluster`).
|
|
26
|
+
*/
|
|
27
|
+
export function vendoredTsconfig() {
|
|
28
|
+
return `${JSON.stringify({
|
|
29
|
+
compilerOptions: {
|
|
30
|
+
target: 'ES2022',
|
|
31
|
+
module: 'NodeNext',
|
|
32
|
+
moduleResolution: 'NodeNext',
|
|
33
|
+
lib: ['ES2022'],
|
|
34
|
+
rootDir: './src',
|
|
35
|
+
outDir: './dist',
|
|
36
|
+
declaration: true,
|
|
37
|
+
composite: true,
|
|
38
|
+
strict: true,
|
|
39
|
+
skipLibCheck: true,
|
|
40
|
+
esModuleInterop: true,
|
|
41
|
+
forceConsistentCasingInFileNames: true,
|
|
42
|
+
},
|
|
43
|
+
include: ['src/**/*'],
|
|
44
|
+
exclude: ['node_modules', 'dist'],
|
|
45
|
+
}, null, 2)}\n`;
|
|
46
|
+
}
|
|
47
|
+
/** `package.json` de la copia vendorizada: paquete propio, compilable por separado. */
|
|
48
|
+
export function vendoredPackageJson(motorDir, pkg) {
|
|
49
|
+
const name = `generated-${basename(motorDir)}`;
|
|
50
|
+
const version = pkg?.version ?? '0.0.0';
|
|
51
|
+
const dependencies = { ...(pkg?.dependencies ?? {}), ...(pkg?.peerDependencies ?? {}) };
|
|
52
|
+
const manifest = {
|
|
53
|
+
name,
|
|
54
|
+
version,
|
|
55
|
+
private: true,
|
|
56
|
+
type: 'module',
|
|
57
|
+
description: `Copia vendorizada de ${pkg?.name ?? name} v${version}, generada por \`bin/m eng:sync --vendor\`; no editar a mano.`,
|
|
58
|
+
main: 'dist/index.js',
|
|
59
|
+
types: 'dist/index.d.ts',
|
|
60
|
+
exports: {
|
|
61
|
+
'.': { import: './dist/index.js', types: './dist/index.d.ts' },
|
|
62
|
+
'./*': { import: './dist/*.js', types: './dist/*.d.ts' },
|
|
63
|
+
},
|
|
64
|
+
scripts: {
|
|
65
|
+
build: 'npx tsc -b',
|
|
66
|
+
typecheck: 'npx tsc -b --pretty false',
|
|
67
|
+
clean: 'rm -rf dist tsconfig.tsbuildinfo',
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
if (Object.keys(dependencies).length > 0)
|
|
71
|
+
manifest.dependencies = dependencies;
|
|
72
|
+
return `${JSON.stringify(manifest, null, 2)}\n`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Motor original con el que medir el drift de una copia vendorizada: el `--from`
|
|
76
|
+
* (la carpeta del motor, o un checkout donde vive en `packages/<motor>`), y si no
|
|
77
|
+
* la `source` de la procedencia.
|
|
78
|
+
*/
|
|
79
|
+
export function resolveOrigin(from, motorName, provenanceSource) {
|
|
80
|
+
if (!from)
|
|
81
|
+
return provenanceSource && existsSync(provenanceSource) ? provenanceSource : null;
|
|
82
|
+
const names = [...new Set([motorName, basename(motorName)])];
|
|
83
|
+
const candidates = [
|
|
84
|
+
from,
|
|
85
|
+
...names.map((name) => join(from, 'packages', name)),
|
|
86
|
+
...names.map((name) => join(from, 'packages', 'generated', name)),
|
|
87
|
+
];
|
|
88
|
+
return candidates.find((dir) => existsSync(join(dir, 'm-engine.json'))) ?? null;
|
|
89
|
+
}
|
|
90
|
+
/** Copia un motor a `outDir` con procedencia. Regenera: borra `outDir` primero. */
|
|
91
|
+
export function vendor(motorDir, outDir) {
|
|
92
|
+
if (!readIntention(motorDir))
|
|
93
|
+
throw new Error(`not a motor (no m-engine.json): ${motorDir}`);
|
|
94
|
+
const pkg = readPackageJson(motorDir);
|
|
95
|
+
rmSync(outDir, { recursive: true, force: true });
|
|
96
|
+
mkdirSync(outDir, { recursive: true });
|
|
97
|
+
// Se copia el modelo + capa de datos, no las pruebas del motor.
|
|
98
|
+
const keep = (source) => !/\.test\.tsx?$/.test(source);
|
|
99
|
+
for (const entry of VENDORED) {
|
|
100
|
+
const from = join(motorDir, entry);
|
|
101
|
+
if (existsSync(from))
|
|
102
|
+
cpSync(from, join(outDir, entry), { recursive: true, filter: keep });
|
|
103
|
+
}
|
|
104
|
+
// Paquete propio + tsconfig autónomo: cada copia se compila por separado (`tsc -b`).
|
|
105
|
+
writeFileSync(join(outDir, 'package.json'), vendoredPackageJson(motorDir, pkg));
|
|
106
|
+
writeFileSync(join(outDir, 'tsconfig.json'), vendoredTsconfig());
|
|
107
|
+
const provenance = {
|
|
108
|
+
motor: pkg?.name ?? basename(motorDir),
|
|
109
|
+
version: pkg?.version ?? '0.0.0',
|
|
110
|
+
source: motorDir,
|
|
111
|
+
sha256: structureSha(motorDir) ?? '',
|
|
112
|
+
};
|
|
113
|
+
writeFileSync(join(outDir, 'PROVENANCE.json'), JSON.stringify(provenance, null, 2) + '\n');
|
|
114
|
+
return provenance;
|
|
115
|
+
}
|
|
116
|
+
/** Lee la procedencia de una copia vendorizada, o `null`. */
|
|
117
|
+
export function readProvenance(outDir) {
|
|
118
|
+
const file = join(outDir, 'PROVENANCE.json');
|
|
119
|
+
if (!existsSync(file))
|
|
120
|
+
return null;
|
|
121
|
+
try {
|
|
122
|
+
return JSON.parse(readFileSync(file, 'utf-8'));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Quita una copia vendorizada. Devuelve `true` si existía. */
|
|
129
|
+
export function unvendor(outDir) {
|
|
130
|
+
if (!existsSync(outDir))
|
|
131
|
+
return false;
|
|
132
|
+
rmSync(outDir, { recursive: true, force: true });
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
/** Mide el drift de una copia vendorizada contra el motor original. */
|
|
136
|
+
export function drift(outDir, originalDir) {
|
|
137
|
+
const provenance = readProvenance(outDir);
|
|
138
|
+
const current = structureSha(originalDir);
|
|
139
|
+
if (!provenance || current === null) {
|
|
140
|
+
return { code: 'absent', message: `sin procedencia o esquema en ${outDir}` };
|
|
141
|
+
}
|
|
142
|
+
if (provenance.sha256 === current) {
|
|
143
|
+
return { code: 'ok', message: `${provenance.motor} v${provenance.version} al día` };
|
|
144
|
+
}
|
|
145
|
+
return { code: 'drift', message: `${provenance.motor} v${provenance.version} desactualizado; corre \`eng:sync --vendor\`` };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../src/compose/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `eng:verify [<motor>]` (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D3) — **guarda** `m-engine.generated.ts` against
|
|
3
|
+
* the sources and the intention; writes nothing and reports findings. Fails when
|
|
4
|
+
* the generated facts no longer derive from the sources, when a declared engine
|
|
5
|
+
* was not discovered, or when `engines.<a>.tables` names a table `a` does not own.
|
|
6
|
+
*
|
|
7
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
8
|
+
*/
|
|
9
|
+
import type { EngineManifest, VerifyResult } from './manifest.js';
|
|
10
|
+
export declare function verify(dir: string, byName?: ReadonlyMap<string, EngineManifest>): VerifyResult;
|
|
11
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/compose/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAW,cAAc,EAAW,YAAY,EAAE,MAAM,eAAe,CAAA;AAMnF,wBAAgB,MAAM,CACpB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAa,GACtD,YAAY,CA0Dd"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `eng:verify [<motor>]` (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D3) — **guarda** `m-engine.generated.ts` against
|
|
3
|
+
* the sources and the intention; writes nothing and reports findings. Fails when
|
|
4
|
+
* the generated facts no longer derive from the sources, when a declared engine
|
|
5
|
+
* was not discovered, or when `engines.<a>.tables` names a table `a` does not own.
|
|
6
|
+
*
|
|
7
|
+
* "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
|
|
8
|
+
*/
|
|
9
|
+
import { basename } from 'node:path';
|
|
10
|
+
import { deriveFrom, readGenerated } from './derive.js';
|
|
11
|
+
import { readIntention, readPackageJson } from './discover.js';
|
|
12
|
+
function sameDerived(a, b) {
|
|
13
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
14
|
+
}
|
|
15
|
+
export function verify(dir, byName = new Map()) {
|
|
16
|
+
const findings = [];
|
|
17
|
+
const intention = readIntention(dir);
|
|
18
|
+
// Not a motor: nothing to guard (the caller decides whether that is an error).
|
|
19
|
+
if (!intention)
|
|
20
|
+
return { ok: true, findings };
|
|
21
|
+
const pkg = readPackageJson(dir);
|
|
22
|
+
const name = pkg?.name ?? basename(dir);
|
|
23
|
+
const version = pkg?.version ?? '0.0.0';
|
|
24
|
+
const derived = deriveFrom(dir, name, version, pkg);
|
|
25
|
+
const generated = readGenerated(dir);
|
|
26
|
+
if (!generated) {
|
|
27
|
+
findings.push({
|
|
28
|
+
code: 'GENERATED_MISSING',
|
|
29
|
+
motor: name,
|
|
30
|
+
message: `m-engine.generated.ts is missing; run \`eng:sync\``,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else if (!sameDerived(generated, derived)) {
|
|
34
|
+
findings.push({
|
|
35
|
+
code: 'GENERATED_STALE',
|
|
36
|
+
motor: name,
|
|
37
|
+
message: `m-engine.generated.ts no longer matches the sources; run \`eng:sync\``,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
for (const [motor, ref] of Object.entries(intention.engines ?? {})) {
|
|
41
|
+
const dependency = byName.get(motor);
|
|
42
|
+
if (!dependency) {
|
|
43
|
+
findings.push({
|
|
44
|
+
code: 'MISSING_ENGINE',
|
|
45
|
+
motor,
|
|
46
|
+
message: `declares engine "${motor}" but it was not discovered`,
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const table of ref.tables ?? []) {
|
|
51
|
+
if (dependency.model.tables.includes(table))
|
|
52
|
+
continue;
|
|
53
|
+
const owner = [...byName.values()].find((engine) => engine.model.tables.includes(table));
|
|
54
|
+
if (owner) {
|
|
55
|
+
findings.push({
|
|
56
|
+
code: 'BROKEN_REFERENCE',
|
|
57
|
+
motor,
|
|
58
|
+
table,
|
|
59
|
+
message: `table "${table}" belongs to "${owner.name}", not to "${motor}"`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
findings.push({
|
|
64
|
+
code: 'UNKNOWN_TABLE',
|
|
65
|
+
motor,
|
|
66
|
+
table,
|
|
67
|
+
message: `engine "${motor}" does not own table "${table}"`,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return { ok: findings.length === 0, findings };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/compose/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/e2e/env.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export interface E2EEnv {
|
|
|
14
14
|
/** Billetera principal (sesión SIWE / primer wallet). */
|
|
15
15
|
account: E2EAccount;
|
|
16
16
|
/**
|
|
17
|
-
* Todas las billeteras disponibles (
|
|
17
|
+
* Todas las billeteras disponibles (https://gitlab.com/pasosdeJesus/m/-/work_items/35: flujos de claim pueden necesitar
|
|
18
18
|
* una billetera de sesión y otra claimer con fondos para gas).
|
|
19
19
|
* Fuentes: TEST_PRIVATE_KEYS (lista separada por comas, prioridad),
|
|
20
20
|
* TEST_PRIVATE_KEY, apps/.env, Hardhat test key.
|