-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
05c5eb6
commit 7ea99bb
Showing
5 changed files
with
182 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"packId": 34513 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
import * as coda from "@codahq/packs-sdk"; | ||
import JSON5 from "json5"; | ||
|
||
const OneDaySecs = 24 * 60 * 60; | ||
|
||
export const pack = coda.newPack(); | ||
|
||
const JSON5Param = coda.makeParameter({ | ||
type: coda.ParameterType.String, | ||
name: "json5", | ||
description: "The JSON5 contents as a string.", | ||
}); | ||
|
||
const SpacesParam = coda.makeParameter({ | ||
type: coda.ParameterType.Number, | ||
name: "spaces", | ||
description: "The number of spaces to indent by. Default: no indenting.", | ||
optional: true, | ||
}); | ||
|
||
pack.addFormula({ | ||
name: "FormatJSON5", | ||
description: "Formats JSON5 content using the options provided.", | ||
parameters: [ | ||
JSON5Param, | ||
SpacesParam, | ||
coda.makeParameter({ | ||
type: coda.ParameterType.String, | ||
name: "quote", | ||
description: "Which quote to use around strings. Default: single quote (').", | ||
optional: true, | ||
autocomplete: [ | ||
{ display: `Single quote (')`, value: `'` }, | ||
{ display: `Double quote (")`, value: `"` }, | ||
], | ||
}), | ||
], | ||
resultType: coda.ValueType.String, | ||
cacheTtlSecs: OneDaySecs, | ||
examples: [ | ||
{ params: [`{a: 1, b: "foo"}`], result: `{a:1,b:'foo'}` }, | ||
{ | ||
params: [`{a: 1, b: "foo"}`, 2], | ||
result: trimIndent(` | ||
{ | ||
a: 1, | ||
b: 'foo', | ||
} | ||
`), | ||
}, | ||
{ params: [`{a: 1, b: "foo"}`, 0, '"'], result: `{a:1,b:"foo"}` }, | ||
], | ||
execute: async function (args, context) { | ||
let [json5, space, quote] = args; | ||
let value = parse(json5); | ||
return JSON5.stringify(value, {space, quote}); | ||
}, | ||
}); | ||
|
||
pack.addFormula({ | ||
name: "IsValidJSON5", | ||
description: "Returns true if the content is valid JSON5, false otherwise.", | ||
parameters: [ | ||
JSON5Param, | ||
], | ||
resultType: coda.ValueType.Boolean, | ||
cacheTtlSecs: OneDaySecs, | ||
examples: [ | ||
{ params: [`{a: 1}`], result: true }, | ||
{ params: [`{a: 1`, ], result: false }, | ||
], | ||
execute: async function (args, context) { | ||
let [json5] = args; | ||
try { | ||
JSON5.parse(json5); | ||
} catch (e) { | ||
if (e.toString().startsWith("SyntaxError")) { | ||
return false; | ||
} | ||
throw e; | ||
} | ||
return true; | ||
}, | ||
}); | ||
|
||
pack.addFormula({ | ||
name: "ToJSON", | ||
description: "Converts a JSON5 string to JSON.", | ||
parameters: [ | ||
JSON5Param, | ||
SpacesParam, | ||
], | ||
resultType: coda.ValueType.String, | ||
cacheTtlSecs: OneDaySecs, | ||
examples: [ | ||
{ params: [`{a: 1, b:'foo'}`], result: `{"a":1,"b":"foo"}` }, | ||
{ | ||
params: [`{a:1,b:'foo'}`, 2], | ||
result: trimIndent(` | ||
{ | ||
"a": 1, | ||
"b": "foo" | ||
} | ||
`) | ||
}, | ||
], | ||
execute: async function (args, context) { | ||
let [json5, spaces] = args; | ||
let value = parse(json5); | ||
return JSON.stringify(value, null, spaces); | ||
}, | ||
}); | ||
|
||
function parse(json5: string) { | ||
try { | ||
return JSON5.parse(json5); | ||
} catch (e) { | ||
if (e.toString().startsWith("SyntaxError")) { | ||
throw new coda.UserVisibleError(e); | ||
} | ||
throw e; | ||
} | ||
} | ||
|
||
function trimIndent(str: string) { | ||
let lines = str.split("\n"); | ||
if (lines[0] == "") { | ||
lines = lines.slice(1); | ||
} | ||
if (lines.at(-1) == "") { | ||
lines = lines.slice(0, -1); | ||
} | ||
let indent = lines[0].match(/^\s*/)[0].length; | ||
return lines.map(line => line.substring(indent)).join("\n").trim(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
import {executeFormulaFromPackDef} from '@codahq/packs-sdk/dist/development'; | ||
import {pack} from '../pack'; | ||
import * as chai from "chai"; | ||
import {assert} from "chai"; | ||
import {describe} from "mocha"; | ||
import {it} from "mocha"; | ||
import chaiAsPromised from "chai-as-promised"; | ||
chai.use(chaiAsPromised); | ||
chai.should(); | ||
|
||
describe("Examples", () => { | ||
for (let formula of pack.formulas) { | ||
describe(formula.name, () => { | ||
for (let [i, example] of formula.examples.entries()) { | ||
it(`Example ${i}`, async () => { | ||
const result = await executeFormulaFromPackDef(pack, formula.name, example.params as any); | ||
if (typeof example.result == "object") { | ||
assert.deepEqual(result, example.result); | ||
} else { | ||
assert.equal(result, example.result); | ||
} | ||
}); | ||
} | ||
}); | ||
} | ||
}); |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters