Push current progress so I can work on my laptop.
This commit is contained in:
parent
94767772b4
commit
657c95a4c1
16
package.json
Normal file
16
package.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "@terrace/repo",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"build:repo": "node ./repo/build.js",
|
||||||
|
"build": "turbo run build --cache-dir=.turbo",
|
||||||
|
"dev": "turbo run dev --no-cache --force",
|
||||||
|
"test": "turbo run test --no-cache --force"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@terrace/core": "workspace:*",
|
||||||
|
"turbo": "^1.7.3",
|
||||||
|
"jest": "^29.4.1"
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
|
#ifndef TERRACE_PARSER_H
|
||||||
|
#define TERRACE_PARSER_H
|
||||||
|
|
||||||
struct terrace_linedata_s {
|
struct terrace_linedata_s {
|
||||||
char type;
|
|
||||||
unsigned int level;
|
unsigned int level;
|
||||||
unsigned int offsetHead;
|
unsigned int offsetHead;
|
||||||
unsigned int offsetTail;
|
unsigned int offsetTail;
|
||||||
@ -8,30 +10,19 @@ struct terrace_linedata_s {
|
|||||||
typedef struct terrace_linedata_s terrace_linedata_t;
|
typedef struct terrace_linedata_s terrace_linedata_t;
|
||||||
|
|
||||||
void terrace_parse_line(char* line, terrace_linedata_t *lineData) {
|
void terrace_parse_line(char* line, terrace_linedata_t *lineData) {
|
||||||
char type = 0;
|
|
||||||
unsigned int level = 0;
|
|
||||||
unsigned int offsetTail = 0;
|
|
||||||
|
|
||||||
if (line[0] == '\n') {
|
if (line[0] == '\n') {
|
||||||
if (lineData->type == 1) level++;
|
// Reuse lineData->level from previous line.
|
||||||
if (lineData->type == 0) level = lineData->level;
|
|
||||||
|
|
||||||
lineData->type = type;
|
|
||||||
lineData->level = level;
|
|
||||||
lineData->offsetHead = 0;
|
lineData->offsetHead = 0;
|
||||||
lineData->offsetTail = 0;
|
lineData->offsetTail = 0;
|
||||||
} else {
|
} else {
|
||||||
type = 1;
|
unsigned int level = 0;
|
||||||
while (line[level] == ' ' && level <= lineData->level + 1) ++level;
|
while (line[level] == ' ' && level <= lineData->level + 1) ++level;
|
||||||
lineData->type = type;
|
|
||||||
lineData->level = level;
|
lineData->level = level;
|
||||||
lineData->offsetHead = level;
|
lineData->offsetHead = level;
|
||||||
lineData->offsetTail = level;
|
lineData->offsetTail = level;
|
||||||
|
|
||||||
while (line[lineData->offsetTail] != '\0' && line[lineData->offsetTail] != ' ') ++lineData->offsetTail;
|
while (line[lineData->offsetTail] != '\0' && line[lineData->offsetTail] != ' ') ++lineData->offsetTail;
|
||||||
}
|
}
|
||||||
|
|
||||||
lineData->type = type;
|
|
||||||
lineData->level = level;
|
|
||||||
lineData->offsetHead = level;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2022 Joshua Michael Bemenderfer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
@ -1,34 +0,0 @@
|
|||||||
import {unified} from 'unified'
|
|
||||||
import remarkParse from 'remark-parse'
|
|
||||||
import remarkRehype from 'remark-rehype'
|
|
||||||
import rehypeStringify from 'rehype-stringify'
|
|
||||||
|
|
||||||
export default function (config) {
|
|
||||||
|
|
||||||
return async function ({ lineData, ended, next }) {
|
|
||||||
if (ended) return ''
|
|
||||||
const blockLevel = lineData.level
|
|
||||||
|
|
||||||
let md = ''
|
|
||||||
|
|
||||||
function finalize() {
|
|
||||||
return unified()
|
|
||||||
.use(remarkParse)
|
|
||||||
.use(remarkRehype)
|
|
||||||
.use(rehypeStringify)
|
|
||||||
.process(md)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function markdownContents({ line, lineData, ended }) {
|
|
||||||
if (ended || lineData.level <= blockLevel) {
|
|
||||||
const final = String(await finalize())
|
|
||||||
return final
|
|
||||||
}
|
|
||||||
|
|
||||||
md += line.slice(blockLevel + 1) + '\n'
|
|
||||||
return markdownContents(await next())
|
|
||||||
}
|
|
||||||
|
|
||||||
return markdownContents(await next())
|
|
||||||
}
|
|
||||||
}
|
|
2812
packages/js/block-markdown/package-lock.json
generated
2812
packages/js/block-markdown/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@terrace/block-markdown",
|
|
||||||
"type": "module",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"main": "./index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "vitest"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"vitest": "^0.24.5"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"rehype-stringify": "^9.0.3",
|
|
||||||
"remark-parse": "^10.0.1",
|
|
||||||
"remark-rehype": "^10.1.0",
|
|
||||||
"unified": "^10.1.2"
|
|
||||||
}
|
|
||||||
}
|
|
2
packages/js/core/dist/document.cjs
vendored
2
packages/js/core/dist/document.cjs
vendored
@ -1 +1 @@
|
|||||||
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./parser.cjs");function f(r,c=" "){const e=i.createLineData("",c);let n=!1;async function o(t=-1){if(n)n=!1;else{const a=await r.next();if(a===null)return!1;e.line=a,i.parseLine(e)}return l()<=t?(n=!0,!1):!0}const l=()=>e.level,u=(t=e.offsetHead)=>e.line.slice(t),s=()=>e.line.slice(e.offsetHead,e.offsetTail);return{next:o,level:l,line:u,head:s,tail:()=>e.line.slice(e.offsetTail),match:t=>t===s()}}exports.useDocument=f;
|
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("./parser.cjs");function f(r,c=" "){const e=i.createLineData("",c);let n=!1;async function o(t=-1){if(n)n=!1;else{const a=await r();if(a==null)return!1;e.line=a,i.parseLine(e)}return l()<=t?(n=!0,!1):!0}const l=()=>e.level,u=(t=e.offsetHead)=>e.line.slice(t),s=()=>e.line.slice(e.offsetHead,e.offsetTail);return{next:o,level:l,line:u,head:s,tail:()=>e.line.slice(e.offsetTail),match:t=>t===s()}}exports.useDocument=f;
|
||||||
|
4
packages/js/core/dist/document.js
vendored
4
packages/js/core/dist/document.js
vendored
@ -6,8 +6,8 @@ function h(s, f = " ") {
|
|||||||
if (n)
|
if (n)
|
||||||
n = !1;
|
n = !1;
|
||||||
else {
|
else {
|
||||||
const i = await s.next();
|
const i = await s();
|
||||||
if (i === null)
|
if (i == null)
|
||||||
return !1;
|
return !1;
|
||||||
e.line = i, r(e);
|
e.line = i, r(e);
|
||||||
}
|
}
|
||||||
|
2
packages/js/core/dist/parser.cjs
vendored
2
packages/js/core/dist/parser.cjs
vendored
@ -1 +1 @@
|
|||||||
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function t(e="",r=" "){return{line:e,indent:r,level:0,offsetHead:0,offsetTail:0}}function f(e){if(typeof e!="object"||!e||typeof e.level!="number")throw new Error("'lineData' must be an object with 'line' string, and 'type' and 'level' integer properties");if(typeof e.indent!="string"||e.indent.length===0||e.indent.length>1)throw new Error("'lineData.indent' must be a single-character string");if(typeof e.line!="string")throw new Error("'lineData.line' must be a string");let r=0;if(!e.line.length)e.level=e.level,e.offsetHead=0,e.offsetTail=0;else{for(;e.line[r]===e.indent&&r<=e.level+1;)++r;for(e.level=r,e.offsetHead=r,e.offsetTail=r;e.line[e.offsetTail]&&e.line[e.offsetTail]!==" ";)++e.offsetTail}return e}exports.createLineData=t;exports.parseLine=f;
|
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function t(e="",r=" "){return{line:e,indent:r,level:0,offsetHead:0,offsetTail:0}}function f(e){if(typeof e!="object"||!e||typeof e.level!="number")throw new Error("'lineData' must be an object with string line and numeric level properties");if(typeof e.indent!="string"||e.indent.length===0||e.indent.length>1)throw new Error("'lineData.indent' must be a single-character string");if(typeof e.line!="string")throw new Error("'lineData.line' must be a string");let r=0;if(!e.line.length)e.level=e.level,e.offsetHead=0,e.offsetTail=0;else{for(;e.line[r]===e.indent&&r<=e.level+1;)++r;for(e.level=r,e.offsetHead=r,e.offsetTail=r;e.line[e.offsetTail]&&e.line[e.offsetTail]!==" ";)++e.offsetTail}return e}exports.createLineData=t;exports.parseLine=f;
|
||||||
|
6
packages/js/core/dist/parser.js
vendored
6
packages/js/core/dist/parser.js
vendored
@ -1,9 +1,9 @@
|
|||||||
function f(e = "", r = " ") {
|
function f(e = "", r = " ") {
|
||||||
return { line: e, indent: r, level: 0, offsetHead: 0, offsetTail: 0 };
|
return { line: e, indent: r, level: 0, offsetHead: 0, offsetTail: 0 };
|
||||||
}
|
}
|
||||||
function t(e) {
|
function o(e) {
|
||||||
if (typeof e != "object" || !e || typeof e.level != "number")
|
if (typeof e != "object" || !e || typeof e.level != "number")
|
||||||
throw new Error("'lineData' must be an object with 'line' string, and 'type' and 'level' integer properties");
|
throw new Error("'lineData' must be an object with string line and numeric level properties");
|
||||||
if (typeof e.indent != "string" || e.indent.length === 0 || e.indent.length > 1)
|
if (typeof e.indent != "string" || e.indent.length === 0 || e.indent.length > 1)
|
||||||
throw new Error("'lineData.indent' must be a single-character string");
|
throw new Error("'lineData.indent' must be a single-character string");
|
||||||
if (typeof e.line != "string")
|
if (typeof e.line != "string")
|
||||||
@ -21,5 +21,5 @@ function t(e) {
|
|||||||
}
|
}
|
||||||
export {
|
export {
|
||||||
f as createLineData,
|
f as createLineData,
|
||||||
t as parseLine
|
o as parseLine
|
||||||
};
|
};
|
||||||
|
4
packages/js/core/dist/readers/js-string.cjs
vendored
4
packages/js/core/dist/readers/js-string.cjs
vendored
@ -1,2 +1,2 @@
|
|||||||
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function i(r,n=0){const t=Array.isArray(r)?r:r.split(`
|
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});function n(r,e=0){const t=Array.isArray(r)?r:r.split(`
|
||||||
`),e={index:n-1,next:()=>(e.index++,e.index>=t.length?null:t[e.index]),clone:l=>i(r,l==null?n:e.index)};return e}exports.createStringReader=i;
|
`);return e--,()=>(e++,e>=t.length?null:t[e])}exports.createStringReader=n;
|
||||||
|
14
packages/js/core/dist/readers/js-string.js
vendored
14
packages/js/core/dist/readers/js-string.js
vendored
@ -1,12 +1,8 @@
|
|||||||
function l(e, r = 0) {
|
function e(t, r = 0) {
|
||||||
const t = Array.isArray(e) ? e : e.split(`
|
const n = Array.isArray(t) ? t : t.split(`
|
||||||
`), n = {
|
`);
|
||||||
index: r - 1,
|
return r--, () => (r++, r >= n.length ? null : n[r]);
|
||||||
next: () => (n.index++, n.index >= t.length ? null : t[n.index]),
|
|
||||||
clone: (i) => l(e, i == null ? r : n.index)
|
|
||||||
};
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
export {
|
export {
|
||||||
l as createStringReader
|
e as createStringReader
|
||||||
};
|
};
|
||||||
|
@ -1 +1 @@
|
|||||||
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e={};function r(t){const a=e.createInterface({input:e.createReadStream(t,"utf-8")})[Symbol.asyncIterator]();return async()=>(await a.next()).value}exports.createReadlineReader=r;
|
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("node:fs"),n=require("node:readline/promises"),t=e=>e&&typeof e=="object"&&"default"in e?e:{default:e},o=t(r),u=t(n);function d(e){const a=u.default.createInterface({input:o.default.createReadStream(e,"utf-8")})[Symbol.asyncIterator]();return async()=>(await a.next()).value}exports.createReadlineReader=d;
|
||||||
|
13
packages/js/core/dist/readers/node-readline.js
vendored
13
packages/js/core/dist/readers/node-readline.js
vendored
@ -1,10 +1,11 @@
|
|||||||
const e = {};
|
import r from "node:fs";
|
||||||
function n(t) {
|
import a from "node:readline/promises";
|
||||||
const a = e.createInterface({
|
function c(e) {
|
||||||
input: e.createReadStream(t, "utf-8")
|
const t = a.createInterface({
|
||||||
|
input: r.createReadStream(e, "utf-8")
|
||||||
})[Symbol.asyncIterator]();
|
})[Symbol.asyncIterator]();
|
||||||
return async () => (await a.next()).value;
|
return async () => (await t.next()).value;
|
||||||
}
|
}
|
||||||
export {
|
export {
|
||||||
n as createReadlineReader
|
c as createReadlineReader
|
||||||
};
|
};
|
||||||
|
@ -20,9 +20,9 @@ export function useDocument (reader: Reader, indent: string = ' '): Document {
|
|||||||
if (repeat) repeat = false
|
if (repeat) repeat = false
|
||||||
// Otherwise parse the line normally.
|
// Otherwise parse the line normally.
|
||||||
else {
|
else {
|
||||||
const line = await reader.next()
|
const line = await reader()
|
||||||
// If there are no more lines, bail out.
|
// If there are no more lines, bail out.
|
||||||
if (line === null) return false
|
if (line == null) return false
|
||||||
|
|
||||||
lineData.line = line
|
lineData.line = line
|
||||||
parseLine(lineData)
|
parseLine(lineData)
|
||||||
|
@ -3,15 +3,11 @@ import type { Reader } from './reader'
|
|||||||
export function createStringReader(doc: string|string[], index = 0): Reader {
|
export function createStringReader(doc: string|string[], index = 0): Reader {
|
||||||
const lines = Array.isArray(doc) ? doc : doc.split('\n')
|
const lines = Array.isArray(doc) ? doc : doc.split('\n')
|
||||||
|
|
||||||
const reader = {
|
index--;
|
||||||
index: index - 1,
|
|
||||||
next: () => {
|
|
||||||
reader.index++
|
|
||||||
if (reader.index >= lines.length) return null
|
|
||||||
return lines[reader.index]
|
|
||||||
},
|
|
||||||
clone: (startIndex?: number) => createStringReader(doc, startIndex == null ? index : reader.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
return reader
|
return () => {
|
||||||
|
index++
|
||||||
|
if (index >= lines.length) return null
|
||||||
|
return lines[index]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import readline from 'node:readline/promises'
|
import readline from 'node:readline/promises'
|
||||||
|
import type { Reader } from './reader'
|
||||||
|
|
||||||
export function createReadlineReader(path: string): () => Promise<string|null> {
|
export function createReadlineReader(path: string): Reader {
|
||||||
const it = readline.createInterface({
|
const it = readline.createInterface({
|
||||||
input: fs.createReadStream(path, 'utf-8'),
|
input: fs.createReadStream(path, 'utf-8'),
|
||||||
})[Symbol.asyncIterator]()
|
})[Symbol.asyncIterator]()
|
||||||
|
@ -1,5 +1 @@
|
|||||||
export type Reader = {
|
export type Reader = () => string|null|Promise<string|null>
|
||||||
index: number,
|
|
||||||
next: () => string|null|Promise<string|null>,
|
|
||||||
clone: (startIndex?: number) => Reader
|
|
||||||
}
|
|
||||||
|
@ -12,6 +12,12 @@ export default defineConfig({
|
|||||||
'readers/js-string': 'src/readers/js-string.ts',
|
'readers/js-string': 'src/readers/js-string.ts',
|
||||||
'readers/node-readline': 'src/readers/node-readline.ts',
|
'readers/node-readline': 'src/readers/node-readline.ts',
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
rollupOptions: {
|
||||||
|
external: [
|
||||||
|
`node:fs`,
|
||||||
|
`node:readline/promises`
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
2662
pnpm-lock.yaml
generated
2662
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,4 @@
|
|||||||
packages:
|
packages:
|
||||||
|
- "./test"
|
||||||
- "./packages/js/*"
|
- "./packages/js/*"
|
||||||
- "./experiments/*"
|
- "./experiments/*"
|
||||||
|
69
repo/build.js
Normal file
69
repo/build.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import fs from 'node:fs/promises'
|
||||||
|
import { useDocument } from '@terrace/core'
|
||||||
|
import { createReadlineReader } from '@terrace/core/readers/node-readline'
|
||||||
|
|
||||||
|
function useHelpers({ next, level, head, tail }) {
|
||||||
|
|
||||||
|
async function kvObject(handleValue) {
|
||||||
|
const object = {}
|
||||||
|
const rootLevel = level()
|
||||||
|
while (await next(rootLevel)) {
|
||||||
|
if (!head()) continue
|
||||||
|
object[head()] = handleValue ? await handleValue(level()) : tail().trim()
|
||||||
|
}
|
||||||
|
return object
|
||||||
|
}
|
||||||
|
|
||||||
|
return { kvObject }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buildPackage() {
|
||||||
|
const { next, level, head, tail, match } = useDocument(createReadlineReader('./repo/package.tce'))
|
||||||
|
const { kvObject } = useHelpers({ next, level, head, tail })
|
||||||
|
|
||||||
|
const pkg = {}
|
||||||
|
|
||||||
|
while (await next()) {
|
||||||
|
if (match('name')) pkg.name = tail().trim()
|
||||||
|
if (match('version')) pkg.version = tail().trim()
|
||||||
|
if (match('license')) pkg.license = tail().trim()
|
||||||
|
if (match('type')) pkg.type = tail().trim()
|
||||||
|
if (match('private')) pkg.private = tail().trim() === 'true'
|
||||||
|
|
||||||
|
if (match('scripts')) pkg.scripts = await kvObject()
|
||||||
|
if (match('devDependencies')) pkg.devDependencies = await kvObject()
|
||||||
|
}
|
||||||
|
|
||||||
|
await fs.writeFile('./package.json', JSON.stringify(pkg, null, ' '))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function buildTurbo() {
|
||||||
|
const { next, level, head, tail, match } = useDocument(createReadlineReader('./repo/turbo.tce'))
|
||||||
|
const { kvObject } = useHelpers({ next, level, head, tail })
|
||||||
|
|
||||||
|
const turbo = {}
|
||||||
|
|
||||||
|
while (await next()) {
|
||||||
|
if (match('#schema')) turbo['$schema'] = tail().trim()
|
||||||
|
if (match('pipeline')) turbo.pipeline = await (async () => {
|
||||||
|
const pipeline = {}
|
||||||
|
const rootLevel = level()
|
||||||
|
while (await next(rootLevel)) {
|
||||||
|
if (!head()) continue
|
||||||
|
|
||||||
|
const entry = pipeline[head()] = {}
|
||||||
|
const pipelineLevel = level()
|
||||||
|
while(await next(pipelineLevel)) {
|
||||||
|
if (match('dependsOn')) entry.dependsOn = tail().trim().split(' ')
|
||||||
|
if (match('outputs')) entry.outputs = tail().trim().split(' ')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pipeline
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
|
await fs.writeFile('./turbo.json', JSON.stringify(turbo, null, ' '))
|
||||||
|
}
|
||||||
|
|
||||||
|
buildPackage()
|
||||||
|
buildTurbo()
|
16
repo/package.tce
Normal file
16
repo/package.tce
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#schema package
|
||||||
|
|
||||||
|
name @terrace/repo
|
||||||
|
private true
|
||||||
|
type module
|
||||||
|
|
||||||
|
scripts
|
||||||
|
build:repo node ./repo/build.js
|
||||||
|
build turbo run build --cache-dir=.turbo
|
||||||
|
dev turbo run dev --no-cache --force
|
||||||
|
test turbo run test --no-cache --force
|
||||||
|
|
||||||
|
devDependencies
|
||||||
|
@terrace/core workspace:*
|
||||||
|
turbo ^1.7.3
|
||||||
|
jest ^29.4.1
|
12
repo/turbo.tce
Normal file
12
repo/turbo.tce
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#schema https://turbo.build/schema.json
|
||||||
|
|
||||||
|
pipeline
|
||||||
|
compile
|
||||||
|
dev
|
||||||
|
|
||||||
|
build
|
||||||
|
dependsOn ^build compile
|
||||||
|
outputs dist/**
|
||||||
|
|
||||||
|
test
|
||||||
|
dependsOn build
|
7
test/basic.test.tce
Normal file
7
test/basic.test.tce
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#schema test
|
||||||
|
|
||||||
|
input
|
||||||
|
key value
|
||||||
|
|
||||||
|
output
|
||||||
|
level: 0 | head: key | tail: value | line: key value
|
10
test/package.json
Normal file
10
test/package.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"name": "@terrace/test",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@terrace/core": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
36
test/test-runner.test.js
Normal file
36
test/test-runner.test.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { expect } from 'chai'
|
||||||
|
import fs from 'node:fs/promises'
|
||||||
|
import { useDocument } from '@terrace/core'
|
||||||
|
import { createReadlineReader } from '@terrace/core/readers/node-readline'
|
||||||
|
|
||||||
|
async function loadTest(path) {
|
||||||
|
const { next, level, head, tail, line, match } = useDocument(createReadlineReader(path))
|
||||||
|
|
||||||
|
const test = { input: [], output: [] }
|
||||||
|
|
||||||
|
while (await next()) {
|
||||||
|
if (match('input')) {
|
||||||
|
const rootLevel = level()
|
||||||
|
while (await next(rootLevel)) {
|
||||||
|
test.input.push(line(rootLevel))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (match('output')) {
|
||||||
|
const rootLevel = level()
|
||||||
|
while (await next(rootLevel)) {
|
||||||
|
test.input.push(line(rootLevel))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { input: test.input.join('\n'), output: test.output.join('\n') }
|
||||||
|
}
|
||||||
|
|
||||||
|
it('Runs a basic test', async () => {
|
||||||
|
const { input, output } = await loadTest('./basic.test.tce', 'utf-8')
|
||||||
|
|
||||||
|
console.log(input)
|
||||||
|
|
||||||
|
expect(1).to.equal(1)
|
||||||
|
})
|
21
turbo.json
Normal file
21
turbo.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://turbo.build/schema.json",
|
||||||
|
"pipeline": {
|
||||||
|
"compile": {},
|
||||||
|
"dev": {},
|
||||||
|
"build": {
|
||||||
|
"dependsOn": [
|
||||||
|
"^build",
|
||||||
|
"compile"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
"dist/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"dependsOn": [
|
||||||
|
"build"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user