Compare commits
9 Commits
v1.0.6-rc.
...
release/1.
| Author | SHA1 | Date | |
|---|---|---|---|
| e949af26b8 | |||
| 1b50c99f36 | |||
| 188cea82c5 | |||
| 1a8f436170 | |||
| 78bb14ff40 | |||
| f8f063e946 | |||
| 7293a9c0fb | |||
| cabd505ff7 | |||
| 57974aeabd |
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"moduleCode": "order",
|
"moduleCode": "order",
|
||||||
"candidateVersion": "1.0.6-rc.7",
|
"candidateVersion": "1.0.0-rc.1",
|
||||||
"buildRevision": 7,
|
"buildRevision": 1,
|
||||||
"buildChecksum": "f025bdb499023ee1ebbed02d8e76892c393ad9c33491809e16c8a1563ae8ec58",
|
"buildChecksum": "5cf032fdac2b0403fbcad8b44b326a29141ba556bbbb9710ac9329b5d7c031dd",
|
||||||
"schemaInputChecksum": "da0d51d3ee0c0f58a4324e2af0fa695e7d002278b3d90eb223d128442ce5478d",
|
"schemaInputChecksum": "1b3eec01e5b04880166e20e8e6df70b79f227129ea9165e38cfbb925be3c2d23",
|
||||||
"branchName": "release/1.0.6-rc.7"
|
"branchName": "release/1.0.0-rc.1"
|
||||||
}
|
}
|
||||||
|
|||||||
5
bootstrap.js
vendored
5
bootstrap.js
vendored
@@ -11,11 +11,10 @@ function loadGeneratedSaasModule() {
|
|||||||
return require('./dist/saas/generated').GeneratedSaasModule;
|
return require('./dist/saas/generated').GeneratedSaasModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function start(options = {}) {
|
async function start() {
|
||||||
const session = await prepareSaasServiceHost({
|
await prepareSaasServiceHost({
|
||||||
generated: loadGeneratedSaasModule(),
|
generated: loadGeneratedSaasModule(),
|
||||||
});
|
});
|
||||||
if (options.verifySession) await options.verifySession(session);
|
|
||||||
requireExactReleaseEnvironment();
|
requireExactReleaseEnvironment();
|
||||||
return Bootstrap.configure({
|
return Bootstrap.configure({
|
||||||
baseDir: path.join(__dirname, 'dist'),
|
baseDir: path.join(__dirname, 'dist'),
|
||||||
|
|||||||
16
package.json
16
package.json
@@ -10,24 +10,22 @@
|
|||||||
"build": "rimraf dist && mwtsc --cleanOutDir",
|
"build": "rimraf dist && mwtsc --cleanOutDir",
|
||||||
"publish": "cool saas-model finalize",
|
"publish": "cool saas-model finalize",
|
||||||
"start": "node bootstrap.js",
|
"start": "node bootstrap.js",
|
||||||
"start:stable": "node start-stable.js",
|
|
||||||
"test:stable": "node --test test/start-stable.test.cjs",
|
|
||||||
"test:business": "node --test test/orders-business-outcome.test.cjs",
|
|
||||||
"start:local": "cross-env NODE_ENV=local SAAS_RUNTIME_BOOTSTRAP_LOCAL_FALLBACK_ENABLED=true node bootstrap.js",
|
"start:local": "cross-env NODE_ENV=local SAAS_RUNTIME_BOOTSTRAP_LOCAL_FALLBACK_ENABLED=true node bootstrap.js",
|
||||||
"verify:packages": "node scripts/verify-local-packages.cjs",
|
"verify:packages": "node scripts/verify-local-packages.cjs",
|
||||||
"start:frozen": "node start-frozen.js"
|
"start:frozen": "node start-frozen.js",
|
||||||
|
"start:stable": "node start-stable.js",
|
||||||
|
"test:stable": "node --test test/start-stable.test.cjs"
|
||||||
},
|
},
|
||||||
"coolSaas": {
|
"coolSaas": {
|
||||||
"lifecycle": {
|
"lifecycle": {
|
||||||
"dev": "pnpm run build && pnpm run start:local",
|
"dev": "pnpm run build && pnpm run start:local",
|
||||||
"test": "pnpm run typecheck && pnpm run test:stable && pnpm run test:business",
|
"test": "pnpm run typecheck",
|
||||||
"build": "pnpm run build",
|
"build": "pnpm run build"
|
||||||
"artifactDir": "dist"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cool-midway/module-runtime": "9.1.0",
|
"@cool-midway/module-runtime": "9.1.1",
|
||||||
"@cool-midway/rpc": "9.1.0",
|
"@cool-midway/rpc": "9.1.2",
|
||||||
"@midwayjs/bootstrap": "^3.20.3",
|
"@midwayjs/bootstrap": "^3.20.3",
|
||||||
"@midwayjs/core": "^3.20.3",
|
"@midwayjs/core": "^3.20.3",
|
||||||
"@midwayjs/koa": "^3.20.3",
|
"@midwayjs/koa": "^3.20.3",
|
||||||
|
|||||||
24
pnpm-lock.yaml
generated
24
pnpm-lock.yaml
generated
@@ -9,11 +9,11 @@ importers:
|
|||||||
.:
|
.:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@cool-midway/module-runtime':
|
'@cool-midway/module-runtime':
|
||||||
specifier: 9.1.0
|
specifier: 9.1.1
|
||||||
version: 9.1.0(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)
|
version: 9.1.1(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)
|
||||||
'@cool-midway/rpc':
|
'@cool-midway/rpc':
|
||||||
specifier: 9.1.0
|
specifier: 9.1.2
|
||||||
version: 9.1.0(@cool-midway/module-runtime@9.1.0(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24))(@midwayjs/validate@3.20.24)(debug@4.4.3)
|
version: 9.1.2(@cool-midway/module-runtime@9.1.1(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24))(@midwayjs/validate@3.20.24)(debug@4.4.3)
|
||||||
'@midwayjs/bootstrap':
|
'@midwayjs/bootstrap':
|
||||||
specifier: ^3.20.3
|
specifier: ^3.20.3
|
||||||
version: 3.20.24
|
version: 3.20.24
|
||||||
@@ -72,16 +72,16 @@ packages:
|
|||||||
resolution: {integrity: sha512-Kf4x3IrWnBM5o2k3hdHhDt7ujBG7MLn5JXV4o8glKEh4pqdzgoe/HgTcEvtdpIRvy80MsnIt5ZlH1Eq54qV4uQ==}
|
resolution: {integrity: sha512-Kf4x3IrWnBM5o2k3hdHhDt7ujBG7MLn5JXV4o8glKEh4pqdzgoe/HgTcEvtdpIRvy80MsnIt5ZlH1Eq54qV4uQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
'@cool-midway/module-runtime@9.1.0':
|
'@cool-midway/module-runtime@9.1.1':
|
||||||
resolution: {integrity: sha512-8pWWQpzaR28gOLuZ8aQV+RVFmuFqtIfz8VHgu4uMMDnp4Jo3qPtKonQB6AV8BUNex2CBCkyFhmrZ8D+3YVNNeA==}
|
resolution: {integrity: sha512-OHJzqJX6ktnelL1J6k/7forr6TujDuLHBQ/Z21ueGiEdtvfQ3cHKjhYFEp6WwgeISECxGOxGdGyASPP3cV6jXQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@midwayjs/core': '>=3.20.0'
|
'@midwayjs/core': '>=3.20.0'
|
||||||
typeorm: '>=0.3.20'
|
typeorm: '>=0.3.20'
|
||||||
|
|
||||||
'@cool-midway/rpc@9.1.0':
|
'@cool-midway/rpc@9.1.2':
|
||||||
resolution: {integrity: sha512-G9auVH/bvCHrxVXVeDV17ejiUTEBvrnA54B/W6NtDFF0HaT0nk3lz8thrzFESACeHzwWppA0FAC51upwVCyxzA==}
|
resolution: {integrity: sha512-WVR+zsMtojllK9LsI1Kx3VUMgEzvKLuxWVkOudyxzjLwWF4VU2/hnRN6tPJA1mBoSSJCxaSrbF0tZwbeWxcgzQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@cool-midway/module-runtime': '>=9.1.0 <10'
|
'@cool-midway/module-runtime': '>=9.1.1 <10'
|
||||||
'@midwayjs/validate': '>=3.20.0'
|
'@midwayjs/validate': '>=3.20.0'
|
||||||
|
|
||||||
'@cool-midway/typeorm@0.3.20':
|
'@cool-midway/typeorm@0.3.20':
|
||||||
@@ -2493,14 +2493,14 @@ snapshots:
|
|||||||
- supports-color
|
- supports-color
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
|
|
||||||
'@cool-midway/module-runtime@9.1.0(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)':
|
'@cool-midway/module-runtime@9.1.1(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@midwayjs/core': 3.20.24
|
'@midwayjs/core': 3.20.24
|
||||||
typeorm: '@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7))'
|
typeorm: '@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7))'
|
||||||
|
|
||||||
'@cool-midway/rpc@9.1.0(@cool-midway/module-runtime@9.1.0(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24))(@midwayjs/validate@3.20.24)(debug@4.4.3)':
|
'@cool-midway/rpc@9.1.2(@cool-midway/module-runtime@9.1.1(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24))(@midwayjs/validate@3.20.24)(debug@4.4.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@cool-midway/module-runtime': 9.1.0(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)
|
'@cool-midway/module-runtime': 9.1.1(@cool-midway/typeorm@0.3.20(ioredis@5.11.1)(mysql2@3.24.3(@types/node@22.10.7)))(@midwayjs/core@3.20.24)
|
||||||
'@midwayjs/validate': 3.20.24
|
'@midwayjs/validate': 3.20.24
|
||||||
ioredis: 5.11.1
|
ioredis: 5.11.1
|
||||||
moleculer: 0.14.36(debug@4.4.3)(ioredis@5.11.1)
|
moleculer: 0.14.36(debug@4.4.3)(ioredis@5.11.1)
|
||||||
|
|||||||
@@ -111,31 +111,31 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "@cool-midway/module-runtime",
|
"name": "@cool-midway/module-runtime",
|
||||||
"version": "9.1.0",
|
"version": "9.1.1",
|
||||||
"sha256": "88caa11bb651e146b877809c5dbbe43a8161844b8f8f1f04f38437dcddc4ef0b",
|
"sha256": "b4ef3ceb929ec2575f1858be5f85b5cc470e4e942b6a00fb25886874993a8144",
|
||||||
"integrity": "sha512-8pWWQpzaR28gOLuZ8aQV+RVFmuFqtIfz8VHgu4uMMDnp4Jo3qPtKonQB6AV8BUNex2CBCkyFhmrZ8D+3YVNNeA==",
|
"integrity": "sha512-OHJzqJX6ktnelL1J6k/7forr6TujDuLHBQ/Z21ueGiEdtvfQ3cHKjhYFEp6WwgeISECxGOxGdGyASPP3cV6jXQ==",
|
||||||
"files": {
|
"files": {
|
||||||
"dist/action.js": "86b35ec3d9d020f253cfa42f8030444da39a9742f6480c94010cc342056e0e4a",
|
"dist/action.js": "86b35ec3d9d020f253cfa42f8030444da39a9742f6480c94010cc342056e0e4a",
|
||||||
"dist/adapter.js": "d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230",
|
"dist/adapter.js": "d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230",
|
||||||
"dist/business-reject.js": "1bea195b38fbcce97512400be8fe43f01596a03aa5ea5d6546346064c2cd1b03",
|
"dist/business-reject.js": "1bea195b38fbcce97512400be8fe43f01596a03aa5ea5d6546346064c2cd1b03",
|
||||||
"dist/configuration.js": "fed0a7dc7e6aa6e233f8d66109589b15ccd6b0f3fdd46dc6d55bbd8c38b45311",
|
"dist/configuration.js": "fed0a7dc7e6aa6e233f8d66109589b15ccd6b0f3fdd46dc6d55bbd8c38b45311",
|
||||||
"dist/connection.js": "dc44aef513160623b1282b174e5bd17bc5ddeefcdaac1d328b23e061d7516f67",
|
"dist/connection.js": "dc44aef513160623b1282b174e5bd17bc5ddeefcdaac1d328b23e061d7516f67",
|
||||||
"dist/consumer.js": "18189e798ccaab3a0809f2d49430ec48361f0f705645b91dd0d889210cbf38e3",
|
"dist/consumer.js": "2f3b54f49775eacdf977642cb0a06505fffaaff6300527fd283751ad9c7c27d0",
|
||||||
"dist/context.js": "eb2b3c97119f94c7f52498b591b7e63fe51b1ef8194b3b9cf6dbea6d0af555e7",
|
"dist/context.js": "eb2b3c97119f94c7f52498b591b7e63fe51b1ef8194b3b9cf6dbea6d0af555e7",
|
||||||
"dist/crud-host.js": "19ab92b9744f8cb671c4dcbfce288160c60e008f14a0b018f38a1c0de55aa4b8",
|
"dist/crud-host.js": "19ab92b9744f8cb671c4dcbfce288160c60e008f14a0b018f38a1c0de55aa4b8",
|
||||||
"dist/crud.js": "235a6ce66b54373c80bbba8ea444162ef44e8fa34863cb30be59b62b8a008043",
|
"dist/crud.js": "235a6ce66b54373c80bbba8ea444162ef44e8fa34863cb30be59b62b8a008043",
|
||||||
"dist/data.js": "e54a8d582fadefd9dc75eec049d3eee1c80fb92ed656d46d384fc48d8ae4d7d0",
|
"dist/data.js": "e54a8d582fadefd9dc75eec049d3eee1c80fb92ed656d46d384fc48d8ae4d7d0",
|
||||||
"dist/error.js": "f2dced066aef06c895d00285ecf69d52203bfce1635539a4b8c88d9de2a733d3",
|
"dist/error.js": "f2dced066aef06c895d00285ecf69d52203bfce1635539a4b8c88d9de2a733d3",
|
||||||
"dist/event-writer-migration.js": "deee4d33d7c3049f2ab9f6a9605cfea17aaf9536db7d3d1305f4903d48ff5e4f",
|
"dist/event-writer-migration.js": "deee4d33d7c3049f2ab9f6a9605cfea17aaf9536db7d3d1305f4903d48ff5e4f",
|
||||||
"dist/event-writer.js": "0c4a2f270ba868b772d83d002255cf60bf3c3f69425881121c3639184e5e17ac",
|
"dist/event-writer.js": "e45f62209d263b2be11a25680352c4e8dd7690b655f2f9ee007d9f1f6b8646b0",
|
||||||
"dist/decorator/event.js": "3801cf45836398239734611d4c58ea0261d32e870544a770e7ad667704aad143",
|
"dist/decorator/event.js": "3801cf45836398239734611d4c58ea0261d32e870544a770e7ad667704aad143",
|
||||||
"dist/executor.js": "e65ec1d28ee63bfc75b56a58485640a5c2f2e4af6f60122974bd73d047ceda0b",
|
"dist/executor.js": "4dc904785a8bd385e98f239e1517cc33fb3e4c96807fffd1393b22ec93ff025a",
|
||||||
"dist/generated-module.js": "84739644067c446863ad34166602d0dcec9212661c61cbeea5bfe85a113b4c0a",
|
"dist/generated-module.js": "84739644067c446863ad34166602d0dcec9212661c61cbeea5bfe85a113b4c0a",
|
||||||
"dist/index.js": "c0de3d4fae6a2f28f5ee89519c1daf7c36dc7bcc13aeccc0372999fec4b703c9",
|
"dist/index.js": "c0de3d4fae6a2f28f5ee89519c1daf7c36dc7bcc13aeccc0372999fec4b703c9",
|
||||||
"dist/injected-action.js": "3fdee7be7fee4e07c41884cbc43cb23bbd1dd4ef0ffe49fee37c53f2a8d8ca97",
|
"dist/injected-action.js": "3fdee7be7fee4e07c41884cbc43cb23bbd1dd4ef0ffe49fee37c53f2a8d8ca97",
|
||||||
"dist/injected-crud.js": "5f4593c1b12a50765f4112381a0db9f732202b908f84b6f13225da7a567eba0c",
|
"dist/injected-crud.js": "5f4593c1b12a50765f4112381a0db9f732202b908f84b6f13225da7a567eba0c",
|
||||||
"dist/internal.js": "2d5ee68295abbaaf9a74aa7fb805cb1be70702354e1c058a2eb02fa11d1561e1",
|
"dist/internal.js": "2d5ee68295abbaaf9a74aa7fb805cb1be70702354e1c058a2eb02fa11d1561e1",
|
||||||
"dist/inventory.js": "c97c12ecb113302e4d21deef52a6d6b6b477ae2e192853d664211e19f539cd74",
|
"dist/inventory.js": "7c6ce797200ad627dd9374e1ad70638ff11f7483c5fd98e9adef6992b1a1aee9",
|
||||||
"dist/json-schema.js": "ef1a378710cfc285679fdb8130750169bc09e19611a2e577ef081b44e5f2eeb0",
|
"dist/json-schema.js": "ef1a378710cfc285679fdb8130750169bc09e19611a2e577ef081b44e5f2eeb0",
|
||||||
"dist/managed-action.js": "fb42b5f0b1992e2b2b3f5176081a2de06cac020ca3ed744f46d93f094cfe96dd",
|
"dist/managed-action.js": "fb42b5f0b1992e2b2b3f5176081a2de06cac020ca3ed744f46d93f094cfe96dd",
|
||||||
"dist/model.js": "9e548ad45b0cac4642ae9437cbcd52a6deb5dd316de5242ce601c2765f68554a",
|
"dist/model.js": "9e548ad45b0cac4642ae9437cbcd52a6deb5dd316de5242ce601c2765f68554a",
|
||||||
@@ -157,7 +157,7 @@
|
|||||||
"dist/workflow-reply-authority.js": "90ad7bbd35bcc4a0a788d33721cdbc3ec54f5c28ebce288317a40152de50bb10",
|
"dist/workflow-reply-authority.js": "90ad7bbd35bcc4a0a788d33721cdbc3ec54f5c28ebce288317a40152de50bb10",
|
||||||
"dist/workflow.js": "79e25c6e0dc24c6b2277c18b02bedf4fda60754947ae1917b0b9cb2eecb53af3",
|
"dist/workflow.js": "79e25c6e0dc24c6b2277c18b02bedf4fda60754947ae1917b0b9cb2eecb53af3",
|
||||||
"dist/write-fence.js": "95c6af20da75ca92a0149023ebbc515525ddbcd50da3e284209b77536bc2a5f2",
|
"dist/write-fence.js": "95c6af20da75ca92a0149023ebbc515525ddbcd50da3e284209b77536bc2a5f2",
|
||||||
"package.json": "f3638ab357be8eee6b01228a7e8f24dee63fe47f31382f45000abcec18df7fd2",
|
"package.json": "62519527981f22831f9ade24a8c38f8541fb64ebcfdc0905386f9b2dc5fc802c",
|
||||||
"dist/action.d.ts": "8d0c6d6055c1acc4a6a6e70fdb83a70a81693965b20adf2afa0290245cd649cd",
|
"dist/action.d.ts": "8d0c6d6055c1acc4a6a6e70fdb83a70a81693965b20adf2afa0290245cd649cd",
|
||||||
"adapter.d.ts": "ffa850716087cae3e3ef5f5bb54835143d16bcb3ad42b044c0f16aba08209074",
|
"adapter.d.ts": "ffa850716087cae3e3ef5f5bb54835143d16bcb3ad42b044c0f16aba08209074",
|
||||||
"dist/adapter.d.ts": "f70f53cb90da78d4423f46debfea6d922068ea4f70fb063b53135d6538af1eb2",
|
"dist/adapter.d.ts": "f70f53cb90da78d4423f46debfea6d922068ea4f70fb063b53135d6538af1eb2",
|
||||||
@@ -207,13 +207,13 @@
|
|||||||
"fileCount": 90,
|
"fileCount": 90,
|
||||||
"credentialScanPassed": true,
|
"credentialScanPassed": true,
|
||||||
"registry": "https://npm.blendercg.art/",
|
"registry": "https://npm.blendercg.art/",
|
||||||
"tarball": "https://npm.blendercg.art/@cool-midway/module-runtime/-/module-runtime-9.1.0.tgz"
|
"tarball": "https://npm.blendercg.art/@cool-midway/module-runtime/-/module-runtime-9.1.1.tgz"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "@cool-midway/rpc",
|
"name": "@cool-midway/rpc",
|
||||||
"version": "9.1.0",
|
"version": "9.1.2",
|
||||||
"sha256": "7b5b5ce502888a500659cbf6030376dd5d93e57aab2567d53063d1725592653a",
|
"sha256": "624b6bfa6f6ae05bfee779acf22913492a1a3bd7e6ca36c1670da08e6de232d6",
|
||||||
"integrity": "sha512-G9auVH/bvCHrxVXVeDV17ejiUTEBvrnA54B/W6NtDFF0HaT0nk3lz8thrzFESACeHzwWppA0FAC51upwVCyxzA==",
|
"integrity": "sha512-WVR+zsMtojllK9LsI1Kx3VUMgEzvKLuxWVkOudyxzjLwWF4VU2/hnRN6tPJA1mBoSSJCxaSrbF0tZwbeWxcgzQ==",
|
||||||
"files": {
|
"files": {
|
||||||
"dist/action-registry.js": "04f77c61445d47f66eaad984ee8e059a38bb0e610d2f584f5754d5a0ead105c5",
|
"dist/action-registry.js": "04f77c61445d47f66eaad984ee8e059a38bb0e610d2f584f5754d5a0ead105c5",
|
||||||
"dist/saas-host/bootstrap.js": "a53eb6f40c7a7c2427fbcd0cde78e8985f64dda15fcff1843e8957f5e7086271",
|
"dist/saas-host/bootstrap.js": "a53eb6f40c7a7c2427fbcd0cde78e8985f64dda15fcff1843e8957f5e7086271",
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
"dist/event-transport.js": "c056c6c1ab9e5aa9b24b659f03045f64c852ec9e5ac2603d92dcb1baedbc88c2",
|
"dist/event-transport.js": "c056c6c1ab9e5aa9b24b659f03045f64c852ec9e5ac2603d92dcb1baedbc88c2",
|
||||||
"dist/identity.js": "063718c26403ad5d8c6f8737f7351332f6ce5ddde9ee7ebf128e2085d8d70b25",
|
"dist/identity.js": "063718c26403ad5d8c6f8737f7351332f6ce5ddde9ee7ebf128e2085d8d70b25",
|
||||||
"dist/index.js": "26d61f60277e769fa7f9379fc2a98af9840296ea7c4d0e65c8c354bf70d37bdd",
|
"dist/index.js": "26d61f60277e769fa7f9379fc2a98af9840296ea7c4d0e65c8c354bf70d37bdd",
|
||||||
"dist/saas-host/index.js": "ca038796a56260424afbea02215180fa319208403ddd2e5027901eb927277823",
|
"dist/saas-host/index.js": "897d19161dac81262025c9533d4b7cafe0c163198d91f8a792173314c796a97e",
|
||||||
"dist/injected-action.js": "92fdaaa784e64b0babbcba16a941d3569367a47ccdc2137d7afc415e542f7bc9",
|
"dist/injected-action.js": "92fdaaa784e64b0babbcba16a941d3569367a47ccdc2137d7afc415e542f7bc9",
|
||||||
"dist/managed-runtime.js": "1985cb709666c9f6bba561b1756cbc2420fd068e138f82180712a3c577760373",
|
"dist/managed-runtime.js": "1985cb709666c9f6bba561b1756cbc2420fd068e138f82180712a3c577760373",
|
||||||
"dist/mode.js": "b986fe6d3623d6baad7ecd44496c1fa681203c934013af8baaa330ba371fc75d",
|
"dist/mode.js": "b986fe6d3623d6baad7ecd44496c1fa681203c934013af8baaa330ba371fc75d",
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
"dist/test.js": "5386504311845b9dc3fe230d3c5a3b5ab3c6d36154add15e91d32d8442c25157",
|
"dist/test.js": "5386504311845b9dc3fe230d3c5a3b5ab3c6d36154add15e91d32d8442c25157",
|
||||||
"dist/types.js": "d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230",
|
"dist/types.js": "d43aa81f5bc89faa359e0f97c814ba25155591ff078fbb9bfd40f8c7c9683230",
|
||||||
"dist/workflow-recovery.js": "d423e33df1cca07250036ec6b61aaa7fcddea1e1440450487da13f01b16b26f0",
|
"dist/workflow-recovery.js": "d423e33df1cca07250036ec6b61aaa7fcddea1e1440450487da13f01b16b26f0",
|
||||||
"package.json": "6d210735ca72b9bc64983370af7f8d1245849500fd717c19858b4fa0496331ef",
|
"package.json": "42ed936eafa84ce842c19bcb62970688fa9dee3030c071fc7eff5d33424e646f",
|
||||||
"dist/action-registry.d.ts": "40231dd8299c0bfae1b006105d49945eb2f20a40334856db32e4b7cc2851398b",
|
"dist/action-registry.d.ts": "40231dd8299c0bfae1b006105d49945eb2f20a40334856db32e4b7cc2851398b",
|
||||||
"dist/saas-host/bootstrap.d.ts": "f639edef99770f091ac90e737a0ab2c857830241a8996171492768d108ad43f0",
|
"dist/saas-host/bootstrap.d.ts": "f639edef99770f091ac90e737a0ab2c857830241a8996171492768d108ad43f0",
|
||||||
"dist/caller-context.d.ts": "3f58cb5d653e2d5179996c3302dddc5c4bfdc3ff2ac501ca8d6dcedb4cb606d5",
|
"dist/caller-context.d.ts": "3f58cb5d653e2d5179996c3302dddc5c4bfdc3ff2ac501ca8d6dcedb4cb606d5",
|
||||||
@@ -262,7 +262,7 @@
|
|||||||
"dist/event-transport.d.ts": "db3aad6cb1ed297c3cbc785101a26577beabae23e8255e18e993a9c0d42849e8",
|
"dist/event-transport.d.ts": "db3aad6cb1ed297c3cbc785101a26577beabae23e8255e18e993a9c0d42849e8",
|
||||||
"dist/identity.d.ts": "5e7a2f9cbe80816cad22f678663f814f89e2295ecfb0b6d7436a8a1efb166f7c",
|
"dist/identity.d.ts": "5e7a2f9cbe80816cad22f678663f814f89e2295ecfb0b6d7436a8a1efb166f7c",
|
||||||
"dist/index.d.ts": "d4ac7f2d87a93a50263ccbb3da781dcf4d3db9775ae5ba316327862f0c007d69",
|
"dist/index.d.ts": "d4ac7f2d87a93a50263ccbb3da781dcf4d3db9775ae5ba316327862f0c007d69",
|
||||||
"dist/saas-host/index.d.ts": "2e5e01089a7a42c312456f44054a33a426ef18572affd687e79a90acb58956c9",
|
"dist/saas-host/index.d.ts": "14845d92d00654415eaccca39da6ec4f347ac98ca2c3ed2f0df7aa36db8fdf2c",
|
||||||
"index.d.ts": "b764a7488d90d3db5bc04ed44bbe06994574d25c052a139c15e9b11ffe1be954",
|
"index.d.ts": "b764a7488d90d3db5bc04ed44bbe06994574d25c052a139c15e9b11ffe1be954",
|
||||||
"dist/injected-action.d.ts": "10954865dd4ddd1f1bfd867e151d4fda993547fc206346d5ccf39a241d40527e",
|
"dist/injected-action.d.ts": "10954865dd4ddd1f1bfd867e151d4fda993547fc206346d5ccf39a241d40527e",
|
||||||
"dist/managed-runtime.d.ts": "f9c4f933c09ee7488d05cad68cd411de8239998a48738f2a90988aff6f691379",
|
"dist/managed-runtime.d.ts": "f9c4f933c09ee7488d05cad68cd411de8239998a48738f2a90988aff6f691379",
|
||||||
@@ -283,7 +283,7 @@
|
|||||||
"fileCount": 66,
|
"fileCount": 66,
|
||||||
"credentialScanPassed": true,
|
"credentialScanPassed": true,
|
||||||
"registry": "https://npm.blendercg.art/",
|
"registry": "https://npm.blendercg.art/",
|
||||||
"tarball": "https://npm.blendercg.art/@cool-midway/rpc/-/rpc-9.1.0.tgz"
|
"tarball": "https://npm.blendercg.art/@cool-midway/rpc/-/rpc-9.1.2.tgz"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ export class Orders extends SaasTableModel<OrdersRow> {
|
|||||||
static readonly definition = defineSaasTableModel({
|
static readonly definition = defineSaasTableModel({
|
||||||
"kind": "table",
|
"kind": "table",
|
||||||
"moduleCode": "order",
|
"moduleCode": "order",
|
||||||
"revision": 7,
|
"revision": 1,
|
||||||
"schemaVersion": 7,
|
"schemaVersion": 1,
|
||||||
"schemaInputChecksum": "da0d51d3ee0c0f58a4324e2af0fa695e7d002278b3d90eb223d128442ce5478d",
|
"schemaInputChecksum": "1b3eec01e5b04880166e20e8e6df70b79f227129ea9165e38cfbb925be3c2d23",
|
||||||
"tableCode": "orders",
|
"tableCode": "orders",
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import { defineGeneratedSaasModule } from '@cool-midway/module-runtime';
|
|||||||
export const GeneratedSaasModule = defineGeneratedSaasModule({
|
export const GeneratedSaasModule = defineGeneratedSaasModule({
|
||||||
"formatVersion": 2,
|
"formatVersion": 2,
|
||||||
"moduleCode": "order",
|
"moduleCode": "order",
|
||||||
"revision": 7,
|
"revision": 1,
|
||||||
"schemaVersion": 7,
|
"schemaVersion": 1,
|
||||||
"schemaInputChecksum": "da0d51d3ee0c0f58a4324e2af0fa695e7d002278b3d90eb223d128442ce5478d",
|
"schemaInputChecksum": "1b3eec01e5b04880166e20e8e6df70b79f227129ea9165e38cfbb925be3c2d23",
|
||||||
"runtimeContractChecksum": "94a6243b61cf0de0ef9444a403833a432e9597eb5937bc37979ceb0277331bc2",
|
"runtimeContractChecksum": "3d025d1b634c413449eb91164fb1f859a388d8930d2de112980a606b591befce",
|
||||||
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b"
|
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b"
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -83,10 +83,10 @@ export const SaasActions = {
|
|||||||
"actionChecksum": "3978a7ba9a3e0f91842031fd323ec63b3816eef68cb8dc82ffad6d187de8b7ea",
|
"actionChecksum": "3978a7ba9a3e0f91842031fd323ec63b3816eef68cb8dc82ffad6d187de8b7ea",
|
||||||
"outputChecksum": "fe644424ef6a9e462b56edc9f70f48bb218783c69469469d4310de48589a0df5",
|
"outputChecksum": "fe644424ef6a9e462b56edc9f70f48bb218783c69469469d4310de48589a0df5",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7"
|
"providerReleaseVersion": "1.0.0-rc.1"
|
||||||
}),
|
}),
|
||||||
GoodsReleaseStock: defineInjectedSaasAction<DemoGoodsReleaseStockInput, DemoGoodsReleaseStockOutput>({
|
GoodsReleaseStock: defineInjectedSaasAction<DemoGoodsReleaseStockInput, DemoGoodsReleaseStockOutput>({
|
||||||
"kind": "action",
|
"kind": "action",
|
||||||
@@ -148,10 +148,10 @@ export const SaasActions = {
|
|||||||
"outputChecksum": "a632b9f89518c3c17861454b74173a4880d5e8482639d3ff7f761aee4d061bd9",
|
"outputChecksum": "a632b9f89518c3c17861454b74173a4880d5e8482639d3ff7f761aee4d061bd9",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"commandEventType": "saas.workflow.demo.goods.releaseStock",
|
"commandEventType": "saas.workflow.demo.goods.releaseStock",
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7",
|
"providerReleaseVersion": "1.0.0-rc.1",
|
||||||
"commandEventContractChecksum": "18a727b91cf9410c3b7ac14e3a8799dbbfa8937f84667bfe7e31e21e662396be"
|
"commandEventContractChecksum": "18a727b91cf9410c3b7ac14e3a8799dbbfa8937f84667bfe7e31e21e662396be"
|
||||||
}),
|
}),
|
||||||
GoodsReserveStock: defineInjectedSaasAction<DemoGoodsReserveStockInput, DemoGoodsReserveStockOutput>({
|
GoodsReserveStock: defineInjectedSaasAction<DemoGoodsReserveStockInput, DemoGoodsReserveStockOutput>({
|
||||||
@@ -208,10 +208,10 @@ export const SaasActions = {
|
|||||||
"outputChecksum": "545bd8b0bf6eb8670b21497236038187ee0f1df1544a318b16a399458fcb796e",
|
"outputChecksum": "545bd8b0bf6eb8670b21497236038187ee0f1df1544a318b16a399458fcb796e",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"commandEventType": "saas.workflow.demo.goods.reserveStock",
|
"commandEventType": "saas.workflow.demo.goods.reserveStock",
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7",
|
"providerReleaseVersion": "1.0.0-rc.1",
|
||||||
"commandEventContractChecksum": "ffbecad3a3d63b8bf92fde701dfaa11c8502a2c5f9f6bbb89b755e214024c3ae"
|
"commandEventContractChecksum": "ffbecad3a3d63b8bf92fde701dfaa11c8502a2c5f9f6bbb89b755e214024c3ae"
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"manifestVersion": 1,
|
"manifestVersion": 1,
|
||||||
"moduleCode": "order",
|
"moduleCode": "order",
|
||||||
"revision": 7,
|
"revision": 1,
|
||||||
"schemaChecksum": null,
|
"schemaChecksum": null,
|
||||||
"schemaInputChecksum": "da0d51d3ee0c0f58a4324e2af0fa695e7d002278b3d90eb223d128442ce5478d",
|
"schemaInputChecksum": "1b3eec01e5b04880166e20e8e6df70b79f227129ea9165e38cfbb925be3c2d23",
|
||||||
"actionManifestChecksum": null,
|
"actionManifestChecksum": null,
|
||||||
"runtimeContractChecksum": "94a6243b61cf0de0ef9444a403833a432e9597eb5937bc37979ceb0277331bc2",
|
"runtimeContractChecksum": "3d025d1b634c413449eb91164fb1f859a388d8930d2de112980a606b591befce",
|
||||||
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b",
|
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b",
|
||||||
"actions": [
|
"actions": [
|
||||||
"OrdersAdd",
|
"OrdersAdd",
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"formatVersion": 2,
|
"formatVersion": 2,
|
||||||
"moduleCode": "order",
|
"moduleCode": "order",
|
||||||
"revision": 7,
|
"revision": 1,
|
||||||
"releaseVersion": null,
|
"releaseVersion": null,
|
||||||
"schemaVersion": 7,
|
"schemaVersion": 1,
|
||||||
"schemaInputChecksum": "da0d51d3ee0c0f58a4324e2af0fa695e7d002278b3d90eb223d128442ce5478d",
|
"schemaInputChecksum": "1b3eec01e5b04880166e20e8e6df70b79f227129ea9165e38cfbb925be3c2d23",
|
||||||
"schemaChecksum": null,
|
"schemaChecksum": null,
|
||||||
"actionManifestChecksum": null,
|
"actionManifestChecksum": null,
|
||||||
"runtimeContractChecksum": "94a6243b61cf0de0ef9444a403833a432e9597eb5937bc37979ceb0277331bc2",
|
"runtimeContractChecksum": "3d025d1b634c413449eb91164fb1f859a388d8930d2de112980a606b591befce",
|
||||||
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b",
|
"implementationManifestChecksum": "f25647d2dd90e14d6226683d2ff67ba32132b2dfdeb861015805240a96d4635b",
|
||||||
"models": [
|
"models": [
|
||||||
{
|
{
|
||||||
@@ -2031,10 +2031,10 @@
|
|||||||
"actionChecksum": "3978a7ba9a3e0f91842031fd323ec63b3816eef68cb8dc82ffad6d187de8b7ea",
|
"actionChecksum": "3978a7ba9a3e0f91842031fd323ec63b3816eef68cb8dc82ffad6d187de8b7ea",
|
||||||
"outputChecksum": "fe644424ef6a9e462b56edc9f70f48bb218783c69469469d4310de48589a0df5",
|
"outputChecksum": "fe644424ef6a9e462b56edc9f70f48bb218783c69469469d4310de48589a0df5",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7"
|
"providerReleaseVersion": "1.0.0-rc.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2101,10 +2101,10 @@
|
|||||||
"outputChecksum": "a632b9f89518c3c17861454b74173a4880d5e8482639d3ff7f761aee4d061bd9",
|
"outputChecksum": "a632b9f89518c3c17861454b74173a4880d5e8482639d3ff7f761aee4d061bd9",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"commandEventType": "saas.workflow.demo.goods.releaseStock",
|
"commandEventType": "saas.workflow.demo.goods.releaseStock",
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7",
|
"providerReleaseVersion": "1.0.0-rc.1",
|
||||||
"commandEventContractChecksum": "18a727b91cf9410c3b7ac14e3a8799dbbfa8937f84667bfe7e31e21e662396be"
|
"commandEventContractChecksum": "18a727b91cf9410c3b7ac14e3a8799dbbfa8937f84667bfe7e31e21e662396be"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2166,10 +2166,10 @@
|
|||||||
"outputChecksum": "545bd8b0bf6eb8670b21497236038187ee0f1df1544a318b16a399458fcb796e",
|
"outputChecksum": "545bd8b0bf6eb8670b21497236038187ee0f1df1544a318b16a399458fcb796e",
|
||||||
"contractVersion": 1,
|
"contractVersion": 1,
|
||||||
"commandEventType": "saas.workflow.demo.goods.reserveStock",
|
"commandEventType": "saas.workflow.demo.goods.reserveStock",
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"consumerModuleCode": "order",
|
"consumerModuleCode": "order",
|
||||||
"providerModuleCode": "demo",
|
"providerModuleCode": "demo",
|
||||||
"providerReleaseVersion": "1.0.6-rc.7",
|
"providerReleaseVersion": "1.0.0-rc.1",
|
||||||
"commandEventContractChecksum": "ffbecad3a3d63b8bf92fde701dfaa11c8502a2c5f9f6bbb89b755e214024c3ae"
|
"commandEventContractChecksum": "ffbecad3a3d63b8bf92fde701dfaa11c8502a2c5f9f6bbb89b755e214024c3ae"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2209,8 +2209,8 @@
|
|||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
},
|
},
|
||||||
"providerReleaseId": 53,
|
"providerReleaseId": 38,
|
||||||
"providerReleaseVersion": "1.0.6-rc.7"
|
"providerReleaseVersion": "1.0.0-rc.1"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"crud": [
|
"crud": [
|
||||||
|
|||||||
@@ -1,170 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// Exercise the actual TypeScript service, with only its injected CRUD/Action
|
|
||||||
// collaborators stubbed. No application bootstrap, network, database or dist
|
|
||||||
// writes are needed; generated contracts and decorators remain the real ones.
|
|
||||||
require('reflect-metadata');
|
|
||||||
const test = require('node:test');
|
|
||||||
const assert = require('node:assert/strict');
|
|
||||||
const fs = require('node:fs');
|
|
||||||
const path = require('node:path');
|
|
||||||
const ts = require('typescript');
|
|
||||||
const { SaasBusinessReject, ModuleRuntimeError } = require('@cool-midway/module-runtime');
|
|
||||||
const sourceRoot = path.resolve(__dirname, '../src');
|
|
||||||
const previousTsLoader = require.extensions['.ts'];
|
|
||||||
let OrdersService;
|
|
||||||
try {
|
|
||||||
require.extensions['.ts'] = (module, filename) => {
|
|
||||||
assert.ok(filename.startsWith(sourceRoot + path.sep), 'only this service source tree is compiled in memory');
|
|
||||||
const compiled = ts.transpileModule(fs.readFileSync(filename, 'utf8'), {
|
|
||||||
fileName: filename,
|
|
||||||
compilerOptions: { target: ts.ScriptTarget.ES2018, module: ts.ModuleKind.CommonJS,
|
|
||||||
experimentalDecorators: true, emitDecoratorMetadata: true, esModuleInterop: true },
|
|
||||||
});
|
|
||||||
module._compile(compiled.outputText, filename);
|
|
||||||
};
|
|
||||||
({ OrdersService } = require('../src/service/orders.ts'));
|
|
||||||
} finally {
|
|
||||||
if (previousTsLoader) require.extensions['.ts'] = previousTsLoader;
|
|
||||||
else delete require.extensions['.ts'];
|
|
||||||
}
|
|
||||||
|
|
||||||
function fixture(overrides = {}) {
|
|
||||||
const state = {
|
|
||||||
goods: { id: '24', status: 1, price: '12.50', stock: 20 },
|
|
||||||
order: { id: '27', order_no: 'UNIT-ORDER', goods_id: '24', quantity: 3, amount: '37.50', status: 'confirmed' },
|
|
||||||
calls: [], ...overrides,
|
|
||||||
};
|
|
||||||
const service = new OrdersService();
|
|
||||||
service.batchInfo = async input => { state.calls.push(['batchInfo', input]); return { list: state.goods ? [state.goods] : [] }; };
|
|
||||||
service.reserveStock = async input => { state.calls.push(['reserveStock', input]); return { goodsId: input.goodsId, remainingStock: 17 }; };
|
|
||||||
service.releaseStock = async input => { state.calls.push(['releaseStock', input]); return { goodsId: input.goodsId, currentStock: 20 }; };
|
|
||||||
service.orders = {
|
|
||||||
lock: async input => {state.calls.push(['lock',input]);return state.order;},
|
|
||||||
info: async () => assert.fail('missing-record lookup must not invoke the nonnullable info contract'),
|
|
||||||
list: async input => { state.calls.push(['list', input]); return state.order ? [state.order] : []; },
|
|
||||||
add: async input => { state.calls.push(['add', input]); return { id: '27', ...input, ...state.addResult }; },
|
|
||||||
update: async input => { state.calls.push(['update', input]); return { affected: 1 }; },
|
|
||||||
};
|
|
||||||
service.workflow = {start: async input => {state.calls.push(['workflow',input]);return {sagaId:'test-saga'};}};
|
|
||||||
return { service, state };
|
|
||||||
}
|
|
||||||
const createInput = { orderNo: 'UNIT-ORDER', goodsId: 24, quantity: 3 };
|
|
||||||
const business = code => error => error instanceof SaasBusinessReject && !(error instanceof ModuleRuntimeError) && error.code === code;
|
|
||||||
const contract = error => error instanceof ModuleRuntimeError && !(error instanceof SaasBusinessReject) &&
|
|
||||||
error.errorCode === 'MODULE_ACTION_INPUT_INVALID' && error.statusCode === 409;
|
|
||||||
const noWrites = state => assert.ok(state.calls.every(([name]) => !['reserveStock', 'releaseStock', 'add', 'update'].includes(name)));
|
|
||||||
|
|
||||||
test('the existing locked list contract authorizes ID filtering and valid empty-array results', () => {
|
|
||||||
const lock = JSON.parse(fs.readFileSync(path.join(sourceRoot, 'saas/generated/order/saas-schema.lock.json'), 'utf8'));
|
|
||||||
const model = lock.models.find(item => item.tableCode === 'orders');
|
|
||||||
assert.equal(model.fields.find(field => field.code === 'id').filterable, true);
|
|
||||||
const list = lock.actions.find(item => item.manifestDescriptor.name === 'orders.list').manifestDescriptor;
|
|
||||||
assert.equal(list.inputSchema.properties.where.properties.id.type, 'string');
|
|
||||||
assert.equal(list.inputSchema.properties.take.minimum, 1);
|
|
||||||
assert.equal(list.outputSchema.type, 'array');
|
|
||||||
assert.ok(list.tables.some(table => table.tableCode === 'orders' && table.select === true && table.fields.includes('id')));
|
|
||||||
});
|
|
||||||
|
|
||||||
test('unlisted goods is an explicit GOODS_UNAVAILABLE business rejection before any write', async () => {
|
|
||||||
const f = fixture({ goods: { id: '24', status: 0, price: '12.50' } });
|
|
||||||
await assert.rejects(f.service.createOrder(createInput), business('GOODS_UNAVAILABLE'));
|
|
||||||
noWrites(f.state);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('missing goods is GOODS_NOT_FOUND in both order creation and details', async t => {
|
|
||||||
for (const method of ['createOrder', 'detailWithGoods']) await t.test(method, async () => {
|
|
||||||
const f = fixture({ goods: null });
|
|
||||||
await assert.rejects(f.service[method](method === 'createOrder' ? createInput : { id: 27 }), business('GOODS_NOT_FOUND'));
|
|
||||||
noWrites(f.state);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('missing order is ORDER_NOT_FOUND in details and cancellation', async t => {
|
|
||||||
for (const method of ['detailWithGoods', 'cancelOrder']) await t.test(method, async () => {
|
|
||||||
const f = fixture({ order: null });
|
|
||||||
await assert.rejects(f.service[method]({ id: 27 }), business('ORDER_NOT_FOUND'));
|
|
||||||
assert.deepEqual(f.state.calls, method === 'cancelOrder' ? [['lock',{id:'27'}]] : [['list', { where: { id: '27' }, take: 1 }]]);
|
|
||||||
noWrites(f.state);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('malformed goods status and price remain contract errors, not business warnings', async t => {
|
|
||||||
for (const [label, patch] of [['fractional status', { status: 1.2 }], ['invalid status', { status: 'bad' }],
|
|
||||||
['invalid price', { price: '12.5oops' }], ['nonfinite price', { price: Infinity }]]) {
|
|
||||||
await t.test(label, async () => {
|
|
||||||
const f = fixture(); Object.assign(f.state.goods, patch);
|
|
||||||
await assert.rejects(f.service.createOrder(createInput), contract);
|
|
||||||
noWrites(f.state);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
test('unsafe stored goods IDs remain contract failures before a cross-module call', async t => {
|
|
||||||
for (const id of ['0', '-1', '1.5', '9007199254740992', 'bad']) await t.test(id, async () => {
|
|
||||||
const f = fixture(); f.state.order.goods_id = id;
|
|
||||||
await assert.rejects(f.service.detailWithGoods({ id: 27 }), contract);
|
|
||||||
assert.deepEqual(f.state.calls.map(([name]) => name), ['list']);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('invalid generated order ID or amount stays a contract error after mocked CRUD', async t => {
|
|
||||||
for (const [label, addResult] of [['unsafe order ID', { id: '9007199254740992' }], ['nonfinite amount', { amount: 'NaN' }]]) {
|
|
||||||
await t.test(label, async () => {
|
|
||||||
const f = fixture({ addResult });
|
|
||||||
await assert.rejects(f.service.createOrder(createInput), contract);
|
|
||||||
assert.deepEqual(f.state.calls.map(([name]) => name), ['batchInfo', 'add', 'workflow']);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
test('failure to persist workflow propagates to the enclosing transaction', async () => {
|
|
||||||
const f = fixture();
|
|
||||||
const downstream = new SaasBusinessReject('INSUFFICIENT_STOCK', '库存不足');
|
|
||||||
f.service.workflow.start = async () => { throw downstream; };
|
|
||||||
await assert.rejects(f.service.createOrder(createInput), error => error === downstream);
|
|
||||||
assert.equal(f.state.calls.some(([name]) => name === 'reserveStock'), false);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('list contract and database failures propagate unchanged instead of becoming ORDER_NOT_FOUND', async t => {
|
|
||||||
for (const error of [new ModuleRuntimeError('MODULE_ACTION_OUTPUT_INVALID', 'invalid list output', 500),
|
|
||||||
new ModuleRuntimeError('MODULE_ACTION_FORBIDDEN', 'list access denied', 403), new Error('database unavailable')]) {
|
|
||||||
await t.test(error.message, async () => {
|
|
||||||
const f = fixture();
|
|
||||||
f.service.orders.list = async () => { throw error; };
|
|
||||||
await assert.rejects(f.service.detailWithGoods({ id: 27 }), observed => observed === error && !(observed instanceof SaasBusinessReject));
|
|
||||||
noWrites(f.state);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
test('creation persists pending intent and starts durable workflow without a synchronous stock write', async () => {
|
|
||||||
const f = fixture();
|
|
||||||
assert.deepEqual(await f.service.createOrder(createInput), { id: 27, orderNo: 'UNIT-ORDER', amount: 37.5, status: 'pending_reservation' });
|
|
||||||
assert.deepEqual(f.state.calls.map(([name]) => name), ['batchInfo', 'add', 'workflow']);
|
|
||||||
const flow=f.state.calls[2][1];
|
|
||||||
assert.equal(flow.type,'order.create@1');
|
|
||||||
assert.deepEqual(flow.steps[0].input,{goodsId:24,quantity:3});
|
|
||||||
assert.deepEqual(flow.outcomes.completed,{id:'27',status:'confirmed'});
|
|
||||||
assert.deepEqual(flow.outcomes.failed,{id:'27',status:'rejected'});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('cancellation locks state and persists release workflow; terminal and pending repeats are inert', async () => {
|
|
||||||
const f = fixture();
|
|
||||||
assert.deepEqual(await f.service.cancelOrder({ id: 27 }), { id: 27, status: 'cancel_pending', restoredStock: 0 });
|
|
||||||
assert.deepEqual(f.state.calls.map(([name]) => name), ['lock', 'update', 'workflow']);
|
|
||||||
const repeated = fixture(); repeated.state.order.status = 'cancelled';
|
|
||||||
assert.deepEqual(await repeated.service.cancelOrder({ id: 27 }), { id: 27, status: 'cancelled', restoredStock: 0 });
|
|
||||||
assert.deepEqual(repeated.state.calls.map(([name]) => name), ['lock']);
|
|
||||||
const pending=fixture(); pending.state.order.status='cancel_pending';
|
|
||||||
assert.equal((await pending.service.cancelOrder({id:27})).status,'cancel_pending');
|
|
||||||
assert.deepEqual(pending.state.calls.map(([name])=>name),['lock']);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('legacy or unconfirmed orders cannot manufacture a stock release', async () => {
|
|
||||||
for (const status of ['created','pending_reservation','rejected','manual_review']) {
|
|
||||||
const f=fixture();f.state.order.status=status;
|
|
||||||
await assert.rejects(f.service.cancelOrder({id:27}),business('ORDER_STATE_CONFLICT'));
|
|
||||||
noWrites(f.state);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user