Compare commits

..

38 Commits

Author SHA1 Message Date
sead b661580c60 fix: validate pasted values 2026-05-22 22:10:58 +02:00
sead dc4e07a692 fix: viewLibs now fires only once, libPromise shared between the calls 2026-05-22 21:57:53 +02:00
semantic-release-bot f2313b31f1 chore(release): 7.8.2 [skip ci]
## [7.8.2](https://git.datacontroller.io/dc/dc/compare/v7.8.1...v7.8.2) (2026-05-20)

### Bug Fixes

* bumping ws package ([2382a55](2382a559a5))
* enabling version restore for non admin users ([5d889d8](5d889d824c))
2026-05-20 13:20:34 +00:00
allan f8810ee7e9 Merge pull request 'fix: bumping ws package' (#234) from customerfeedback into main
Release / Build-production-and-ng-test (push) Successful in 3m17s
Release / Build-and-test-development (push) Successful in 8m27s
Release / release (push) Successful in 7m4s
Reviewed-on: #234
2026-05-20 13:05:56 +00:00
allan 8ab4af8397 Merge branch 'main' into customerfeedback
Build / Build-and-ng-test (pull_request) Successful in 3m29s
Build / Build-and-test-development (pull_request) Successful in 8m29s
Lighthouse Checks / lighthouse (pull_request) Successful in 17m59s
2026-05-20 12:45:51 +00:00
4gl 2382a559a5 fix: bumping ws package
Build / Build-and-ng-test (pull_request) Failing after 3m30s
Build / Build-and-test-development (pull_request) Has been skipped
Lighthouse Checks / lighthouse (pull_request) Failing after 3m5s
2026-05-20 13:11:13 +01:00
Unknown 5d889d824c fix: enabling version restore for non admin users
Release / Build-production-and-ng-test (push) Failing after 1m11s
Release / Build-and-test-development (push) Has been skipped
Release / release (push) Has been skipped
2026-05-20 12:38:21 +01:00
semantic-release-bot bed21122ce chore(release): 7.8.1 [skip ci]
## [7.8.1](https://git.datacontroller.io/dc/dc/compare/v7.8.0...v7.8.1) (2026-05-15)

### Bug Fixes

* **sasjs:** enable runAsTask ([f1a26e1](f1a26e132e))
2026-05-15 11:29:08 +00:00
allan ea8cf71101 Merge pull request 'fix(sasjs): enable runAsTask' (#233) from hotfix-sasjs-attributes into main
Release / Build-production-and-ng-test (push) Successful in 3m38s
Release / Build-and-test-development (push) Successful in 8m56s
Release / release (push) Successful in 8m0s
Reviewed-on: #233
2026-05-15 11:13:21 +00:00
sead f1a26e132e fix(sasjs): enable runAsTask
Build / Build-and-ng-test (pull_request) Successful in 3m57s
Build / Build-and-test-development (pull_request) Successful in 9m29s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m28s
2026-05-15 12:53:04 +02:00
semantic-release-bot 1db6984de3 chore(release): 7.8.0 [skip ci]
# [7.8.0](https://git.datacontroller.io/dc/dc/compare/v7.7.3...v7.8.0) (2026-05-15)

### Bug Fixes

* enabling DSN=*ALL* in MPE_SECURITY ([7d94cb2](7d94cb2ae4))
* providing default values for RULE_ACTIVE on MPE_VALIDATIONS ([f031b4e](f031b4eb89))
* switch away from api usage for CASLIB metadata ([ce921a0](ce921a032a))
* use correct debug param for runAsTask ([bb80476](bb80476767))

### Features

* add runAsTask config attribute parser ([1635bc9](1635bc9c45))
* enabling *ALL* option by default in MPE_SECURITY (DSN col) ([93d4ab6](93d4ab65ac))
2026-05-15 09:07:49 +00:00
allan 636ff237dd Merge pull request 'Updates following customer session' (#231) from customerfeedback into main
Release / Build-production-and-ng-test (push) Successful in 3m39s
Release / Build-and-test-development (push) Successful in 8m50s
Release / release (push) Successful in 7m39s
Reviewed-on: #231
2026-05-15 08:52:14 +00:00
sead 02963ab6d5 chore: bump adapter
Build / Build-and-ng-test (pull_request) Successful in 3m49s
Build / Build-and-test-development (pull_request) Successful in 9m2s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m12s
2026-05-15 10:29:54 +02:00
allan d40f61292a Merge pull request 'feat: add runAsTask config attribute parser' (#232) from feat/execution-tasks-flag into customerfeedback
Lighthouse Checks / lighthouse (pull_request) Failing after 3m31s
Build / Build-and-ng-test (pull_request) Failing after 3m51s
Build / Build-and-test-development (pull_request) Has been skipped
Reviewed-on: #232
2026-05-15 08:08:39 +00:00
4gl 7d94cb2ae4 fix: enabling DSN=*ALL* in MPE_SECURITY
Build / Build-and-ng-test (pull_request) Successful in 3m48s
Build / Build-and-test-development (pull_request) Successful in 8m59s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m8s
2026-05-14 22:47:17 +01:00
sead bb80476767 fix: use correct debug param for runAsTask
Lighthouse Checks / lighthouse (pull_request) Failing after 3m28s
Build / Build-and-ng-test (pull_request) Failing after 3m51s
Build / Build-and-test-development (pull_request) Has been skipped
2026-05-14 11:21:01 +02:00
sead 1635bc9c45 feat: add runAsTask config attribute parser 2026-05-14 11:19:32 +02:00
4gl f031b4eb89 fix: providing default values for RULE_ACTIVE on MPE_VALIDATIONS
Lighthouse Checks / lighthouse (pull_request) Successful in 18m12s
Build / Build-and-ng-test (pull_request) Successful in 3m40s
Build / Build-and-test-development (pull_request) Successful in 8m58s
2026-05-13 19:02:09 +01:00
4gl 93d4ab65ac feat: enabling *ALL* option by default in MPE_SECURITY (DSN col)
Build / Build-and-ng-test (pull_request) Successful in 3m53s
Build / Build-and-test-development (pull_request) Successful in 9m12s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m15s
2026-05-13 18:47:19 +01:00
4gl ce921a032a fix: switch away from api usage for CASLIB metadata 2026-05-13 18:46:35 +01:00
semantic-release-bot 322f904b4b chore(release): 7.7.3 [skip ci]
## [7.7.3](https://git.datacontroller.io/dc/dc/compare/v7.7.2...v7.7.3) (2026-05-12)

### Bug Fixes

* move cas session assign to settings.sas and abort when lib is unassigned ([65f0b97](65f0b979a4))
2026-05-12 18:43:04 +00:00
allan 982eeac58c Merge pull request 'fix: move cas session assign to settings.sas and abort when lib is unassigned' (#230) from viyaux into main
Release / Build-production-and-ng-test (push) Successful in 3m49s
Release / Build-and-test-development (push) Successful in 9m10s
Release / release (push) Successful in 8m2s
Reviewed-on: #230
2026-05-12 18:26:47 +00:00
allan 0ab9717556 Merge branch 'main' into viyaux
Build / Build-and-test-development (pull_request) Has been cancelled
Build / Build-and-ng-test (pull_request) Has been cancelled
Lighthouse Checks / lighthouse (pull_request) Successful in 18m27s
2026-05-12 18:26:35 +00:00
allan 24a85de8e1 Merge pull request 'chore(client): bump fast-uri' (#229) from audit-20260511 into main
Release / Build-production-and-ng-test (push) Successful in 3m40s
Release / Build-and-test-development (push) Successful in 8m50s
Release / release (push) Failing after 3m10s
Reviewed-on: #229
2026-05-11 17:38:14 +00:00
4gl 65f0b979a4 fix: move cas session assign to settings.sas and abort when lib is unassigned
Build / Build-and-ng-test (pull_request) Successful in 3m55s
Build / Build-and-test-development (pull_request) Successful in 9m13s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m48s
2026-05-11 15:08:20 +01:00
sead 947f34a0ad chore(client): bump fast-uri
Build / Build-and-ng-test (pull_request) Successful in 3m50s
Build / Build-and-test-development (pull_request) Successful in 9m6s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m19s
Resolve GHSA-q3j6-qgpj-74h6, GHSA-v39h-62p7-jpjc
2026-05-11 09:39:36 +02:00
semantic-release-bot 0f60fd7181 chore(release): 7.7.2 [skip ci]
## [7.7.2](https://git.datacontroller.io/dc/dc/compare/v7.7.1...v7.7.2) (2026-05-07)

### Bug Fixes

* **client:** bundle Metropolis font locally to satisfy CSP ([9546fcd](9546fcd631))
* **client:** clear angular build cache on font strip to avoid stale dist ([503cb08](503cb08b2f))
* **client:** postinstall removal of Metropolis [@font-face](https://git.datacontroller.io/font-face) from @clr/ui ([e6397ce](e6397cecc1))
* **client:** serve text-security-disc font locally ([80ce80e](80ce80ece4))
* **editor:** preserve numeric type for SAS num cols with static SOFTSELECT/HARDSELECT ([05a3289](05a328976e))
2026-05-07 15:18:44 +00:00
allan 251062e42e Merge pull request 'Multiple frontend client issues' (#228) from 227-csp-issues-20260507 into main
Release / Build-production-and-ng-test (push) Successful in 3m38s
Release / Build-and-test-development (push) Successful in 8m50s
Release / release (push) Successful in 7m35s
Reviewed-on: #228
2026-05-07 15:03:08 +00:00
sead 05a328976e fix(editor): preserve numeric type for SAS num cols with static SOFTSELECT/HARDSELECT
Build / Build-and-ng-test (pull_request) Successful in 3m43s
Build / Build-and-test-development (pull_request) Successful in 9m21s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m25s
2026-05-07 15:02:06 +02:00
sead 503cb08b2f fix(client): clear angular build cache on font strip to avoid stale dist 2026-05-07 13:43:57 +02:00
sead f71be20476 build(client): drop duplicate asset emits for fonts and CSS-referenced svgs 2026-05-07 13:43:49 +02:00
sead e6397cecc1 fix(client): postinstall removal of Metropolis @font-face from @clr/ui 2026-05-07 13:43:37 +02:00
sead 80ce80ece4 fix(client): serve text-security-disc font locally 2026-05-07 13:43:21 +02:00
sead 9546fcd631 fix(client): bundle Metropolis font locally to satisfy CSP 2026-05-07 13:43:05 +02:00
semantic-release-bot b79aaf4327 chore(release): 7.7.1 [skip ci]
## [7.7.1](https://git.datacontroller.io/dc/dc/compare/v7.7.0...v7.7.1) (2026-05-05)

### Bug Fixes

* **client:** bump adapter ([d26f7d2](d26f7d2511))
* **sas:** bump cli ([d60029d](d60029deae))
2026-05-05 20:04:33 +00:00
allan 76f9198f73 Merge pull request 'fix(client): bump adapter' (#226) from fix/adapter-20260505 into main
Release / Build-production-and-ng-test (push) Successful in 3m28s
Release / Build-and-test-development (push) Successful in 8m44s
Release / release (push) Successful in 7m33s
Reviewed-on: #226
2026-05-05 19:49:17 +00:00
4gl d60029deae fix(sas): bump cli
Build / Build-and-ng-test (pull_request) Successful in 3m57s
Build / Build-and-test-development (pull_request) Successful in 9m9s
Lighthouse Checks / lighthouse (pull_request) Successful in 18m10s
2026-05-05 18:48:15 +01:00
sead d26f7d2511 fix(client): bump adapter
Build / Build-and-ng-test (pull_request) Successful in 4m21s
Build / Build-and-test-development (pull_request) Successful in 10m34s
Lighthouse Checks / lighthouse (pull_request) Successful in 19m37s
2026-05-05 17:16:55 +02:00
39 changed files with 905 additions and 411 deletions
+57
View File
@@ -1,3 +1,60 @@
## [7.8.2](https://git.datacontroller.io/dc/dc/compare/v7.8.1...v7.8.2) (2026-05-20)
### Bug Fixes
* bumping ws package ([2382a55](https://git.datacontroller.io/dc/dc/commit/2382a559a5ac32b0f815776a90207650d5809ba6))
* enabling version restore for non admin users ([5d889d8](https://git.datacontroller.io/dc/dc/commit/5d889d824cc2f8e4ea089cbb578453125dc4ba6c))
## [7.8.1](https://git.datacontroller.io/dc/dc/compare/v7.8.0...v7.8.1) (2026-05-15)
### Bug Fixes
* **sasjs:** enable runAsTask ([f1a26e1](https://git.datacontroller.io/dc/dc/commit/f1a26e132eba7fa2ac64754940b52ea46c6619b3))
# [7.8.0](https://git.datacontroller.io/dc/dc/compare/v7.7.3...v7.8.0) (2026-05-15)
### Bug Fixes
* enabling DSN=*ALL* in MPE_SECURITY ([7d94cb2](https://git.datacontroller.io/dc/dc/commit/7d94cb2ae4a3f6c1fa1011ae0fced7083a2f2793))
* providing default values for RULE_ACTIVE on MPE_VALIDATIONS ([f031b4e](https://git.datacontroller.io/dc/dc/commit/f031b4eb8925397e60dcc739a721cfbbb6da8dff))
* switch away from api usage for CASLIB metadata ([ce921a0](https://git.datacontroller.io/dc/dc/commit/ce921a032a8970b8078a463a41da884e1fa71bc3))
* use correct debug param for runAsTask ([bb80476](https://git.datacontroller.io/dc/dc/commit/bb8047676749814d3b86eea666726dbe4bf5f270))
### Features
* add runAsTask config attribute parser ([1635bc9](https://git.datacontroller.io/dc/dc/commit/1635bc9c451bc221f386241007f594096f114b4f))
* enabling *ALL* option by default in MPE_SECURITY (DSN col) ([93d4ab6](https://git.datacontroller.io/dc/dc/commit/93d4ab65acce7b5b35e448146f9893964ad2cca3))
## [7.7.3](https://git.datacontroller.io/dc/dc/compare/v7.7.2...v7.7.3) (2026-05-12)
### Bug Fixes
* move cas session assign to settings.sas and abort when lib is unassigned ([65f0b97](https://git.datacontroller.io/dc/dc/commit/65f0b979a401277b3e070d409659ae3fae2ff8c0))
## [7.7.2](https://git.datacontroller.io/dc/dc/compare/v7.7.1...v7.7.2) (2026-05-07)
### Bug Fixes
* **client:** bundle Metropolis font locally to satisfy CSP ([9546fcd](https://git.datacontroller.io/dc/dc/commit/9546fcd6312f3e81f746ef6e32ef398810ed434a))
* **client:** clear angular build cache on font strip to avoid stale dist ([503cb08](https://git.datacontroller.io/dc/dc/commit/503cb08b2fa40397434189f9c20eff3358eb7010))
* **client:** postinstall removal of Metropolis [@font-face](https://git.datacontroller.io/font-face) from @clr/ui ([e6397ce](https://git.datacontroller.io/dc/dc/commit/e6397cecc13afe2a9238bdfb2b4b9b81f38d055c))
* **client:** serve text-security-disc font locally ([80ce80e](https://git.datacontroller.io/dc/dc/commit/80ce80ece40012e59c7cd0340b4aa9a9aca46443))
* **editor:** preserve numeric type for SAS num cols with static SOFTSELECT/HARDSELECT ([05a3289](https://git.datacontroller.io/dc/dc/commit/05a328976ea3d1d6ef7559850369aa580f0d067f))
## [7.7.1](https://git.datacontroller.io/dc/dc/compare/v7.7.0...v7.7.1) (2026-05-05)
### Bug Fixes
* **client:** bump adapter ([d26f7d2](https://git.datacontroller.io/dc/dc/commit/d26f7d2511008634124c7d6fde115abb43db9c43))
* **sas:** bump cli ([d60029d](https://git.datacontroller.io/dc/dc/commit/d60029deae0ec21f3b8570461e2a4ca041d58f72))
# [7.7.0](https://git.datacontroller.io/dc/dc/compare/v7.6.0...v7.7.0) (2026-05-04) # [7.7.0](https://git.datacontroller.io/dc/dc/compare/v7.6.0...v7.7.0) (2026-05-04)
+2 -1
View File
@@ -62,7 +62,8 @@
{ {
"glob": "**/*", "glob": "**/*",
"input": "src/images", "input": "src/images",
"output": "images" "output": "images",
"ignore": ["spinner.svg", "caret.svg"]
} }
], ],
"styles": ["src/styles.scss"], "styles": ["src/styles.scss"],
+12 -12
View File
@@ -21,7 +21,7 @@
"@clr/icons": "^13.0.2", "@clr/icons": "^13.0.2",
"@clr/ui": "file:libraries/clr-ui-17.9.0.tgz", "@clr/ui": "file:libraries/clr-ui-17.9.0.tgz",
"@handsontable/angular-wrapper": "16.0.1", "@handsontable/angular-wrapper": "16.0.1",
"@sasjs/adapter": "^4.16.6", "@sasjs/adapter": "^4.17.0",
"@sasjs/utils": "^3.5.3", "@sasjs/utils": "^3.5.3",
"@sheet/crypto": "file:libraries/sheet-crypto.tgz", "@sheet/crypto": "file:libraries/sheet-crypto.tgz",
"@types/d3-graphviz": "^2.6.7", "@types/d3-graphviz": "^2.6.7",
@@ -7446,13 +7446,13 @@
] ]
}, },
"node_modules/@sasjs/adapter": { "node_modules/@sasjs/adapter": {
"version": "4.16.6", "version": "4.17.0",
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-4.16.6.tgz", "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-4.17.0.tgz",
"integrity": "sha512-46y75g/vMVcx3FIkHoCfKSLo6nb9t2uPsAFimAsNqkzy3ubxka56V0rSHUYAUJcrFMfAp9xt2yHenoJctySRXA==", "integrity": "sha512-m3fj3glI7ppIMm9zIthOVnqtXEtF0BHFyXRzijhCgoVwYaP6vE7Mm3+GDsJBQ+cW3F0rYHovkp5Rmhu7oDTm8g==",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@sasjs/utils": "^3.5.6", "@sasjs/utils": "^3.5.6",
"axios": "1.15.0", "axios": "1.16.0",
"axios-cookiejar-support": "5.0.5", "axios-cookiejar-support": "5.0.5",
"form-data": "4.0.4", "form-data": "4.0.4",
"https": "1.0.0", "https": "1.0.0",
@@ -9541,12 +9541,12 @@
} }
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.15.0", "version": "1.16.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
"integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.11", "follow-redirects": "^1.16.0",
"form-data": "^4.0.5", "form-data": "^4.0.5",
"proxy-from-env": "^2.1.0" "proxy-from-env": "^2.1.0"
} }
@@ -13781,9 +13781,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/fast-uri": { "node_modules/fast-uri": {
"version": "3.1.0", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
+2 -2
View File
@@ -23,7 +23,7 @@
"watch": "ng test watch=true", "watch": "ng test watch=true",
"pree2e": "webdriver-manager update", "pree2e": "webdriver-manager update",
"e2e": "protractor protractor.config.js", "e2e": "protractor protractor.config.js",
"postinstall": "node ./src/version.ts && npm run add-githook", "postinstall": "node ./src/version.ts && npm run add-githook && node ./scripts/strip-clr-base64-fonts.mjs",
"add-githook": "[ -d ../.git ] && git config core.hooksPath ./.git-hooks || true", "add-githook": "[ -d ../.git ] && git config core.hooksPath ./.git-hooks || true",
"cypress": "cypress open", "cypress": "cypress open",
"cy:run": "cypress run", "cy:run": "cypress run",
@@ -51,7 +51,7 @@
"@clr/icons": "^13.0.2", "@clr/icons": "^13.0.2",
"@clr/ui": "file:libraries/clr-ui-17.9.0.tgz", "@clr/ui": "file:libraries/clr-ui-17.9.0.tgz",
"@handsontable/angular-wrapper": "16.0.1", "@handsontable/angular-wrapper": "16.0.1",
"@sasjs/adapter": "^4.16.6", "@sasjs/adapter": "^4.17.0",
"@sasjs/utils": "^3.5.3", "@sasjs/utils": "^3.5.3",
"@sheet/crypto": "file:libraries/sheet-crypto.tgz", "@sheet/crypto": "file:libraries/sheet-crypto.tgz",
"@types/d3-graphviz": "^2.6.7", "@types/d3-graphviz": "^2.6.7",
+59
View File
@@ -0,0 +1,59 @@
import { readFileSync, writeFileSync, statSync, rmSync, existsSync } from 'fs'
import { resolve } from 'path'
/**
* Remove Clarity's Metropolis @font-face blocks from clr-ui.min.css.
*
* Why: Clarity ships Metropolis as base64 data: URLs. The deployed app
* runs under CSP `default-src 'self'` (no data: font-src), so every page
* logs a font-load failure for each weight. Firefox preemptively
* validates every parsed src against CSP even when a later @font-face
* supersedes the rule at render time, so the only way to silence the
* console is to remove the offending blocks from the parsed CSS.
*
* Our styles.scss declares the same family/weight/style with same-origin
* .woff files, so removing Clarity's blocks entirely is safe and leaves
* Metropolis fully functional.
*
* Idempotent: matches by font-family, so works on a fresh install or a
* file that's already been stripped on a previous run.
*/
const target = resolve('node_modules/@clr/ui/clr-ui.min.css')
let css
try {
css = readFileSync(target, 'utf8')
} catch (err) {
if (err.code === 'ENOENT') {
console.log(`skip: ${target} not found (likely pre-install run)`)
process.exit(0)
}
throw err
}
const sizeBefore = statSync(target).size
const blockRe = /@font-face\{[^}]*Metropolis[^}]*\}/g
const matches = css.match(blockRe) ?? []
if (matches.length === 0) {
console.log(`already stripped: ${target}`)
process.exit(0)
}
const stripped = css.replace(blockRe, '')
writeFileSync(target, stripped)
const sizeAfter = Buffer.byteLength(stripped)
console.log(
`removed ${matches.length} Metropolis @font-face block(s) from clr-ui.min.css ` +
`(${sizeBefore} -> ${sizeAfter} bytes, saved ${sizeBefore - sizeAfter})`
)
// Webpack 5's persistent cache treats node_modules as immutable
// (snapshot.module.managedPaths default), so in-place edits don't
// invalidate cached entries. Drop the Angular build cache so the next
// build re-reads our stripped clr-ui.min.css.
const cacheDir = resolve('.angular/cache')
if (existsSync(cacheDir)) {
rmSync(cacheDir, { recursive: true, force: true })
console.log(`cleared ${cacheDir} (webpack persistent cache)`)
}
+1
View File
@@ -209,6 +209,7 @@ export class AppComponent {
dcPath: getAppAttribute('dcPath') || '', dcPath: getAppAttribute('dcPath') || '',
debug: getAppAttribute('debug') === 'true' || false, debug: getAppAttribute('debug') === 'true' || false,
useComputeApi: this.parseComputeApi(getAppAttribute('useComputeApi')), useComputeApi: this.parseComputeApi(getAppAttribute('useComputeApi')),
runAsTask: getAppAttribute('runAsTask') === 'true' || false,
contextName: getAppAttribute('contextName') || '', contextName: getAppAttribute('contextName') || '',
hotLicenceKey: getAppAttribute('hotLicenceKey') || '' hotLicenceKey: getAppAttribute('hotLicenceKey') || ''
} }
@@ -373,7 +373,7 @@ export class AutomaticComponent implements OnInit {
let contextname = `&_contextname=${params.contextName}` let contextname = `&_contextname=${params.contextName}`
let admin = `&admin=${params.admin}` let admin = `&admin=${params.admin}`
let dcPath = `&dcpath=${params.dcPath}` let dcPath = `&dcpath=${params.dcPath}`
let debug = `&_debug=131` let debug = this.sasService.getDebugUrlParam()
let programUrl = let programUrl =
serverUrl + serverUrl +
@@ -251,7 +251,7 @@ export class ManualComponent implements OnInit {
this.selectedAdminGroup + this.selectedAdminGroup +
'&DCPATH=' + '&DCPATH=' +
this.dcPath + this.dcPath +
'&_debug=131' this.sasService.getDebugUrlParam()
window.open(url, '_blank') window.open(url, '_blank')
+15
View File
@@ -2956,6 +2956,21 @@ export class EditorComponent implements OnInit, AfterViewInit, OnDestroy {
} }
}) })
hot.addHook('afterPaste', (_data: any, coords: any) => {
// Trigger dynamic-source load + validation for pasted cells so HARDSELECT_HOOK
// rejects out-of-dropdown values (otherwise paste skips dynamicCellValidation).
const rows = new Set<number>()
for (const range of coords) {
for (let r = range.startRow; r <= range.endRow; r++) {
for (let c = range.startCol; c <= range.endCol; c++) {
this.dynamicCellValidation(r, c)
rows.add(r)
}
}
}
hot.validateRows([...rows])
})
hot.addHook('afterRender', (isForced: boolean) => { hot.addHook('afterRender', (isForced: boolean) => {
this.eventService.dispatchEvent('resize') this.eventService.dispatchEvent('resize')
+13 -3
View File
@@ -155,13 +155,23 @@ export class SasStoreService {
.adapterResponse .adapterResponse
} }
private libsPromise: Promise<any> | null = null
/** /**
* *
* @returns All libraries * @returns All libraries
*/ */
public async viewLibs() { public viewLibs() {
return (await this.sasService.request('public/viewlibs', null)) if (!this.libsPromise) {
.adapterResponse this.libsPromise = this.sasService
.request('public/viewlibs', null)
.then((res: any) => res.adapterResponse)
.catch((err: any) => {
this.libsPromise = null
throw err
})
}
return this.libsPromise
} }
public async refreshLibInfo(libref: string) { public async refreshLibInfo(libref: string) {
+17
View File
@@ -641,6 +641,23 @@ export class SasService {
this.sasjsAdapter.setDebugState(state) this.sasjsAdapter.setDebugState(state)
} }
/**
* Returns the `&_debug=...` URL segment honoring the live adapter
* config. Empty string when debug is off. `128` on the Viya WEB JES path
* with `runAsTask` enabled, `131` otherwise.
*/
public getDebugUrlParam(): string {
const config = this.sasjsAdapter.getSasjsConfig()
if (!config.debug) return ''
const value =
config.serverType === ServerType.SasViya &&
config.useComputeApi === null &&
config.runAsTask === true
? 128
: 131
return `&_debug=${value}`
}
public getSasjsInstance() { public getSasjsInstance() {
return this.sasjsAdapter return this.sasjsAdapter
} }
@@ -284,10 +284,18 @@ export class DcValidator {
) )
if (source.length > 0) { if (source.length > 0) {
// For SAS num cols keep type='numeric' so HOT's numericEditor /
// numericRenderer + numbro coercion stay alive — same per-column
// model as the per-cell pattern in
// editor.component.ts:reSetCellValidationValues().
this.rules[i].source = source this.rules[i].source = source
this.rules[i].type = 'autocomplete'
this.rules[i].editor = 'autocomplete.custom' this.rules[i].editor = 'autocomplete.custom'
this.rules[i].renderer = 'autocomplete'
this.rules[i].filter = false this.rules[i].filter = false
if (this.rules[i].sasType !== 'num') {
this.rules[i].type = 'autocomplete'
}
} }
if (this.hasDqRules(ruleColName, ['SOFTSELECT'])) { if (this.hasDqRules(ruleColName, ['SOFTSELECT'])) {
@@ -10,6 +10,9 @@ export interface DcColumnSettings {
valid?: boolean valid?: boolean
desc?: string desc?: string
clsRule?: string clsRule?: string
// SAS-side column type from $dataFormats (e.g. 'num', 'char') — distinct
// from Handsontable's `type` which drives renderer/editor selection
sasType?: string
} }
export interface DcValidation extends HotColumnSettings, DcColumnSettings {} export interface DcValidation extends HotColumnSettings, DcColumnSettings {}
@@ -38,11 +38,52 @@ describe('DC Validator - merge spec rules', () => {
data: 'test_col', data: 'test_col',
desc: 'test_desc', desc: 'test_desc',
clsRule: 'cls_rule', clsRule: 'cls_rule',
length: 8 length: 8,
sasType: 'test_type'
} }
] ]
expect(mergeColsRules(cols, rules, $dataFormats)).toEqual(expected) expect(mergeColsRules(cols, rules, $dataFormats)).toEqual(expected)
expect(cols[0].TYPE).toEqual('test_type') expect(cols[0].TYPE).toEqual('test_type')
}) })
it('should populate sasType for num and char cols', () => {
const rules: DcValidation[] = [{ data: 'num_col' }, { data: 'char_col' }]
const cols: Col[] = [
{
NAME: 'num_col',
MEMLABEL: '',
DESC: '',
LONGDESC: '',
TYPE: '',
CLS_RULE: '',
VARNUM: 0,
LABEL: '',
FMTNAME: '',
DDTYPE: ''
},
{
NAME: 'char_col',
MEMLABEL: '',
DESC: '',
LONGDESC: '',
TYPE: '',
CLS_RULE: '',
VARNUM: 0,
LABEL: '',
FMTNAME: '',
DDTYPE: ''
}
]
const $dataFormats: any = {
vars: {
num_col: { format: 'best.', label: '', length: '8', type: 'num' },
char_col: { format: '$32.', label: '', length: '32', type: 'char' }
}
}
const merged = mergeColsRules(cols, rules, $dataFormats)
expect(merged.find((r) => r.data === 'num_col')?.sasType).toEqual('num')
expect(merged.find((r) => r.data === 'char_col')?.sasType).toEqual('char')
})
}) })
@@ -29,6 +29,7 @@ export const mergeColsRules = (
if (rule && col.DESC) rule.desc = col.DESC if (rule && col.DESC) rule.desc = col.DESC
if (rule && colFormats.length) rule.length = parseInt(colFormats.length) if (rule && colFormats.length) rule.length = parseInt(colFormats.length)
if (rule && col.CLS_RULE) rule.clsRule = col.CLS_RULE if (rule && col.CLS_RULE) rule.clsRule = col.CLS_RULE
if (rule && colFormats?.type) rule.sasType = colFormats.type
} }
return rules return rules
+16 -24
View File
@@ -769,18 +769,14 @@ export class ViewerComponent
let ds = [] let ds = []
ds = this.libDataset.split('.') ds = this.libDataset.split('.')
if (globals.viewer.startupSet) { await this.sasStoreService
this.libraries = globals.viewer.libraries .viewLibs()
} else { .then((res: any) => {
await this.sasStoreService this.libraries = res.saslibs
.viewLibs() })
.then((res: any) => { .catch((err: any) => {
this.libraries = res.saslibs this.loggerService.error(err)
}) })
.catch((err: any) => {
this.loggerService.error(err)
})
}
this.lib = ds[0] this.lib = ds[0]
@@ -815,18 +811,14 @@ export class ViewerComponent
libDataset = this.libDataset libDataset = this.libDataset
this.libTab = libDataset this.libTab = libDataset
} else { } else {
if (globals.viewer.startupSet) { await this.sasStoreService
this.libraries = globals.viewer.libraries .viewLibs()
} else { .then((res: any) => {
await this.sasStoreService this.libraries = res.saslibs
.viewLibs() })
.then((res: any) => { .catch((err: any) => {
this.libraries = res.saslibs this.loggerService.error(err)
}) })
.catch((err: any) => {
this.loggerService.error(err)
})
}
if (typeof this.table !== 'undefined') { if (typeof this.table !== 'undefined') {
if (globals.viewer.startupSet) { if (globals.viewer.startupSet) {
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -1
View File
@@ -49,7 +49,8 @@
serverType="SASJS" serverType="SASJS"
loginMechanism="Redirected" loginMechanism="Redirected"
debug="false" debug="false"
useComputeApi="true" useComputeApi="null"
runAsTask="true"
contextName="SAS Job Execution compute context" contextName="SAS Job Execution compute context"
adminGroup="SASAdministrators" adminGroup="SASAdministrators"
dcPath="/tmp/dc" dcPath="/tmp/dc"
+31 -1
View File
@@ -9,9 +9,39 @@
@import './colors.scss'; @import './colors.scss';
/* CSP: replace Clarity's base64 Metropolis @font-face srcs with same-origin files. */
@font-face {
font-family: 'Metropolis';
src: url('./assets/fonts/Metropolis-200.woff') format('woff');
font-weight: 200;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Metropolis';
src: url('./assets/fonts/Metropolis-400.woff') format('woff');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Metropolis';
src: url('./assets/fonts/Metropolis-500.woff') format('woff');
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Metropolis';
src: url('./assets/fonts/Metropolis-600.woff') format('woff');
font-weight: 600;
font-style: normal;
font-display: swap;
}
@font-face { @font-face {
font-family: text-security-disc; font-family: text-security-disc;
src: url('https://raw.githubusercontent.com/noppa/text-security/master/dist/text-security-disc.woff'); src: url('./assets/fonts/text-security-disc.woff') format('woff');
} }
// TODO: IMPORTANT CSP WOKRAROUND // TODO: IMPORTANT CSP WOKRAROUND
+305 -268
View File
@@ -1,12 +1,12 @@
{ {
"name": "dcfrontend", "name": "dcfrontend",
"version": "7.6.0", "version": "7.7.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "dcfrontend", "name": "dcfrontend",
"version": "7.6.0", "version": "7.7.2",
"hasInstallScript": true, "hasInstallScript": true,
"devDependencies": { "devDependencies": {
"@saithodev/semantic-release-gitea": "^2.1.0", "@saithodev/semantic-release-gitea": "^2.1.0",
@@ -93,13 +93,6 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@keyv/serialize": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
"integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
"dev": true,
"license": "MIT"
},
"node_modules/@nodable/entities": { "node_modules/@nodable/entities": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz",
@@ -219,6 +212,192 @@
"node": "^10 || ^11 || ^12 || >=14" "node": "^10 || ^11 || ^12 || >=14"
} }
}, },
"node_modules/@saithodev/semantic-release-gitea/node_modules/@sindresorhus/is": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.6.0"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/cacheable-request": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
"integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^4.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^6.0.1",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-response": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/got": {
"version": "11.8.6",
"resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
"integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^4.0.5",
"@types/cacheable-request": "^6.0.1",
"@types/responselike": "^1.0.0",
"cacheable-lookup": "^5.0.3",
"cacheable-request": "^7.0.2",
"decompress-response": "^6.0.0",
"http2-wrapper": "^1.0.0-beta.5.2",
"lowercase-keys": "^2.0.0",
"p-cancelable": "^2.0.0",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=10.19.0"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/http2-wrapper": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0"
},
"engines": {
"node": ">=10.19.0"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@saithodev/semantic-release-gitea/node_modules/responselike": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
"integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
"dev": true,
"license": "MIT",
"dependencies": {
"lowercase-keys": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@sec-ant/readable-stream": { "node_modules/@sec-ant/readable-stream": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
@@ -774,19 +953,6 @@
"url": "https://ko-fi.com/dangreen" "url": "https://ko-fi.com/dangreen"
} }
}, },
"node_modules/@sindresorhus/is": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-8.0.0.tgz",
"integrity": "sha512-YvOsokBE5NsyHuXMnwEVB7lgFk6lX8F4OXCruYVgFII0hUHof0RGUvhMoabVt9hRqbg+qVzayzEG24RCcxcYeA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=22"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@sindresorhus/merge-streams": { "node_modules/@sindresorhus/merge-streams": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
@@ -800,6 +966,32 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"license": "MIT",
"dependencies": {
"defer-to-connect": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@types/cacheable-request": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
"integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/http-cache-semantics": "*",
"@types/keyv": "^3.1.4",
"@types/node": "*",
"@types/responselike": "^1.0.0"
}
},
"node_modules/@types/glob": { "node_modules/@types/glob": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
@@ -818,6 +1010,16 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/keyv": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
"integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/minimatch": { "node_modules/@types/minimatch": {
"version": "5.1.2", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
@@ -849,6 +1051,16 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/responselike": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
"integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/add-stream": { "node_modules/add-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
@@ -965,91 +1177,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/byte-counter": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz",
"integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-lookup": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
"integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.16"
}
},
"node_modules/cacheable-request": {
"version": "13.0.18",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz",
"integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/http-cache-semantics": "^4.0.4",
"get-stream": "^9.0.1",
"http-cache-semantics": "^4.2.0",
"keyv": "^5.5.5",
"mimic-response": "^4.0.0",
"normalize-url": "^8.1.1",
"responselike": "^4.0.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/cacheable-request/node_modules/get-stream": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
"integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sec-ant/readable-stream": "^0.4.1",
"is-stream": "^4.0.1"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-request/node_modules/is-stream": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
"integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-request/node_modules/normalize-url": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz",
"integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/call-bind-apply-helpers": { "node_modules/call-bind-apply-helpers": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -1107,19 +1234,6 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/chunk-data": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/chunk-data/-/chunk-data-0.1.0.tgz",
"integrity": "sha512-zFyPtyC0SZ6Zu79b9sOYtXZcgrsXe0RpePrzRyj52hYVFG1+Rk6rBqjjOEk+GNQwc3PIX+86teQMok970pod1g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clean-stack": { "node_modules/clean-stack": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -1145,6 +1259,29 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/clone-response": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clone-response/node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/color-convert": { "node_modules/color-convert": {
"version": "1.9.3", "version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -1788,22 +1925,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/decompress-response": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz",
"integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-response": "^4.0.0"
},
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/deep-extend": { "node_modules/deep-extend": {
"version": "0.6.0", "version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -1814,6 +1935,16 @@
"node": ">=4.0.0" "node": ">=4.0.0"
} }
}, },
"node_modules/defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/delayed-stream": { "node_modules/delayed-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1982,6 +2113,16 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/env-ci": { "node_modules/env-ci": {
"version": "11.2.0", "version": "11.2.0",
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz",
@@ -2713,33 +2854,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/got": {
"version": "15.0.3",
"resolved": "https://registry.npmjs.org/got/-/got-15.0.3.tgz",
"integrity": "sha512-630of5aMTYM6g6epok5nuqvctP8InJISvt39iNt7y0r27rcGCdiPv9Cc6EbwfnkyT1g/shBoVhvDjtXZUbn/Rw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^8.0.0",
"byte-counter": "^0.1.0",
"cacheable-lookup": "^7.0.0",
"cacheable-request": "^13.0.18",
"chunk-data": "^0.1.0",
"decompress-response": "^10.0.0",
"http2-wrapper": "^2.2.1",
"keyv": "^5.6.0",
"lowercase-keys": "^4.0.1",
"responselike": "^4.0.2",
"type-fest": "^5.6.0",
"uint8array-extras": "^1.5.0"
},
"engines": {
"node": ">=22"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -2851,33 +2965,6 @@
"dev": true, "dev": true,
"license": "BSD-2-Clause" "license": "BSD-2-Clause"
}, },
"node_modules/http2-wrapper": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
"integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.2.0"
},
"engines": {
"node": ">=10.19.0"
}
},
"node_modules/http2-wrapper/node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/human-signals": { "node_modules/human-signals": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -3145,6 +3232,13 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true,
"license": "MIT"
},
"node_modules/json-parse-better-errors": { "node_modules/json-parse-better-errors": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -3196,16 +3290,6 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/keyv": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz",
"integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@keyv/serialize": "^1.1.1"
}
},
"node_modules/kind-of": { "node_modules/kind-of": {
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -3293,19 +3377,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/lowercase-keys": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-4.0.1.tgz",
"integrity": "sha512-wI9Nui/L8VfADa/cr/7NQruaASk1k23/Uh1khQ02BCVYiiy8F4AhOGnQzJy3Fl/c44GnYSbZHv8g7EcG3kJ1Qg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lru-cache": { "node_modules/lru-cache": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -3628,19 +3699,6 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/mimic-response": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
"integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/min-indent": { "node_modules/min-indent": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
@@ -5695,6 +5753,16 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/p-is-promise": { "node_modules/p-is-promise": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
@@ -5940,6 +6008,17 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
"integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/querystring": { "node_modules/querystring": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
@@ -6335,35 +6414,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/responselike": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz",
"integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==",
"dev": true,
"license": "MIT",
"dependencies": {
"lowercase-keys": "^3.0.0"
},
"engines": {
"node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/responselike/node_modules/lowercase-keys": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
"integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/reusify": { "node_modules/reusify": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -6861,19 +6911,6 @@
"node": ">=0.8.0" "node": ">=0.8.0"
} }
}, },
"node_modules/uint8array-extras": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
"integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/undici": { "node_modules/undici": {
"version": "6.25.0", "version": "6.25.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "dcfrontend", "name": "dcfrontend",
"version": "7.7.0", "version": "7.8.2",
"description": "Data Controller", "description": "Data Controller",
"devDependencies": { "devDependencies": {
"@saithodev/semantic-release-gitea": "^2.1.0", "@saithodev/semantic-release-gitea": "^2.1.0",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"fromjs": [ "fromjs": [
{ {
"ADMIN": "DCDEFAULT", "ADMIN": "AllUsers",
"DCPATH": "/tmp/dcdata" "DCPATH": "/tmp/dcdata"
} }
] ]
+21 -27
View File
@@ -6,8 +6,8 @@
"": { "": {
"name": "dc-sas", "name": "dc-sas",
"dependencies": { "dependencies": {
"@sasjs/cli": "4.16.1", "@sasjs/cli": "4.17.4",
"@sasjs/core": "4.65.5" "@sasjs/core": "4.67.1"
} }
}, },
"node_modules/@asamuzakjp/css-color": { "node_modules/@asamuzakjp/css-color": {
@@ -200,13 +200,13 @@
} }
}, },
"node_modules/@sasjs/adapter": { "node_modules/@sasjs/adapter": {
"version": "4.16.6", "version": "4.16.7",
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-4.16.6.tgz", "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-4.16.7.tgz",
"integrity": "sha512-46y75g/vMVcx3FIkHoCfKSLo6nb9t2uPsAFimAsNqkzy3ubxka56V0rSHUYAUJcrFMfAp9xt2yHenoJctySRXA==", "integrity": "sha512-pOKAhOPijr663PFWGx+JEcWaMOGwICMA0w8LeXHPHQwvbHVGPCJKV5QroGqrjTO62HlhsHzow4Vb+DjIui1jgQ==",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@sasjs/utils": "^3.5.6", "@sasjs/utils": "^3.5.6",
"axios": "1.15.0", "axios": "1.16.0",
"axios-cookiejar-support": "5.0.5", "axios-cookiejar-support": "5.0.5",
"form-data": "4.0.4", "form-data": "4.0.4",
"https": "1.0.0", "https": "1.0.0",
@@ -249,13 +249,13 @@
} }
}, },
"node_modules/@sasjs/cli": { "node_modules/@sasjs/cli": {
"version": "4.16.1", "version": "4.17.4",
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-4.16.1.tgz", "resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-4.17.4.tgz",
"integrity": "sha512-9gH5RLC8Il41Td4iyzbcxX4JGO7QVNLwsO9nyelXsH5ghV21n5uzmuay1HkxBuLnAZdMXLd87ptm71NidXqstQ==", "integrity": "sha512-lNkIy6sojgT5mRQ/tkh8lyrIxNhrREw+CTkfEmy+mDiOh9COfGWMoSpBjRn2iqHX+dwOKaUlq6UwU2zHDLOmqQ==",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@sasjs/adapter": "4.16.6", "@sasjs/adapter": "4.16.7",
"@sasjs/core": "4.64.1", "@sasjs/core": "4.67.1",
"@sasjs/lint": "2.4.3", "@sasjs/lint": "2.4.3",
"@sasjs/utils": "3.5.8", "@sasjs/utils": "3.5.8",
"adm-zip": "0.5.10", "adm-zip": "0.5.10",
@@ -279,12 +279,6 @@
"sasjs": "build/index.js" "sasjs": "build/index.js"
} }
}, },
"node_modules/@sasjs/cli/node_modules/@sasjs/core": {
"version": "4.64.1",
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-4.64.1.tgz",
"integrity": "sha512-gdVzSM3+FYvd9XZ26ftLv6yDLndA6L/14nQGLUqjfL/jTPwuhJiojrkaLBAsPDlnRbHSMZSqTF94cKLvS09NBg==",
"license": "MIT"
},
"node_modules/@sasjs/cli/node_modules/@sasjs/utils": { "node_modules/@sasjs/cli/node_modules/@sasjs/utils": {
"version": "3.5.8", "version": "3.5.8",
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.5.8.tgz", "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-3.5.8.tgz",
@@ -321,9 +315,9 @@
} }
}, },
"node_modules/@sasjs/core": { "node_modules/@sasjs/core": {
"version": "4.65.5", "version": "4.67.1",
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-4.65.5.tgz", "resolved": "https://registry.npmjs.org/@sasjs/core/-/core-4.67.1.tgz",
"integrity": "sha512-7oQVOpUN48/Qx7php3NTN0br84Tbm5tnyXRASt/pSJAwgK7C6N2gy7hsyPueOoKRmZ6OU86YxeYopSIoetrnBQ==", "integrity": "sha512-yb4xW8JxsWWY3ZTN4yj/mP8ZasPIHSQVjHESLui3xS0HNatBw96H9ZYGJO3LcrkDx+X5xJz45f6sdHAJYxVeSA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@sasjs/lint": { "node_modules/@sasjs/lint": {
@@ -466,12 +460,12 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.15.0", "version": "1.16.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
"integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.15.11", "follow-redirects": "^1.16.0",
"form-data": "^4.0.5", "form-data": "^4.0.5",
"proxy-from-env": "^2.1.0" "proxy-from-env": "^2.1.0"
} }
@@ -2346,9 +2340,9 @@
} }
}, },
"node_modules/ws": { "node_modules/ws": {
"version": "8.19.0", "version": "8.20.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz",
"integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
+2 -2
View File
@@ -28,7 +28,7 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@sasjs/cli": "4.16.1", "@sasjs/cli": "4.17.4",
"@sasjs/core": "4.65.5" "@sasjs/core": "4.67.1"
} }
} }
+4
View File
@@ -45,6 +45,10 @@
from &dc_libref..mpe_submit from &dc_libref..mpe_submit
where TABLE_ID="&load_ref"; where TABLE_ID="&load_ref";
%local base_lib base_ds;
%let base_lib=%scan(&libds,1,.);
%let base_ds=%scan(&libds,2,.);
/** /**
* check if there is actually a version to restore * check if there is actually a version to restore
*/ */
+36
View File
@@ -0,0 +1,36 @@
/**
@file
@brief Returns the path to the settings file
@details The settings file location differs by platform:
@li SASJS - `<apploc>/services/public/settings.sas`
@li SASMETA - `<apploc>/services/public/Data_Controller_Settings`
@li SASVIYA - `<apploc>/services/settings.sas`
Usage:
%let settingspath=%mpe_getpath2settings();
%put &=settingspath;
<h4> SAS Macros </h4>
@li mf_getapploc.sas
@li mf_getplatform.sas
**/
%macro mpe_getpath2settings();
%local root platform;
%let root=%mf_getapploc();
%let platform=%mf_getplatform();
%if &platform=SASJS %then %do;
&root/services/public/settings
%end;
%else %if &platform=SASMETA %then %do;
&root/services/public/Data_Controller_Settings
%end;
%else %if &platform=SASVIYA %then %do;
&root/services/settings
%end;
%mend mpe_getpath2settings;
+36 -27
View File
@@ -841,16 +841,16 @@ insert into &lib..mpe_selectbox set
,select_lib="&lib" ,select_lib="&lib"
,select_ds="MPE_VALIDATIONS" ,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE" ,base_column="RULE_TYPE"
,selectbox_value="HARDSELECT" ,selectbox_value="NOTNULL"
,selectbox_order=4 ,selectbox_order=4
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk) selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0 ,ver_from_dttm=0
,select_lib="&lib" ,select_lib="&lib"
,select_ds="MPE_VALIDATIONS" ,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE" ,base_column="RULE_TYPE"
,selectbox_value="SOFTSELECT" ,selectbox_value="HARDSELECT"
,selectbox_order=5 ,selectbox_order=5
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
@@ -859,26 +859,53 @@ insert into &lib..mpe_selectbox set
,select_lib="&lib" ,select_lib="&lib"
,select_ds="MPE_VALIDATIONS" ,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE" ,base_column="RULE_TYPE"
,selectbox_value="NOTNULL" ,selectbox_value="HARDSELECT_HOOK"
,selectbox_order=6 ,selectbox_order=6
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0
,select_lib="&lib"
,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE"
,selectbox_value="SOFTSELECT"
,selectbox_order=7
,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk) selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0 ,ver_from_dttm=0
,select_lib="&lib" ,select_lib="&lib"
,select_ds="MPE_SECURITY" ,select_ds="MPE_VALIDATIONS"
,base_column="DSN" ,base_column="RULE_TYPE"
,selectbox_value="SOME_DATASET" ,selectbox_value="SOFTSELECT_HOOK"
,selectbox_order=8
,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0
,select_lib="&lib"
,select_ds="MPE_VALIDATIONS"
,base_column="RULE_ACTIVE"
,selectbox_value="1"
,selectbox_order=1 ,selectbox_order=1
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0
,select_lib="&lib"
,select_ds="MPE_VALIDATIONS"
,base_column="RULE_ACTIVE"
,selectbox_value="0"
,selectbox_order=2
,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk) selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0 ,ver_from_dttm=0
,select_lib="&lib" ,select_lib="&lib"
,select_ds="MPE_SECURITY" ,select_ds="MPE_SECURITY"
,base_column="DSN" ,base_column="DSN"
,selectbox_value="EXAMPLE" ,selectbox_value="*ALL*"
,selectbox_order=2 ,selectbox_order=1
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk) selectbox_rk=%mf_increment(rk)
@@ -943,24 +970,6 @@ insert into &lib..mpe_selectbox set
,selectbox_value='AUDIT' ,selectbox_value='AUDIT'
,selectbox_order=4 ,selectbox_order=4
,ver_to_dttm='31DEC5999:23:59:59'dt; ,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0
,select_lib="&lib"
,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE"
,selectbox_value="HARDSELECT_HOOK"
,selectbox_order=7
,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0
,select_lib="&lib"
,select_ds="MPE_VALIDATIONS"
,base_column="RULE_TYPE"
,selectbox_value="SOFTSELECT_HOOK"
,selectbox_order=7
,ver_to_dttm='31DEC5999:23:59:59'dt;
insert into &lib..mpe_selectbox set insert into &lib..mpe_selectbox set
selectbox_rk=%mf_increment(rk) selectbox_rk=%mf_increment(rk)
,ver_from_dttm=0 ,ver_from_dttm=0
+6 -3
View File
@@ -143,17 +143,17 @@
}, },
{ {
"name": "vtest", "name": "vtest",
"appLoc": "/30.SASApps/app/vtest", "appLoc": "/Users/&sysuserid/dctest",
"serverType": "SASVIYA", "serverType": "SASVIYA",
"serverUrl": "https://sas.4gl.io", "serverUrl": "https://sas.4gl.io",
"contextName": "Datacontroller compute context", "contextName": "Compute Reusable",
"testConfig": { "testConfig": {
"testSetUp": "sasjs/tests/testsetup.sas" "testSetUp": "sasjs/tests/testsetup.sas"
}, },
"serviceConfig": { "serviceConfig": {
"initProgram": "sasjs/utils/serviceinitviya.sas", "initProgram": "sasjs/utils/serviceinitviya.sas",
"serviceFolders": [ "serviceFolders": [
"sasjs/targets/viya/services_viya/usernav", "sasjs/targets/viya/services_viya/viya_users",
"sasjs/targets/viya/services_viya/admin", "sasjs/targets/viya/services_viya/admin",
"sasjs/targets/viya/services_viya/public" "sasjs/targets/viya/services_viya/public"
] ]
@@ -166,6 +166,9 @@
], ],
"deployConfig": { "deployConfig": {
"deployServicePack": true "deployServicePack": true
},
"streamConfig": {
"streamWeb": false
} }
}, },
{ {
@@ -113,6 +113,16 @@ run;
and &dc_dttmtfmt. lt b.tx_to and &dc_dttmtfmt. lt b.tx_to
and b.ACCESS_LEVEL in ('EDIT') and b.ACCESS_LEVEL in ('EDIT')
and b.SAS_GROUP in (select groupname from groups) and b.SAS_GROUP in (select groupname from groups)
union
select distinct a.libref,a.dsn
from &mpelib..mpe_tables a
left join &mpelib..mpe_security b
on a.libref=b.libref
where &dc_dttmtfmt. lt a.tx_to
and &dc_dttmtfmt. lt b.tx_to
and b.ACCESS_LEVEL in ('EDIT')
and b.DSN='*ALL*'
and b.SAS_GROUP in (select groupname from groups)
order by 1; order by 1;
%end; %end;
%mend mstp_mpeditorstartup; %mend mstp_mpeditorstartup;
@@ -1,21 +1,24 @@
/** /**
@file @file
@brief testing gethistory service @brief testing startupservice service
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@li mf_getuniquefileref.sas
@li mp_assertdsobs.sas @li mp_assertdsobs.sas
@li mp_testservice.sas @li mpe_getpath2settings.sas
@li mx_append2pgm.sas
@li mx_testservice.sas
**/ **/
%let _program=&appLoc/services/public/startupservice; %let _program=&appLoc/services/public/startupservice;
%mp_testservice(&_program, %mx_testservice(&_program,
viyacontext=&defaultcontext, mdebug=&sasjs_mdebug,
outlib=webout outlib=webout,
viyacontext=&defaultcontext
) )
data work.globvars; data work.globvars;
set webout.globvars; set webout.globvars;
putlog (_all_)(=); putlog (_all_)(=);
@@ -37,3 +40,91 @@ run;
test=HASOBS, test=HASOBS,
outds=work.test_results outds=work.test_results
) )
/* test mpe_security table */
%let testlib=%upcase(%mf_getuniquefileref());
/* remove the admin group */
filename append temp;
data _null_;
file append;
put '%let dc_admin_group=xxx;';
put " libname &testlib '%sysfunc(pathname(&dc_libref))';";
run;
%let settingspath=%mpe_getpath2settings();
%mx_append2pgm(&settingspath, inref=append)
/* insert single approved table in mpe_security */
data work.append;
set &DC_LIBREF..mpe_security;
LIBREF="&testlib";
DSN='MPE_X_TEST';
ACCESS_LEVEL='EDIT';
SAS_GROUP="&dc_admin_group";
tx_from=0;
tx_to='31DEC9999:23:59:59'dt;
output;
stop;
run;
proc append base=&dc_libref..mpe_security data=work.append;
run;
/* add to MPE_TABLES also */
data work.append2 ;
set &dc_libref..MPE_TABLES;
where libref="&dc_libref" and %sysfunc(datetime()) < tx_to;
libref="&testlib";
tx_from=0;
tx_to='31DEC9999:23:59:59'dt;
run;
proc sort data=work.append2 nodupkey; by libref dsn;run;
proc append base=&dc_libref..mpe_tables data=work.append2;run;
%mx_testservice(&_program,
mdebug=&sasjs_mdebug,
outlib=webout2,
viyacontext=&defaultcontext
)
data work.sasdatasets2;
set webout2.sasdatasets;
putlog (_all_)(=);
if libref="&testlib";
run;
%mp_assertdsobs(work.sasdatasets2,
desc=Only 1 table shown,
test=EQUALS 1
)
/* now try all tables */
data work.append3;
set &DC_LIBREF..mpe_security;
where libref="&testlib" and SAS_GROUP="&dc_admin_group";
DSN='*ALL*';
run;
proc append base=&dc_libref..mpe_security data=work.append3;
run;
%mx_testservice(&_program,
mdebug=&sasjs_mdebug,
outlib=webout3,
viyacontext=&defaultcontext
)
data work.sasdatasets3;
set webout3.sasdatasets;
putlog (_all_)(=);
if libref="&testlib";
run;
%mp_assertdsobs(work.sasdatasets3,
desc=Only 1 table shown,
test=ATLEAST 10
)
/* revert the admin group back */
filename appback temp;
data _null_;
file appback;
put '%let dc_admin_group=' "&dc_admin_group;";
run;
%mx_append2pgm(&settingspath, inref=appback)
@@ -2,16 +2,24 @@
@file @file
@brief Loads a CAS table into memory @brief Loads a CAS table into memory
@details There are three versions of this macro, one per build @details There are three versions of this macro, one per build
target. The interface is the same. This version is VIYA and target. The interface is the same. The macro loads the source table
delegates to mv_castabload to ensure the named table is promoted to memory (if not loaded) and promotes it.
and available in memory before use.
Note that we cannot collect metadata from the APIs (like in
mv_castabload) because the server info may be inacessible to
the logged in user
Running SAS code under a system account (like proc util) DOES
work, so we just make the assumption that the source file and
library matches the libds.
@param [in] libds library.dataset of the CAS table to load @param [in] libds library.dataset of the CAS table to load
@param [in] mdebug= (0) Set to 1 to enable verbose logging @param [in] mdebug= (0) Set to 1 to enable verbose logging
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@li mf_getengine.sas @li mf_getengine.sas
@li mv_castabload.sas @li mfv_getcaslib.sas
@li mp_abort.sas
@author 4GL Apps Ltd @author 4GL Apps Ltd
@copyright 4GL Apps Ltd. This code may only be used within Data @copyright 4GL Apps Ltd. This code may only be used within Data
@@ -20,11 +28,56 @@
**/ **/
%macro dc_casload(libds, mdebug=0); %macro dc_casload(libds, mdebug=0);
%if %mf_getengine(&libds)=CAS %then %do; %local lib eng caslib ds _exists;
%mv_castabload(
lib=%scan(&libds,1,.), %mp_abort(
table=%scan(&libds,2,.), iftrue=(&syscc ne 0),
mdebug=&mdebug msg=%str(syscc=&syscc on macro entry)
) )
%let lib=%scan(&libds,1,.);
%let eng=%mf_getengine(&lib);
%mp_abort(iftrue= (X&eng.X=XX)
,mac=&_program
,msg=%str(Library &lib is not assigned)
)
%if &eng ne CAS %then %return;
%let caslib=%mfv_getcaslib(lib=&lib);
%let ds=%scan(&libds,2,.);
%if &mdebug=1 %then %put _local_;
/* ---- existence check ------------------------------------------------- */
proc cas;
table.tableExists result=r /
caslib="&caslib"
name="&ds";
%if &mdebug=1 %then %do;
print r;
%end;
if r.exists > 0 then call symputx('_exists', '1', 'L');
else call symputx('_exists', '0', 'L');
quit;
/* ---- already loaded: skip -------------------------------------------- */
%if &_exists=1 %then %do;
%put NOTE: Table &caslib..&ds already loaded - skipping;
%return;
%end; %end;
proc casutil;
load casdata="&ds"
incaslib="&caslib"
casout="&ds"
outcaslib="&caslib"
promote;
quit;
%mp_abort(
iftrue=(&syscc ne 0),
msg=%str(Load failed for &caslib..&ds)
)
%put NOTE: Table &caslib..&ds loaded and promoted;
%mend dc_casload; %mend dc_casload;
@@ -3,15 +3,21 @@
@brief Saves an in-memory CAS table back to persistent storage @brief Saves an in-memory CAS table back to persistent storage
@details There are three versions of this macro, one per build @details There are three versions of this macro, one per build
target. The interface is the same. This version is VIYA and target. The interface is the same. This version is VIYA and
delegates to mv_castabsave to save the named table back to its saves the named table back to its original source file.
original source file. Note that we cannot collect metadata from the APIs (like in
mv_castabsave) because the server info may be inacessible to
the logged in user
Running SAS code under a system account (like proc util) DOES
work, so we just make the assumption that the source file and
library matches the libds.
@param [in] libds library.dataset of the CAS table to save @param [in] libds library.dataset of the CAS table to save
@param [in] mdebug= (0) Set to 1 to enable verbose logging @param [in] mdebug= (0) Set to 1 to enable verbose logging
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@li mf_getengine.sas @li mf_getengine.sas
@li mv_castabsave.sas @li mfv_getcaslib.sas
@author 4GL Apps Ltd @author 4GL Apps Ltd
@copyright 4GL Apps Ltd. This code may only be used within Data @copyright 4GL Apps Ltd. This code may only be used within Data
@@ -20,11 +26,25 @@
**/ **/
%macro dc_cassave(libds, mdebug=0); %macro dc_cassave(libds, mdebug=0);
%if %mf_getengine(&libds)=CAS %then %do; %local lib eng caslib ds;
%mv_castabsave( %let lib=%scan(&libds,1,.);
lib=%scan(&libds,1,.), %let eng=%mf_getengine(&lib);
table=%scan(&libds,2,.),
mdebug=&mdebug %if &eng ne CAS %then %return;
)
%end; %let caslib=%mfv_getcaslib(lib=&lib);
%let ds=%scan(&libds,2,.);
%if &mdebug=1 %then %put _local_;
/* ---- save to disk -------------------------------------------------- */
proc casutil;
save casdata="&ds"
incaslib="&caslib"
casout="&ds"
outcaslib="&caslib"
replace;
quit;
%put NOTE: Table &caslib..&ds saved;
%mend dc_cassave; %mend dc_cassave;
@@ -124,6 +124,9 @@ data _null_;
put '/* This physical location is used for staging data and audit history */'; put '/* This physical location is used for staging data and audit history */';
put '%let dc_staging_area=' "&dcpath/dc_staging;"; put '%let dc_staging_area=' "&dcpath/dc_staging;";
put ' '; put ' ';
put 'cas dcsession sessopts=(caslib=casuser);';
put 'caslib _all_ assign;';
put ' ';
if &syssite in (70221618,70253615) then do; if &syssite in (70221618,70253615) then do;
put "libname dcdemo '&dcpath/dc_demo';"; put "libname dcdemo '&dcpath/dc_demo';";
end; end;
+4
View File
@@ -60,6 +60,10 @@ run;
%let testloc=%sysfunc(pathname(&DC_LIBREF))/fmt%mf_getuniquefileref(); %let testloc=%sysfunc(pathname(&DC_LIBREF))/fmt%mf_getuniquefileref();
%mf_mkdir(&testloc) %mf_mkdir(&testloc)
libname dctest "&testloc"; libname dctest "&testloc";
data dctest.mpe_x_test;
set &DC_LIBREF..mpe_x_test;
run;
/* test library with only one format catalog */ /* test library with only one format catalog */
%mf_mkdir(&testloc/fmtonly) %mf_mkdir(&testloc/fmtonly)
libname fmtonly "&testloc/fmtonly"; libname fmtonly "&testloc/fmtonly";
-6
View File
@@ -12,12 +12,6 @@
options noquotelenmax ps=max; options noquotelenmax ps=max;
cas dcsession sessopts=(caslib=casuser);
caslib _all_ assign;
libname casuser cas caslib=casuser;
/*caslib casmusic path='/opt/sas/viya/cascache/tracks' libref=casmusic ;*/ /*caslib casmusic path='/opt/sas/viya/cascache/tracks' libref=casmusic ;*/
%let syscc=0; %let syscc=0;